这就是我的代码的样子:
var firstFrameLoadingTime = 3000;
firstFrameLoadingWaiter(function() {
casper.echo("callback");
});
function firstFrameLoadingWaiter(callback) {
casper.waitForSelector('div',
function suc() {
casper.echo('success!');
},
function timeout() {
casper.echo('failure!');
},
firstFrameLoadingTime);
}
问题是永远不会调用suc
函数。我的意思是它没有被添加到CasperJS步骤的数组中。
这是日志的一部分:
[18] => [info] [phantom] Step _step 5/5 https://... (HTTP 200)
[19] => [info] [phantom] Step _step 5/5: done in 3392ms.
[20] => [info] [phantom] waitFor() finished in 40ms.
[21] => [info] [phantom] Done 5 steps in 3451ms
如果在超时之前未在页面上找到选择器,则脚本就像魅力一样。
UPD 即可。事实证明问题出在do_while
和waitFor
不兼容。
答案 0 :(得分:0)
经过一段时间的研究后,我发现问题出现在step.then
函数的do_while修改中。 do_while
与waitFor
函数不兼容。
解决方法(pull request)虽然不是最清晰,但很简单。 我刚刚以一种特殊的方式命名了这个函数,并添加了一个小支票:
var isWaitSuccessFun = step.name.indexOf('successThen') != -1;
if( isWaitSuccessFun || !this.steps[this.current].executed ) {
要使waitFor
工作,请确保成功函数名称包含successThen
,例如:
casper.waitFor(
function check(){
// check if page is ready
},
function successThen(){
// execute after page is ready
},
function(){
// time out happened before page got ready
},
timeOutTime
);
这也使waitForSelector
与基于waitFor
的其他类似功能一样有效。
我的forked repository中提供了完整的代码。