CasperJS中的无提示错误

时间:2016-02-25 17:28:54

标签: javascript phantomjs casperjs

我刚刚开始使用CasperJs,我在调试时遇到了困难,因为很多编码错误似乎导致脚本退出而没有提供错误消息。当你使用详细模式时,你会收到你应该起来的消息,直到有问题的代码行,然后它就会退出。





例如,如果我执行代码:




  var casper = require('casper')。create({
 verbose:true,
 logLevel:“debug “
});

 casper.start('https://www.google.com/#q=stackoverflow',function(){

} );
 casper.wait(2000,function(){
});


 casper.then(function(){
 hrefAr = this .evaluate(getLinks);
 this.log(hrefAr.length +'links found','info');
 this.exit();
});
& #xA; casper.run(function(){
 this.exit();
});

 function getLinks(){
 var links = document.querySelectorAll('a');
 return Array.prototype.map.call(links,function(e){
 return e.getAttribute('href');
});
}
  




我得到以下结果:




  ...一堆信息&调试消息,然后是...
 [info] [幻影]步骤4/4 https://www.google.com/search?q=stackoverflow&cad=h(HTTP 200)
 [信息] [幻影]找到89个链接
 [debug] [幻影]导航请求:url = about:空白,类型=其他,锁定= true,isMainFrame = true
 [debug] [幻影]网址更改为“ about:blank“
  




如果我将一个日志语句添加到函数getLinks ...


&# xA;
  ...代码如上所示...
 function getLinks(){
 this.log('getLinks ran','info');
 var links = document.querySelectorAll('a');
 ...代码如上所示...
  




。 ..这导致脚本失败,如下所示:




  ...相同的信息&调试消息...
 [info] [幻影]步骤4/4 https://www.google.com/search?q=stackoverflow&cad=h(HTTP 200)
 ... NO LOGS,ECHOS或结果过去这一点,只有这两个结束声明...
 [debug] [幻影]导航请求:url = about:blank,type = Other,lock = true,isMainFrame = true&#xA ; [debug] [phantom] url更改为“about:blank”
  




它不会告诉您出现任何问题,它只是让你回到空白并结束执行。





有没有办法获得更好的错误报告?或者任何错误报告?








当我尝试使用以下代码实现下面的解决方法时:

&# xA;

  var casper = require('casper')。create({
 verbose:true,
 logLevel:“debug”
});& #xA;
 casper.start('https://www.google.com/#q=stackoverflow',function(){

});
 casper.wait (2000,function(){
});


 casper.then(function(){
 reportErrors(function(){
 hrefAr = this.evaluate(getLinks);
 this.log(hrefAr.length +'links found','info');
 this.exit();
});
 }&;

 casper.run(function(){
 this.exit();
});

 function getLinks(){& #xA;
 //this.log('getLinks ran','info');
 var links = document.querySelectorAll('a');
 return Array.prototype.map.call(links,function(e){
 return e.getAttribute('href');
});

}
 
功能报告错误(f){
 var ret = null;
试试{
 ret = f();
 } catch(e){
 casper.echo(“ERROR:”+ e);
 casper.exit();
 }
返回ret;
}
  




我得到......




  ... info&调试上面显示的消息...
 [info] [phantom]步骤4/4 https://www.google.com/search?q=stackoverflow&cad=h(HTTP 200)
错误: TypeError:undefined不是构造函数(评估'this.evaluate(getLinks)')
  - 这就是我的链接计数报告的位置
 [debug] [phantom]导航请求:url = about:blank ,type = Other,lock = true,isMainFrame = true
 [debug] [phantom] url更改为“about:blank”
  



2 个答案:

答案 0 :(得分:3)

此处有一个开放的PhantomJS issue

你可以通过包装每个then&类似于reportErrors函数,例如:

function reportErrors(f) {
  var ret = null;
  try {
    ret = f();
  } catch (e) {
    casper.echo("ERROR: " + e);
    casper.exit();
  }
  return ret;
}

casper.then(function() {
  reportErrors(function() {
    ...
  });
});

答案 1 :(得分:2)

在修复PhantomJS 2.x中的错误之前,您可以尝试以下几种方法:

  • 使用PhantomJS 1.9.8。底层QtWebKit引擎到目前为止已有5年多了,但它在大多数情况下仍能正常运行。如果存在SSL / TLS问题,您可以添加--ignore-ssl-errors=true等命令行选项。 CasperJS支持通过将PHANTOMJS_EXECUTABLE环境变量设置为您要使用的可执行文件或可执行文件路径,根据需要更改当前终端会话的PhantomJS版本。例如,在Windows上:set PHANTOMJS_EXECUTABLE=phantomjs198(我将它们编号并在PATH中)。

  • 如果是语法错误,你会担心,然后首先对你的代码运行一个linter。我可以推荐eslint和jshint。

  • 使用其他事件来检测错误(使用PhantomJS 1.9.8):resource.errorpage.errorremote.messagecasper.page.onResourceTimeoutExample

关于你的特殊功能。 thisreportErrors的回调中没有意义。您需要绑定另一个对象:

casper.reportErrors = function (f) {
  var ret = null;
  try {
    ret = f.call(this);
  } catch (e) {
    this.echo("ERROR: " + e);
    this.exit();
  }
  return ret;
}

然后您可以像以前一样使用它:

casper.then(function() {
    this.reportErrors(function() {
        hrefAr = this.evaluate(getLinks);
        this.log(hrefAr.length + ' links found', 'info');
        this.exit();
    });
});