【问题标题】:Automating ajax generated websites with nightmare用噩梦自动化 ajax 生成的网站
【发布时间】:2015-11-18 10:03:22
【问题描述】:

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

【问题讨论】:

  • 你能添加一些代码并解释你卡在哪里吗??
  • @TejusPrasad 我在编辑中添加了一些代码
  • 您使用的是 PhantomJS 还是 Electron? PhantomJS 有一个较小的默认视口,这会导致不同的页面可能根本不包含 input[name="search"]
  • 另外,您的type 通话中的引号已损坏。您使用的是,但您应该使用'"

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


【解决方案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,因为它可以帮助您确定代码卡在的操作。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2020-03-14
    • 2010-11-13
    相关资源
    最近更新 更多