2016-08-09 10 views
3

Nightmarejsで簡単なフォロースクリプトを作成しようとしています。それは次のように動作する必要がありますNightmarejs。delay(遅延)を持つ各要素の.click()

  1. 移動を一部のユーザープロファイルに
  2. をクリックし、ボタンの上に、そのユーザーのフォロワーのリストを開くために
  3. クリックして、すべての各間の遅延とボタンをたどる
  4. クリックをクリックしてください負荷より
  5. 繰り返し手順3.と4.数回
私はこれまででてきた、そしてそれはエラーなしで動作しますが、それは最初のフォローボタンの上にのみクリックすると、それは終わりで何

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }) 

nightmare 
.goto('http://example.com/') 
.click('.buttonOpenModal') 
.wait(4000) 
.click('.buttonFollow') 
    .end() 
    .then(function (result) { 
    console.log(result) 
    }) 
    .catch(function (error) { 
    console.error('Search failed:', error); 
    }); 

私はこのようなフォローボタンにループクリックしようとしたが、それ$は私がNightmarejsで経験している人のために、これは単純な作業になりますが、私はちょうどそれを開始し、現在2日間それで苦労されていることを信じてい

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }) 

nightmare 
.goto('http://example.com/') 
.click('.buttonOpenModal') 
.wait(4000) 
.evaluate(function(){ 
    $('.buttonFollow').each(function() { 
     $(this).click(); 
    }); 
    }) 
    .end() 
    .then(function (result) { 
    console.log(result) 
    }) 
    .catch(function (error) { 
    console.error('Search failed:', error); 
    }); 

が定義されていない私にエラーを与えます。

本当に助けていただければ幸いです。

答えて

4

この構文はjQueryの一部なので、$ is not definedが得られます。これは、NightmareJSスクリプトを書くときに純粋なjavascriptを使用するためです。

あなたは(evaluateing前)jqueryのライブラリをロードすることができ感謝.inject("js", "https://code.jquery.com/jquery-3.1.0.min.js")

を機能するように我々は、同期の睡眠を必要とし、それが終了する前に、他のNightmareJSは機能evaluateを終了してもよいです。 (私はこのスレッドにsleepのコードが見つかりました:https://stackoverflow.com/a/17532524/6479780):

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }) 

nightmare 
.goto('http://example.com/') 
.click('.buttonOpenModal') 
.wait(4000) 
.evaluate(function(){ 
    function sleep(ms) { 
    var start = new Date().getTime(), expire = start + ms; 
    while (new Date().getTime() < expire) { } 
    return; 
    } 

    var list = document.querySelectorAll('.buttonFollow'); 
    list.forEach(function(elt){ 
     elt.click(); 
     //We need synchronous sleep here 
     sleep(2000); //Wait 2 seconds 
    }); 
    }) 
.end() 
.then(function (result) { 
    console.log(result) 
}) 
.catch(function (error) { 
    console.error('Search failed:', error); 
}); 
+0

です。これは動作しますが、一度にすべてをクリックすると、それぞれの間で遅延で編集できますか?私がよく理解していれば、基本的に.evaluate内に純粋なjavascript関数を追加できますか?ありがとうございました! – Plavookac

+0

評価のコードは、nightmarejsによって開かれたウィンドウで実行されます。つまり基本的にはブラウザ上に新しいタブを開き、ウェブサイトのアドレスを入力し、 'evaluate'関数の内容をコンソールに貼り付けるようなものです。だからこそ純粋なjavascriptが動作する – Omar

+0

このような寝ると電子ブラウザがフリーズする – RetroCode

0

このバージョンを試してみてくださいあなたは非同期睡眠を試してみたい場合は、ここでsetTimeout(callback, millis) を使用する必要が は、私は純粋なJavaScriptを使用して、どうなるのかです:

var Nightmare = require('nightmare'); 
var nightmare = Nightmare({ show: true }); 

nightmare 
    .goto('http://example.com/') 
    .click('.buttonOpenModal') 
    .wait('div.Buttons') 
    .evaluate(function() { 
    var interval = setInterval(function() { 
     var btn = document.querySelectorAll('div.Buttons'); 
     if (undefined == btn || 0 == btn.length) { 
     clearInterval(interval); 
     } 
     else { 
     btn[0].click(); 
     } 
    }, 5000); 
    }) 
    .end() 
    .then(function (result) { 
    console.log(result) 
    }) 
    .catch(function (error) { 
    console.error('Search failed:', error); 
    }); 
+0

これはうまくいかない。 – Coder

関連する問題