2016-08-25 2 views
1

Я пытаюсь выяснить, как сделать скрипт щелкнуть ссылку и перейти на какую-либо страницу, а затем выполнить какое-то действие. Вот пример того, что я застрял, что не работает.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(); 
    } 
}) 

Так что меня смущает, не знаю, почему он выиграл Не работай.

+1

'addEventListener 'добавляет прослушиватель событий, но фактически не нажимает, потому что это немедленно вызовет событие, которое будет очень запутанным. Кажется, что ваша проблема в том, что 'then' после' оценки' не правильно дождаться загрузки страницы, правильно? –

+1

@ artjom-b Я думаю, что это именно то, что происходит. Потому что я получаю «результат null» в терминале. Как это исправить? – Plavookac

+0

Вы получаете результат «null», потому что вы никогда ничего не возвращаете. –

ответ

0

Хорошо, я думаю, что основная проблема заключается в том, как вы пытаетесь щелкнуть эту ссылку. Прямо сейчас, вы делаете это за пределами основного потока кошмарных цепных обратных вызовов (цепь .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»

+0

Спасибо за ответ, но мне нужно, чтобы он работал внутри .evaluate(). : D – Plavookac

+1

На какой странице вы хотите, чтобы работа внутри функции оценки() произошла? – ironicaldiction

Смежные вопросы