【问题标题】:Catch errors caused by evaluate() in CasperJS / PhantomJS?在 CasperJS / PhantomJS 中捕获由 evaluate() 引起的错误?
【发布时间】:2015-06-24 00:02:22
【问题描述】:

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

【问题讨论】:

  • 好吧,我不确定“资源”到底是什么意思。 :/ 资源是由服务器发送和返回的,而页面是在浏览器上发生的吗?如果是这种情况,有没有办法在 casperjs 中捕获 page.error?

标签: javascript phantomjs casperjs


【解决方案1】:

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();

它输出:

错误:TypeError:null 不是对象(评估“null.pop”)

【讨论】:

  • 如果我想抛出一个错误,我该怎么做?我试过 throw new Error(msg) 和 throw new CasperError(msg),但它们似乎什么也没做。
  • 很奇怪。 echo 工作正常,但是当我抛出错误时,我在控制台日志中什么也看不到。抛出错误退出 casper 对吗?
  • 一个未捕获的错误会停止脚本,但不会退出它(我认为)。页面上或 evaluate() 内部未捕获的错误不会停止或退出 CasperJS 脚本。
  • 嗯,但是通过在 casper.on('page.error') 中抛出错误,它应该停止在评估()中未捕获的错误?我只是很困惑为什么它什么也没做。
  • 如果你想停止脚本,那么你应该在控制台打印一些错误并调用casper.exit(1)或其他一些退出代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2013-10-27
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
相关资源
最近更新 更多