我正在使用Nightmare来自动化网站。到目前为止,它很棒,但是我注意到当我想与动态加载的内容进行交互时,它存在一些问题。
甚至还有一种方法,它等待元素出现在页面.wait(#elementId)
上,但不适用于动态生成的内容。
之前有人遇到过这个问题吗,或者您可以推荐其他技术吗?我对 Nightmare 的喜好是,它实际上并不是无尽的,通过与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或类似的东西? 最佳答案
将您的代码更新为:
.wait("input[type='text'][title='Search']")
.type("input[type='text'][title='Search']", 'the term I am searching for')
这工作得很好。问题在于该组件正在等待
input[name="search"]
,它永远不会附加到google搜索的输入字段中。更改为上述内容将解决您的问题。
input[name="search"]
即使页面已完全加载,在Google的搜索栏中也无法使用。另外,在运行测试脚本时使用
DEBUG=nightmare:actions node --harmony test.js
,因为它可以帮助您确定代码所卡住的 Action 。希望这可以帮助。
关于javascript - 用 Nightmare 自动化ajax生成的网站,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33776986/