gpt4 book ai didi

javascript - Nightmare 条件等待()

转载 作者:搜寻专家 更新时间:2023-11-01 00:17:15 26 4
gpt4 key购买 nike

我正在尝试使用 Nightmare 抓取网页,但想等待 #someelem 出现,前提是它确实存在。否则,我希望 Nightmare 继续前进。如何使用 .wait() 完成此操作?

我不能使用 .wait(ms)。使用 .wait(selector) 意味着 Nightmare 将一直等待直到元素出现,但如果页面永远不会有此元素,Nightmare 将永远等待。

最后一个选项是使用.wait(fn)。我试过这样的事情

.wait(function(cheerio) {
var $ = cheerio.load(document.body.outerHTML);
var attempt = 0;

function doEval() {
if ( $('#elem').length > 0 ) {
return true;
}
else {
attempt++;

if ( attempt < 10 ) {
setTimeout(doEval,2000); //This seems iffy.
}
else {
return true;
}
}
}

return doEval();
},cheerio)

因此,等待并再次尝试(达到阈值),如果未找到该元素,则继续前进。 setTimeout 周围的代码似乎有误,因为 .wait 是在浏览器范围内完成的。

提前致谢!

最佳答案

我认为传递 cheerio 库不会很好地工作。参数被序列化(或多或少)以传递给子 Electron 进程,因此传递整个库可能行不通。

从好的方面来说,.wait(fn)fn 部分在页面上下文中执行 - 这意味着您可以完全访问 document 及其方法(例如,querySelector)。如果页面的 jQuery 上下文存在,您也可以访问它,如果不存在,您甚至可以使用 .inject() 来注入(inject)它。

撇开这一点,就 .wait()(和 .evaluate(),就此而言)而言,您是对的,至少要等到同步方法类似 promises could be used directly in .evaluate() 的东西.

在此之前,您可以使用 .action() 来模仿您想要的行为:

var Nightmare = require('nightmare');

Nightmare.action('deferredWait', function(done) {
var attempt = 0;
var self = this;

function doEval() {
self.evaluate_now(function(selector) {
return (document.querySelector(selector) !== null);
}, function(result) {
if (result) {
done(null, true);
} else {
attempt++;
if (attempt < 10) {
setTimeout(doEval, 2000); //This seems iffy.
} else {
done(null, false);
}
}
}, '#elem');
};
doEval();
return this;
});

var nightmare = Nightmare();
nightmare.goto('http://example.com')
.deferredWait()
.then(function(result) {
console.log(result);
});

关于javascript - Nightmare 条件等待(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36723849/

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