Javascript 卡斯珀斯';从无限滚动填充完整页面时,scrollToBottom不工作
我不知道为什么scrollToBottom()不起作用。如果当前数据(来自evaluate)大于以前的数据,我希望继续滚动到页面底部 幻影JS 2.0.0Javascript 卡斯珀斯';从无限滚动填充完整页面时,scrollToBottom不工作,javascript,casperjs,infinite-scroll,Javascript,Casperjs,Infinite Scroll,我不知道为什么scrollToBottom()不起作用。如果当前数据(来自evaluate)大于以前的数据,我希望继续滚动到页面底部 幻影JS 2.0.0 CasperJS 1.1.0-beta3 var casper = require('casper').create({ verbose: true, logLevel: 'info', pageSettings: { loadImages: false, loadPlugins: fa
CasperJS 1.1.0-beta3
var casper = require('casper').create({
verbose: true,
logLevel: 'info',
pageSettings: {
loadImages: false,
loadPlugins: false,
userAgent: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36'
}
});
casper.options.waitTimeout = 60000;
var utils = require('utils');
var hospitals = [];
var prevTotalHospitals = 0;
var currentTotalHospitals = 0;
casper.start('https://www.docdoc.com/').thenClick("#form-submit-btn").then(function() {
this.wait(5000);
this.scrollToBottom();
processPage();
});
casper.on("remote.message", function(msg){
this.echo("remote> " + msg);
});
casper.on('step.error', function(err) {
this.die("Step has failed: " + err);
})
casper.on("page.error", function(msg, trace) {
this.echo("Error: " + msg, "ERROR");
});
casper.on('complete.error', function(err) {
this.die("Complete callback has failed: " + err);
});
casper.run(function(){
utils.dump(hospitals);
});
function getCurrentTotalHospitals(){
var resultsNodeList = document.querySelectorAll("div.results-list div.result");
return resultsNodeList.length;
}
function getDetails(){
var details = [];
var resultsNodeList = document.querySelectorAll("div.results-list div.result");
console.log("resultsNodeList.length " + resultsNodeList.length);
for (var i = 0; i < resultsNodeList.length; i++) {
var detail = {
"name" : resultsNodeList[i].querySelector("h2.link").textContent.replace(/\n/g, ''),
"country" : resultsNodeList[i].querySelector("h3.country").textContent.replace(/\n/g, ''),
"specialities" : resultsNodeList[i].querySelector("div.specialities").textContent.replace(/\n/g, ''),
"language" : resultsNodeList[i].querySelector("div.language").textContent.replace(/\n/g, '')
};
details.push(detail);
};
return JSON.stringify(details);
}
function stopScript() {
utils.dump(hospitals);
console.log("Exiting..." + hospitals.length);
casper.exit();
};
function processPage() {
currentTotalHospitals = casper.evaluate(getCurrentTotalHospitals);
console.log(currentTotalHospitals + " <> " + prevTotalHospitals);
if (currentTotalHospitals > prevTotalHospitals) {
prevTotalHospitals = currentTotalHospitals;
hospitals = hospitals.concat(casper.evaluate(getDetails));
casper.scrollToBottom();
casper.wait(5000);
processPage();
} else {
stopScript();
}
}
var casper=require('casper')。创建({
没错,
日志级别:“信息”,
页面设置:{
loadImages:false,
loadPlugins:false,
userAgent:'Mozilla/5.0(Windows NT 6.2;WOW64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/29.0.1547.2 Safari/537.36'
}
});
casper.options.waitTimeout=60000;
var utils=require('utils');
var医院=[];
var=0;
var currentTotalHospitals=0;
卡斯珀,开始https://www.docdoc.com/)。然后单击(“表单提交btn”)。然后单击(函数(){
这个。等等(5000);
这个.scrollToBottom();
processPage();
});
casper.on(“remote.message”,函数(msg){
this.echo(“remote>”+msg);
});
casper.on('step.error',函数(err){
此.die(“步骤失败:+err”);
})
casper.on(“page.error”,函数(msg,trace){
this.echo(“错误:+msg,“错误”);
});
casper.on('complete.error',函数(err){
this.die(“完全回调失败:“+err”);
});
casper.run(函数(){
utils.dump(医院);
});
函数getCurrentTotalHospitals(){
var resultsNodeList=document.queryselectoral(“div.results-list div.result”);
返回结果nodelist.length;
}
函数getDetails(){
var详细信息=[];
var resultsNodeList=document.queryselectoral(“div.results-list div.result”);
log(“resultsNodeList.length”+resultsNodeList.length);
对于(变量i=0;iprevTotalHospitals){
prevTotalHospitals=当前TotalHospitals;
hospitals=hospitals.concat(casper.evaluate(getDetails));
casper.scrollToBottom();
卡斯珀,等等(5000);
processPage();
}否则{
stopScript();
}
}
evaluate()
是一个同步函数。由于它在processPage()
内部同步使用,processPage()
在开始时也是同步的。稍后您将使用wait()
,它是a同步的。在wait()
之后出现的processPage()
将立即执行
您可以这样使用它:
if (...) {
...
casper.scrollToBottom();
casper.wait(5000, processPage);
} else {...}
顺便说一下,对于第一个wait()
,情况也是如此。应该是:
this.wait(5000, function(){
this.scrollToBottom();
processPage();
});
谢谢@Artjom,我已经根据您的建议更改了代码,但不幸的是,代码没有按预期工作。如果我错了,请告诉我。对不起,我不知道可能是什么问题。