我刚刚开始使用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”



答案 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.error
,page.error
,remote.message
和casper.page.onResourceTimeout
。 Example
关于你的特殊功能。 this
在reportErrors
的回调中没有意义。您需要绑定另一个对象:
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();
});
});