NightmareJS的异步性问题

时间:2016-09-01 15:50:13

标签: javascript node.js phantomjs browser-automation nightmare

我正在尝试使用nightmarejs构建一个脚本,它可以一遍又一遍地点击一个按钮,就像评论部分底部的youtube按钮一样,每次按下它时都会加载旧评论(例如:youtube.com/watch?v=pZISJqJbQuU&list=RDpZISJqJbQuU#t=3)并在没有更多按钮被点击时停止。

我试过调用evaluate,只是首先调用end()方法并取消进程。我尝试使用setTimeout,setInterval,then(),将循环转换为递归。每次评估()都会完成它的工作但不会退出(只是挂起)或在完成工作之前退出,因为竞争条件为end()。

那里有经验丰富的梦魇用户吗?

    function youtube_button_clicker(group) {
    var nightmare = Nightmare({
        show: true
    });

    nightmare
        .goto(url)
        .inject('js', 'jquery-3.1.0.js')
        .then(
            () => nightmare.
         evaluate(function() {
    for (i=0;i>LEN;i++)
    { setTimeout(() => { $(button_element).click() }, i * 2000); }


    return "done"


}))
.catch(function (error) {

        console.error('Search failed:', error);
    });

}

删除.end()方法并挂起,再次放回.end()并跳过进程 - 提前退出。我该怎么办?

1 个答案:

答案 0 :(得分:1)

.evaluate()函数不能是异步的,至少在包含source(或类似的东西)之前不能。换句话说,使用setTimeout()进行评估是行不通的。此外,我不认为在这种情况下这将是一个特别好的途径,即使它可以开箱即用。

顺便说一下,可能想要在nightmare-examples中给出#819示例。它简要介绍了链接多个操作和循环的方法。

您可能可以使用递归函数,但是您必须小心强制执行停止条件。 (您可能还想查看this,操作是滚动但问题类似。)从时尚的角度来看,我认为这样的事情可能会让您接近:

var iterations = 0;
var reclick = function(nm) {
  return nm
    .click('#some-button')
    .wait('#element-you-check-for')
    .then(function() {
      // you could also use `.visible()` or something before this `.then()`
      // depends on your use case
      // here, I'm using the number of iterations
      if (iterations++ < 10) {
        return reclick(nm);
      }
      return;
    });
}

nightmare
  .goto('http://my-domain.tld')
  .then(function() {
    return reclick(nightmare);
  })
  .then(function(){
    // ... other actions
  })