使用Electron(NightareJS)反复单击页面上的元素

时间:2017-06-17 13:57:51

标签: javascript html5 electron nightmare

我正在为动态网页编写页面抓取工具。页面具有初始加载,然后在短加载时间后加载剩余的内容。

我已经考虑了负载,并且已经成功从页面中删除了HTML,但该页面并未立即加载所有内容。相反,它通过GET请求URL加载指定数量的内容,然后有一个"获取更多"页面上的按钮。我的目标是点击这个" Get More"按钮,直到所有内容都加载到页面上。对于那些想知道的人,我不希望通过GET URL一次性加载所有内容,因为它们对服务器有影响。

我很难形成循环或迭代,这样我就可以反复点击页面。



const NIGHTMARE = require("nightmare");		
const BETHESDA = NIGHTMARE({ show: true });

BETHESDA
  // Open the bethesda web page. Web page will contain 20 mods to start.
  .goto("https://bethesda.net/en/mods/skyrim?number_results=40&order=desc&page=1&platform=XB1&product=skyrim&sort=published&text=")
  
  // Bethesda website serves all requested mods at once. Each mod has the class "tile". Wait for any tile class to appear, then proceed.
  .wait(".tile");

let additionalModsPresent = true;
while(additionalModsPresent) {
  setTimeout(function() {
    BETHESDA
      .wait('div[data-is="main-mods-pager"] > button')
      .click('div[data-is="main-mods-pager"] > button')
  }, 10000)
  

  additionalModsPresent = false;
}


//  let moreModsBtn = document.querySelector('div[data-is="main-mods-pager"] > button');

  // .end()
  BETHESDA.catch(function (error) {
    console.error('Search failed:', error);
  });




到目前为止,我的想法是使用while循环,尝试在一段时间后单击按钮。如果发生错误,可能是因为该按钮不存在。我遇到的问题是,我似乎无法在setTimeout或setInterval内部进行点击。我相信存在某种范围问题,但我不知道到底发生了什么。

如果我可以让click方法在setInterval或类似的东西中运行,问题就会解决。

思想?

1 个答案:

答案 0 :(得分:1)

您可以参考问题(循环中运行噩梦的问题)[https://github.com/segmentio/nightmare/issues/522]

我使用给定的指南修改了代码。它似乎工作正常

const NIGHTMARE = require("nightmare");
const BETHESDA = NIGHTMARE({
  show: true
});

BETHESDA
  // Open the bethesda web page. Web page will contain 20 mods to start.
  .goto("https://bethesda.net/en/mods/skyrim?number_results=40&order=desc&page=1&platform=XB1&product=skyrim&sort=published&text=")

  // Bethesda website serves all requested mods at once. Each mod has the class "tile". Wait for any tile class to appear, then proceed.
  .wait(".tile");

next();

function next() {
  BETHESDA.wait('div[data-is="main-mods-pager"] > button')
    .click('div[data-is="main-mods-pager"] > button')
    .then(function() {
      console.log("click done");
      next();
    })
    .catch(function(err) {
      console.log(err);
      console.log("All done.");
    });
}

最终,它应该在wait()的按钮上超时,然后你可以处理catch()块中的错误。要小心它继续下去:)我没有等到最后(你的内存可能会耗尽)。