【问题标题】:Nightmare.js - addEventListener click function won't executeNightmare.js - addEventListener 点击函数不会执行
【发布时间】:2016-08-27 02:52:04
【问题描述】:

我想弄清楚如何制作脚本点击链接并转到某个页面,然后执行一些操作。这是我坚持的示例,但不起作用。

var Nightmare = require('nightmare');
var nightmare = Nightmare({ show: true });

nightmare

.goto("https://www.google.com/")
.type("input", "nightmare.js")
.wait(3000)
.click("button[type=submit]")
.wait(2000)
.evaluate(function(){
  var title = document.querySelectorAll("h3 a");
  i = 0;

  if (title) {
    title[i].addEventListener("click", function(){
      setTimeout(function(){
          alert("Success!");
        }, 5000);
    });
  }
})

.then(function(result){
    console.log("result", result);
})
.catch(function (error) {
    console.error('Search failed:', error);
});

如您所见,它甚至不会转到下一页。

但是如果我这样定义点击,它将转到下一页,但我也需要它在另一个页面上执行一些功能:

.evaluate(function(){
  var title = document.querySelectorAll("h3 a");
  i = 0;

  if (title) {
    title[i].click();
  }
})

所以这让我很困惑,不知道为什么它不起作用。

【问题讨论】:

  • addEventListener 添加了一个事件监听器,但实际上并没有点击,因为这会立即触发事件,这会非常混乱。看来您的问题是evaluate 之后的then 没有正确等待页面加载,对吧?
  • @artjom-b 我认为这正是发生的事情。因为我在终端中得到“结果为空”。如何解决这个问题?
  • 你得到null的结果,因为你永远不会返回任何东西。

标签: javascript electron nightmare


【解决方案1】:

好的,我认为主要问题在于您尝试单击该链接的方式。现在,您在噩梦链式回调(.goto().type().wait()...链)的主要流程之外执行此操作。如果您更改流程以使用链,并再次使用.click() 而不是.evaluate(),您可以在下一页上执行操作:

nightmare
.goto("https://www.google.com/")
.type("input", "nightmare.js")
.wait(3000)
.click("button[type=submit]")
.wait("h3[class=r]")
.click("h3[class=r] a")
.evaluate(function(){
  return document.querySelector("h1 a").innerHTML
})
.end()
.then(function(result){
    console.log("result", result);
})
.catch(function (error) {
    console.error('Search failed:', error);
});

这会输出带有 Nightmare 页面的 <h1></h1> 标签链接的内容,即“Nightmare”

【讨论】:

  • 感谢您的回答,但我需要它在 .evaluate() 内工作。 :D
  • 您希望evaluate() 中的工作发生在哪个页面上?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多