在CasperJS / PhantomJS中由evaluate()引起的捕获错误?

时间:2015-06-23 15:26:22

标签: javascript phantomjs casperjs

我想知道为什么下面的代码没有通过使用evaluate()方法执行的javascript代码在控制台中输出错误输出。

casper.on 'resource.error', ->
    @echo 'Resource error: ' + "Error code: "+resourceError.errorCode+" ErrorString: "+resourceError.errorString+" url: "+resourceError.url+" id: "+resourceError.id, "ERROR"

由于evaluate()在Web浏览器的上下文中执行代码,不应该由上面的代码捕获由它引起的任何错误吗?

1 个答案:

答案 0 :(得分:4)

documentation to 'resource.error'说明了一切:

  

当任何请求的资源无法正确加载时发出。收到的resourceError对象具有以下属性

它与页面错误无关。实际上,casper.evaluate()和PhantomJS等效page.evaluate()不会向页面发送请求以与其进行交互。它全部被烘焙到同一个引擎中。唯一的限制是evaluate()是沙箱。它无法访问外部定义的变量,因此您必须明确地将它们传入和传出。

你想要的是"page.error" event

  

检索到的页面发出Javascript错误未发送时发出

以下面的完整脚本为例:

var casper = require('casper').create();

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

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

casper.on("resource.error", function(msg, trace) {
    this.echo("Res.Error: " + msg);
});

casper.start("http://example.com",function(){
    this.evaluate(function(){
        null.pop();
    });
});

casper.run();

输出:

Error: TypeError: null is not an object (evaluating 'null.pop')