1

我正在使用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,或者类似的东西?

4

1 回答 1

1

Update your code as:

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

This works perfectly fine. The problem was that the component was waiting for input[name="search"] , which never gets attached to the google search's input field.

Changing to the above will resolve your issue. input[name="search"] this is no available on google's search bar even after the page has fully loaded.

Also, use DEBUG=nightmare:actions node --harmony test.js while running the test script as it will help you in determining the action your code gets stuck at.

Hope this helps.

于 2015-11-19T05:56:13.380 回答