2016-09-01 10 views
1

nightmarejsを使用してボタンを何度もクリックできるスクリプトを作成しようとしています。これは、コメントセクションの一番下にあるyoutubeボタンのように、 (例:youtube.com/watch?v=pZISJqJbQuU & list = RDpZISJqJbQuU#t = 3)、クリックするボタンがなくなると停止します。NightmareJSの非同期性の問題

評価を呼び出そうとしましたが、end()メソッドが最初に呼び出され、プロセスがキャンセルされました。私はsetTimeout、setInterval、then()を使ってループを再帰的に変換しようとしました。 evaluate()のいずれかが終了すると、その仕事は終了しますが、終了(終了)しないか、end()の競合条件のために仕事を完了する前に終了します。

経験豊富なnightmarejsユーザーがいますか?

function youtube_button_clicker(group) { 
    var nightmare = Nightmare({ 
     show: true 
    }); 

    nightmare 
     .goto(url) 
     .inject('js', 'jquery-3.1.0.js') 
     .then(
      () => nightmare. 
     evaluate(function() { 
    for (i=0;i>LEN;i++) 
    { setTimeout(() => { $(button_element).click() }, i * 2000); } 


    return "done" 


})) 
.catch(function (error) { 

     console.error('Search failed:', error); 
    }); 

} 

、.END()メソッドを削除し、それがハング再び)(.ENDを入れて、それが処理をスキップ - 早期終了します。私に何ができる ?

+0

あなた 'する必要がsetTimeouts'約束事に包まれていれば、あなたは 'promise.all'する必要があります。すべてが完了したときにイベントを受け取れば、' all'によって返された約束を 'then'に渡す必要があります。 'それは適切に – slebetman

+0

あなたは私にコード例を見せてもらえますか? – RetroCode

答えて

1

.evaluate()少なくとも、#819(またはそのようなもの)までは非同期ではありません。つまり、setTimeout()で評価することはできません。また、箱から出しても可能であっても、それがこの場合には特に良いルートになるとは思えません。

脇に、かもしれないほしいと思うthisの例をnightmare-examplesに読んでください。複数の操作とループを連鎖させる簡単な入門書です。

あなたはおそらく再帰的な機能を持つことができますが、停止条件を強制するように注意する必要があります。 (あなたはまた、#625を見てしたいことがあり、アクションがスクロールしているが、問題は同じです。)腰から、私はこのような何かを得るかもしれないあなたが閉じて思う:

var iterations = 0; 
var reclick = function(nm) { 
    return nm 
    .click('#some-button') 
    .wait('#element-you-check-for') 
    .then(function() { 
     // you could also use `.visible()` or something before this `.then()` 
     // depends on your use case 
     // here, I'm using the number of iterations 
     if (iterations++ < 10) { 
     return reclick(nm); 
     } 
     return; 
    }); 
} 

nightmare 
    .goto('http://my-domain.tld') 
    .then(function() { 
    return reclick(nightmare); 
    }) 
    .then(function(){ 
    // ... other actions 
    })