Javascript 在每个元素上单击()并在

Javascript 在每个元素上单击()并在,javascript,jquery,phantomjs,browser-automation,nightmare,Javascript,Jquery,Phantomjs,Browser Automation,Nightmare,我正在尝试用噩梦制作简单的跟随脚本。它应该以下一种方式工作: 转到某个用户配置文件 单击按钮打开该用户的追随者列表 单击所有跟随按钮,每次单击之间有延迟 单击“加载更多” 重复步骤3。四,。几次 到目前为止,我得到的是这个,它工作正常,没有错误,但它只单击第一个跟随按钮,这就是结束: var Nightmare = require('nightmare'); var nightmare = Nightmare({ show: true }) nightmare .goto('http://ex

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

  • 转到某个用户配置文件
  • 单击按钮打开该用户的追随者列表
  • 单击所有跟随按钮,每次单击之间有延迟
  • 单击“加载更多”
  • 重复步骤3。四,。几次
  • 到目前为止,我得到的是这个,它工作正常,没有错误,但它只单击第一个跟随按钮,这就是结束:

    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);
      });
    
    我相信对于一个经历过噩梦的人来说,这将是一个简单的任务,但我刚刚开始做这件事,已经为此奋斗了两天


    我非常感谢您的帮助。

    您得到的
    $未定义
    ,因为此语法是jQuery的一部分,当您编写噩梦EJB脚本时,它使用纯javascript

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

    我们需要同步睡眠,否则噩梦EJS可能会在函数完成之前结束函数̀
    evaluate
    。(我在这个线程上找到了
    sleep
    的代码:) 如果要尝试异步睡眠,必须使用
    setTimeout(回调,毫秒)
    下面是我将使用纯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);
    });
    
    var噩梦=require(“噩梦”);
    var噩梦=噩梦({show:true})
    噩梦
    后藤先生('http://example.com/')
    。单击(“.ButtonPenmodal”)
    .等等(4000)
    .评估(功能){
    功能睡眠(ms){
    var start=new Date().getTime(),expire=start+ms;
    while(new Date().getTime()
    试试这个版本:

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

    我懂了。这是可行的,但是它一次点击了所有的按钮,你能在每个按钮之间延迟编辑吗?如果我理解的很好,基本上你可以在里面添加任何纯javascript函数?非常感谢。evaluate中的代码将在噩梦ejs打开的窗口中执行。因此,基本上,这就像在浏览器上打开一个新选项卡,键入网址,然后将
    evaluate
    函数的内容粘贴到控制台中。这就是为什么纯javascript浏览器在这样睡觉时会冻结