我正在使用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/

10-09 19:27