CasperJS:WaitFor超时函数进行重新滚动?

时间:2016-04-17 06:13:23

标签: javascript web-scraping phantomjs casperjs

当我使用CasperJS刮网站时遇到了一些问题。该网站像Twitter一样动态加载,所以我想做无限滚动, 并感谢@Artjom B.我找到了你的代码。

var tryAndScroll = function (casper) {
    try {
        casper.echo('SCROLL!!');
        casper.scrollToBottom();

        if (casper.exists('div.loading')) {
            var curItems = casper.evaluate(getCurrentInfosNum);
            casper.echo(curItems);
            casper.waitFor(function check() {
                return curItems != casper.evaluate(getCurrentInfosNum);
            }, function then() {
                casper.wait(800);
                tryAndScroll(casper);
            }, function onTimeout() {
                casper.emit('scroll.timeout',curItems);
            }, 15000);
        } else {
            casper.echo("No more items");
            return true;
        }
    } catch (err) {
        casper.echo(err);
    }
} //casper.tryAndScroll

现在,我想在调用超时函数时继续滚动很多次,所以我创建了自己的事件监听器'scroll.timeout'。

var SRCOLL_NUM = 0;
var PreOfLoaded = 0;
casper.on('scroll.timeout', function (NumOfLoaded) {
    if (SRCOLL_NUM <= 4) {
        if (PreOfLoaded == NumOfLoaded)
            SRCOLL_NUM++;
        this.echo("Scroll Timeout,reScroll");
        PreOfLoaded = NumOfLoaded;
        tryAndScroll(casper);
    } else {
        this.echo("Scroll Timeout,reScroll times maximum");
        SRCOLL_NUM = 0;
        PreOfLoaded = 0;
    }
});

但是,当滚动超时发生时,它会在控制台上打印Scroll Timeout,reScroll。然后它跳过tryAndScroll()并转到main函数的下一步。我想在多次重试滚动后继续下一步。我该怎么办?

我发现CasperJS作者说明了:Automatic retry when open fails

var casper = require('casper').create();

casper.tryOpen = function(url, then) {
return this.then(function() {
    this.open(url);
    this.waitFor(function testStatus() {
        return this.getCurrentHTTPStatus === 200;
    }, then, function onFail() {
        console.log('failed, retrying');
        this.tryOpen(url);
    }, 2000);
});
};

casper.start().tryOpen('http://failing.url.com/foo.bar', function() {
this.echo('wow, it worked, wtf');
}).run();

不幸的是,它对我不起作用。

1 个答案:

答案 0 :(得分:0)

试试这个

return this.currentHTTPStatus === 200; 

我测试了最新版本的casperjs 1.1.1,它工作正常