2016-08-25 67 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'增加了一個事件監聽器,但實際上並沒有點擊,因爲這會立即觸發事件,這將會非常混亂。看來你的問題是'evaluate'後面的'then'沒有正確地等待頁面加載,對吧? –

+1

@ artjom-b我認爲這正是發生的事情。因爲我在終端得到「結果爲空」。如何解決這個問題? – 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>的鏈接內容標記是「噩夢」

+0

感謝您的回答,但我需要拖拽.evaluate()內的工作。 :D – Plavookac

+1

你想在evaluate()內部發生什麼工作? – ironicaldiction