Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 卡斯珀斯';从无限滚动填充完整页面时,scrollToBottom不工作_Javascript_Casperjs_Infinite Scroll - Fatal编程技术网

Javascript 卡斯珀斯';从无限滚动填充完整页面时,scrollToBottom不工作

Javascript 卡斯珀斯';从无限滚动填充完整页面时,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

我不知道为什么scrollToBottom()不起作用。如果当前数据(来自evaluate)大于以前的数据,我希望继续滚动到页面底部

幻影JS 2.0.0
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,我已经根据您的建议更改了代码,但不幸的是,代码没有按预期工作。如果我错了,请告诉我。对不起,我不知道可能是什么问题。