Nightmare.js - функция щелчка addEventListener не будет выполняться

Я пытаюсь понять, как сделать скрипт щелкнуть ссылку и перейти на какую-то страницу, а затем выполнить какое-то действие. Вот пример, с которым я застрял, это не работает.

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();
  }
})

Так что это смущает меня, не знаю, почему это не сработает.


person Plavookac    schedule 25.08.2016    source источник
comment
addEventListener добавляет прослушиватель событий, но на самом деле не щелкает, потому что это немедленно вызовет событие, что может привести к путанице. Кажется, ваша проблема в том, что then после evaluate неправильно ожидает загрузки страницы, верно?   -  person Artjom B.    schedule 25.08.2016
comment
@artjom-b Думаю, именно так и происходит. Потому что я получаю нулевой результат в терминале. Как это исправить?   -  person Plavookac    schedule 25.08.2016
comment
Вы получаете результат null, потому что вы никогда ничего не возвращаете.   -  person Artjom B.    schedule 26.08.2016


Ответы (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);
});

и это выводит контент со ссылкой на тег <h1></h1> страницы Nightmare, который является «Nightmare»

person ironicaldiction    schedule 25.08.2016
comment
Спасибо за ответ, но мне нужно, чтобы он работал внутри .evaluate() . :D - person Plavookac; 26.08.2016
comment
На какой странице вы хотите, чтобы происходила работа внутри Assessment()? - person ironicaldiction; 26.08.2016