CasperJS waitForSelector不会向步骤数组

时间:2016-10-25 03:34:06

标签: javascript promise phantomjs casperjs

这就是我的代码的样子:

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_whilewaitFor不兼容。

1 个答案:

答案 0 :(得分:0)

经过一段时间的研究后,我发现问题出现在step.then函数的do_while修改中。 do_whilewaitFor函数不兼容。

解决方法(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中提供了完整的代码。