gpt4 book ai didi

javascript - Casper.wait 未按预期等待

转载 作者:行者123 更新时间:2023-12-03 11:27:04 24 4
gpt4 key购买 nike

我尝试使用以下程序等待 5 秒,然后再单击下一个链接。但我看到 casper.wait 根本不等待 5 秒。

我需要等待 5 秒,以便我想要抓取的 url 上的 ajax 代码有足够的时间加载。

var casper = require('casper').create({
clientScripts: ['includes/jquery-1.11.1.min.js'],
logLevel: "debug", // Only "info" level messages will be logged
verbose: true});
/*
casper.on('remote.message', function(msg) {
this.echo(msg);
})
*/
//var page = require('webpage').create();

require("utils").dump(casper.cli.args);
require("utils").dump(casper.cli.options);

var fs=require('fs');
var system=require('system');

var pagenum =0;
var url = casper.cli.args[0];
//var xmlhttp;

function getPageContent()
{
var checkNext = true;
while(checkNext==true)
{
casper.wait(5000);
console.log("wait done");
casper.echo(checkNext);
content = casper.getHTML();
fs.write("caspertest1.html", content, 'a');

var nextLink = system.stdin.readLine();

var checkNext = casper.evaluate(function(nextLink)
{
//arb = ($(nextLink).is(":disabled"));
//addRequestCallback(function(xhr) {
//console.log("request",xhr);
//});
arb = ($(nextLink).is(":not([disabled])"));

//arb = $(nextLink);
console.log(arb);
//arb0 = arb[0];
//console.log(arb0);
//arbnew = $(arb0).is(":not([disabled])");
console.log(nextLink);
//arb = ($(nextLink).text());
//$.on('ajaxComplete ready',lamba);

return arb;
//return arbnew;
},nextLink);

pagenum = pagenum+1;
casper.echo("scraped page "+pagenum);
casper.echo("clicking next link");
casper.click(nextLink);
}
}
casper.userAgent('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0');

casper.start(url);

casper.then(getPageContent);

console.log("about to run");

casper.run();

最佳答案

所有 casper.then*casper.wait* 函数都是异步的。如果您调用他们,他们的操作将安排在当前步骤结束时。这意味着在 casper.wait 之后调用 console.logcasper.echocasper.evaluate 等同步函数将导致它们立即执行,并且等待将安排在稍后执行。

您需要将同步函数添加到waitthen回调中:

casper.wait(5000, function(){
console.log("wait done");
casper.echo(checkNext);
content = casper.getHTML();
fs.write("caspertest1.html", content, 'a');
// and so on
});

但是由于现在执行是异步的,因此您不能使用依赖于异步设置的变量状态的循环。您需要递归地执行此操作:

var checkNext = true;
function getPageContent()
{
if (!checkNext) { return; }
casper.wait(5000, function(){
console.log("wait done");
casper.echo(checkNext);
content = casper.getHTML();
fs.write("caspertest1.html", content, 'a');

var nextLink = system.stdin.readLine();

checkNext = casper.evaluate(function(nextLink)
{
arb = ($(nextLink).is(":not([disabled])"));
console.log(arb);
console.log(nextLink);
return arb;
},nextLink);

pagenum = pagenum+1;
casper.echo("scraped page "+pagenum);
casper.echo("clicking next link");
casper.click(nextLink);
});
casper.then(getPageContent);
}

关于javascript - Casper.wait 未按预期等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26874007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com