当我使用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();
不幸的是,它对我不起作用。
答案 0 :(得分:0)
试试这个
return this.currentHTTPStatus === 200;
我测试了最新版本的casperjs 1.1.1,它工作正常