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

  • 转到某个用户个人资料
  • 单击按钮打开该用户的关注者列表
  • 单击所有 跟随 按钮,每次单击之间有延迟
  • 点击 加载更多
  • 重复步骤 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 天。

    我真的很感激任何帮助。

    最佳答案

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

    由于函数 .inject("js", "https://code.jquery.com/jquery-3.1.0.min.js"),您可以加载 jquery 库(在评估之前)

    我们需要同步 sleep ,否则 NightmareJS 可能会在函数 evaluate 完成之前结束它。 (我在这个线程上找到了 sleep 的代码: https://stackoverflow.com/a/17532524/6479780 )
    如果你想尝试异步 sleep ,你必须使用 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);
    });
    

    关于javascript - Nightmarejs .click() 在每个元素上延迟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38861369/

    10-11 06:12