用梦魇自动化ajax生成的网站

Automating ajax generated websites with nightmare

本文关键字:网站 ajax 梦魇 自动化      更新时间:2023-09-26

我正在使用噩梦来自动化网站。到目前为止,它很好,但我注意到,当我想与动态加载的内容交互时,它会出现一些问题。甚至还有一种方法,它等待元素出现在页面.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中看到它,scraper也无法识别它,将永远等待。我猜它只适用于静态代码。有没有一种方法可以在一段时间后更新html,或者类似的东西?

将代码更新为:

.wait("input[type='text'][title='Search']")
.type("input[type='text'][title='Search']", 'the term I am searching for')

这非常好用。问题是该组件正在等待input[name="search"],它从未附加到谷歌搜索的输入字段。

更改为以上内容将解决您的问题。input[name="search"]这在谷歌的搜索栏上是不可用的,即使页面已经完全加载。

此外,在运行测试脚本时使用DEBUG=nightmare:actions node --harmony test.js,因为它将帮助您确定代码所处的操作。

希望这能有所帮助。