2016-08-25 8 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私はそれがまさに何が起こると思います。なぜなら私は端末で "result null"を取得するからです。それを修正するには? – Plavookac

+0

あなたは何も返さないので、あなたは 'null'の結果を得ます。 –

答えて

0

[OK]を、私は主な問題は、リンクをクリックしようとしていると思います。今、あなたは悪夢の連鎖コールバック(.goto().type().wait() ...チェーン)の主要な流れの外側でそれを行います。あなたがチェーンと連携し、.evaluate()の代わりに再び.click()を使用するためのフローを変更する場合は、その次のページでアクションを実行することができます

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

あなたはどのページにevaluate()の内部で作業をしますか? – ironicaldiction

関連する問題