通过噩梦自动化ajax生成的网站

时间:2015-11-18 10:03:23

标签: javascript node.js automation web-scraping nightmare

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

1 个答案:

答案 0 :(得分:1)

将您的代码更新为:

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

这完全没问题。问题是该组件正在等待input[name="search"],它永远不会附加到谷歌搜索的输入字段。

更改为上述内容可解决您的问题。 input[name="search"]即使页面已完全加载,也无法在Google的搜索栏中显示。

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

希望这有帮助。