捕获由CasperJS/PantomJS中的evaluate()引起的错误



我想知道为什么下面的代码没有通过使用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浏览器的上下文中执行代码,那么上面的代码不应该捕捉到由它引起的任何错误吗?

resource.error的文档说明了一切:

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

这与页面错误无关。事实上,casper.evaluate()和PhantomJS等效的page.evaluate()并不会为了与页面交互而向页面发送请求。它们都被烘焙到同一个引擎中。唯一的限制是evaluate()是沙盒的。它不能访问外部定义的变量,所以必须显式地传入和传出它们。

您想要的是"page.error"事件:

当检索到的页面未捕获时发出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();

它输出:

错误:TypeError:null不是对象(正在计算"null.pop")

相关内容

最新更新