自动化ajax生成的网站与噩梦

我使用恶梦来自动化一个网站。 到目前为止,这是非常棒的,但我注意到,当我想与dynamic加载的内容进行交互时,会遇到一些问题。 甚至有一种方法,等待一个元素出现在页面上.wait(#elementId) ,但它不适用于在飞行中生成的内容。

有人遇到过这个问题,或者你可能会推荐一些其他技术? 我喜欢的噩梦是,它实际上并不是无头的,通过与Electron的集成,它也有一个GUI,显示所做的一切。 我宁愿如果这是可能的。

编辑

为了更好地说明我的担忧,下面是我正在使用的代码,但抽象:

假设我想在https://www.google.com上进行search,但search表单是通过库dynamic生成的。 我的代码看起来像这样

 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"] ,它永远不会附加到谷歌search的input字段。

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

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

希望这可以帮助。