2012-08-08 29 views
30

Tại sao khi tôi sử dụng console.log trong evaluate, nó hoạt động:console.log không hoạt động trong CasperJS' đánh giá với setTimeout

casper.then(function() { 
    this.evaluate(function() { 
    console.log('hello'); 
    }); 
}); 

Nhưng điều này không làm việc:

casper.then(function() { 
    this.evaluate(function() { 
    setTimeout(function() {console.log('hello');}, 1000); 
    }); 
}); 
+0

liên quan: [Output client-side console với casper/phantomjs] (http://stackoverflow.com/a/10783675/1816580) –

Trả lời

71

Bởi vì bạn đang trộn các casperj và môi trường trang từ xa. Hàm evaluate sẽ thực thi mã trong trang từ xa env, do đó cuộc gọi console.log sẽ không xuất ra bất kỳ thứ gì.

Nếu bạn muốn bắt xaconsole.log cuộc gọi, nghe sự kiện remote.message:

casper.on('remote.message', function(msg) { 
    this.echo('remote message caught: ' + msg); 
}) 

Btw, documentation for events là khá nhiều đầy đủ, cũng như the one for evaluate.

+1

các '' 'setTimeout''' là sự khác biệt giữa các ví dụ của OP. '' 'SetTimeout''' thay đổi điều này như thế nào? chúng đều được thực hiện trong môi trường từ xa. –

+0

@nikkwong Vì OP không chỉ định ý nghĩa của từ * "nó hoạt động" * và * "không hoạt động" *, chúng tôi chỉ có thể đoán được. Tôi nghĩ rằng họ đã không nhận thấy rằng họ đang thoát ra khỏi dòng chảy kiểm soát của CasperJS và do đó quên cũng chờ đợi trong dòng chảy kiểm soát 'casper'. Họ có thể đã đi quá sớm. Tôi nghi ngờ rằng chúng tôi có thể nhận được để dưới cùng của điều này mặc dù các hoạt động của OP. –

+0

FYI - liên kết bị hỏng – evolutionxbox

20

@ Câu trả lời của NiKo là rất quan trọng.

Tôi cũng khuyên bạn nên thêm thông tin sau, vì nếu có lỗi, bạn thậm chí có thể không làm cho nó đủ xa để in ra một bảng điều khiển console.log(), và thay vào đó kết thúc bằng sự im lặng.

casper.on('page.error', function (msg, trace) { 
    this.echo('Error: ' + msg, 'ERROR'); 
}); 
10

CasperJS bao gồm ClientUtils, có thể được sử dụng từ các trang từ xa để dễ dàng đăng nhập vào giao diện điều khiển của kịch bản casper:

__utils__.echo('This message is logged from the remote page to the CasperJS console'); 
5

Xây dựng về câu trả lời @ odigity, điều này làm cho casperjs chết với một nhiều quen thuộc lỗi/stacktrace:

var util = require('util'); 

casper.on('page.error', function exitWithError(msg, stack) { 
    stack = stack.reduce(function (accum, frame) { 
     return accum + util.format('\tat %s (%s:%d)\n', 
      frame.function || '<anonymous>', 
      frame.file, 
      frame.line 
     ); 
    }, ''); 
    this.die(['Client-side error', msg, stack].join('\n'), 1); 
}); 
+1

Tuyệt vời! Tôi cũng đang tìm kiếm một thứ như thế này hôm nay. Tuy nhiên, mô-đun tiện ích có phải là 'utils' không? – Qcom

+0

@Qcom, tôi nghĩ 'utils' sẽ ổn, vì nó là [_'sprintf' equivalent_] (http://casperjs.readthedocs.org/en/latest/modules/utils.html#format). Nơi tôi đã sử dụng nó, chúng tôi đã có ['util'] (https://www.npmjs.com/package/util) có sẵn, vì vậy tôi chỉ cần sử dụng :) – c24w

+0

Thú vị, bạn đang sử dụng casper kết hợp với nút thông qua SpookyJS hoặc tương đương? Để casper kiến ​​thức của tôi không tích hợp với hệ sinh thái mô-đun nút theo mặc định. – Qcom

Các vấn đề liên quan