Nightmarejs .click()对每个元素之间有延迟

时间:2016-08-09 22:21:51

标签: javascript jquery phantomjs browser-automation nightmare

我正在尝试使用Nightmarejs制作简单的脚本。它应该以下一种方式工作:

  1. 转到某个用户个人资料
  2. 点击按钮打开该用户的关注者列表
  3. 点击所有关注按钮,每次点击之间有延迟
  4. 点击加载更多
  5. 重复步骤3.和4. 几次
  6. 到目前为止我所拥有的是它,它没有任何错误,但只点击第一个关注按钮就结束了:

    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天了。

    我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:4)

你得到$ is not defined,因为这个语法是jQuery的一部分,当你编写NightmareJS脚本时,它使用纯javascript。

由于函数.inject("js", "https://code.jquery.com/jquery-3.1.0.min.js")

,您可以加载jquery库(在评估之前)

我们需要同步睡眠,否则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);
});

答案 1 :(得分: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);
  });