如何在无头浏览器上找到多个元素,并在超时后单击它们

时间:2017-02-07 05:08:16

标签: node.js phantomjs casperjs zombie.js node-horseman

我想在没有特定子节点的情况下检测DOM中的元素,然后在超时后单击没有子节点的元素。没有办法明确地直接找到元素只获取具有某个类的所有元素,并省略具有特定子类的元素。

假设浏览器有以下代码:

<div class="card">
  <div></div>
  <button>
</div>
<div class="card">
  <div></div>
  <button>
</div>
<div class="card">
  <div class="dont-click"></div>
  <button>
</div>

以下代码适用于casperjs / horseman,基本上使用.card类获取所有元素,然后查找子项具有.dont-click类的元素并省略它:

  var cards = $('.card');
  var listOfClickables = cards.filter(function(i, card) {
    var jCard = $(card);
    var found = jCard.find('.dont-click');
    if (found.length <= 0) {
      return jCard;
    }
  });

  return listOfClickables;

这有效,现在我想逐个查看此列表,然后单击每个.card的子按钮。如果您复制并粘贴到浏览器中,此代码有效:

recursiveFunction(listOfClickables);
function recursiveFunction(list){
  var jCard = list.shift();
  $(jCard).find('button').click();

  var delayMs = Math.random() * 5;

  setTimeout(function() {
    recursiveFunction(list);
  }, delayMs * 1000);
}

它从前一个函数中获取列表,并递归地单击子按钮,等待一下,然后弹出下一个元素,直到列表为空。

我试图点击这些项目中的一个,但我遇到了一些问题:

  1. 似乎必须在.evaluate()块中完成所有操作,您无法返回jquery元素列表,然后将其传递到另一个.evaluate()
  2. 好像你不能使用jQuery.click('.card button')点击元素,你必须以某种方式在.evaluate()块之外识别它,然后使用casperjs中的.click()方法/骑手。
  3. 是否可以使用这些框架来执行类似“使用此选择器查找所有元素,然后浏览这些元素并返回没有带有.dont-click的子元素的元素”的内容,然后单击所有返回的元素'子按钮“?

0 个答案:

没有答案