我用PhantomJS运行CasperJS。我将它转到URL并单击基于XPath的元素。这可能会发生几次没有问题,直到我怀疑页面加载有延迟,它无法找到XPath,它会抛出错误并停止测试。我希望它继续通过错误。我不想等待+点击任何超过我已经存在的时间,因为有很多点击进行,并且错误可以是随机点击,等待每次点击都会产生效果。
我已经尝试将整个测试放入尝试捕获,它不会被捕获。
我能找到的唯一处理只是提供了有关错误的更多信息,仍然停止了测试。
答案 0 :(得分:1)
我会等待你想要运行的选择器,暂停时间很短。在成功函数中,单击,在超时函数中报告问题(或根本不执行任何操作)。
例如:
casper.waitForSelector('a.some-class', function() {
this.click('a.some-class');
}, function onTimeout(){
this.echo("No a.some-class found, skipping it.");
},
100); //Only wait 0.1s, as we expect it to already be there
});
(如果你之前已经在做casper.wait()
,那么用上面的代码替换它,并相应地增加超时。)
答案 1 :(得分:1)
您无法捕获异步执行的错误。所有then*
和wait*
函数都是异步的步进函数。
Darren Cook提供good reliable solution。这里有两个可能对你有用。
casper.options.exitOnError
CasperJS为disable exiting on error提供了一个选项。它工作可靠。 stacktrace的完整错误将打印在控制台中,但脚本继续执行。但是,当您还有其他可能需要停止执行的错误时,这可能会产生不利影响。
使用try-catch块在CasperJS中工作,但仅适用于同步代码。以下代码显示了一个示例,其中只打印了没有stacktrace的错误消息:
casper.then(function() {
try {
this.click(selector);
} catch(e){
console.log("Caught", e);
}
});
或更多集成:
// at the beginning of the script
casper.errorClick = function(selector) {
try {
this.click(selector);
} catch(e){
console.log("Caught", e);
return false;
}
return true;
};
// in the test
casper.then(function() {
this.errorClick("someSelector");
});