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

我试图循环点击像这样的关注按钮,但它给了我错误$ 未定义

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 回答