4

Nightmarejsで簡単なフォロースクリプトを作ろうとしています。次のように動作するはずです:

  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);
  });

このようなフォローボタンをクリックしてループしようとしましたが、エラー$ is not defined が表示されます

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);
  });

Nightmarejs の経験がある人にとって、これは簡単な作業になると思いますが、私はそれを始めたばかりで、2 日間苦労しています。

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

4

2 に答える 2

5

この$ is not defined構文は jQuery の一部であるため、NightmareJS スクリプトを作成すると純粋な JavaScript が使用されます。

関数のおかげで、(評価する前に)jqueryライブラリをロードできます.inject("js", "https://code.jquery.com/jquery-3.1.0.min.js")

同期スリープが必要です。そうしないと、NightmareJS が終了evaluate前。sleep(このスレッドでコードを見つけました: https://stackoverflow.com/a/17532524/6479780)非同期スリープを試したい場合は、使用する必要がありますsetTimeout(callback, millis) 純粋なjavascriptを使用して、次のことを行います:

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);
});
于 2016-08-09T22:35:05.110 に答える
0

このバージョンを試してください:

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);
  });
于 2016-11-24T14:11:14.933 に答える