【发布时间】:2015-11-18 10:03:22
【问题描述】:
我正在使用Nightmare 来自动化网站。到目前为止一切都很好,但我注意到当我想与动态加载的内容进行交互时它会出现一些问题。
甚至还有一种方法可以等待元素出现在页面.wait(#elementId) 上,但它不适用于动态生成的内容。
以前有人遇到过这个问题,或者您能推荐一些其他技术吗?我喜欢噩梦的是,它实际上并不是无头的,并且通过它与 Electron 的集成,它还有一个 GUI,可以显示所做的一切。如果可以的话,我会更喜欢。
编辑
为了更好地说明我的担忧,这是我正在使用的代码,但已抽象:
假设我想在https://www.google.com 上搜索,但搜索表单是通过库动态生成的。我的代码看起来像这样
vo(function* () {
var nightmare = Nightmare({ show: true });
var search = yield nightmare
.goto('https://google.com')
.wait('input[name="search"]')
.type('input[name="search"]', ‘the term I am searching for’)
.click('#submitButton')
.wait(2000)
.evaluate(function () {
return $('input[name="search"]').val();
});
yield nightmare.end();
return search;
})(function (err, result) {
if (err) return console.log(err);
console.log(result);
});
但是由于input[name="search"]不是用html编写的,而是在页面加载后生成的,即使我可以在GUI中看到它,但刮板却无法识别它,并且将永远等待。我猜它只适用于静态代码。有没有办法在一段时间后更新html,或者类似的东西?
【问题讨论】:
-
你能添加一些代码并解释你卡在哪里吗??
-
@TejusPrasad 我在编辑中添加了一些代码
-
您使用的是 PhantomJS 还是 Electron? PhantomJS 有一个较小的默认视口,这会导致不同的页面可能根本不包含
input[name="search"]。 -
另外,您的
type通话中的引号已损坏。您使用的是‘,但您应该使用'或"。
标签: javascript node.js automation web-scraping nightmare