Многократное нажатие элемента на странице с помощью Electron (NightareJS)

Я пишу парсер страниц для динамической веб-страницы. Страница имеет первоначальную загрузку, а затем загружает оставшуюся часть контента после короткого времени загрузки.

Я учел нагрузку и успешно очистил HTML-код со страницы, но страница не загружает ВЕСЬ контент сразу. Вместо этого он загружает указанное количество контента через URL-адрес запроса GET, а затем имеет кнопку «Получить больше» на странице. Моя цель — нажимать эту кнопку «Получить больше», пока весь контент не будет загружен на страницу. Для тех, кто интересуется, я не хочу загружать весь контент сразу через URL-адрес GET из-за воздействия на их сервер.

Я застрял в цикле или итерации, которая позволила бы мне несколько раз щелкнуть страницу.

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. Я считаю, что есть какая-то проблема с областью видимости, но я не знаю, что именно происходит.

Если я смогу заставить метод щелчка работать в setInterval или чем-то подобном, проблема будет решена.

Мысли?


person Zach Harriott    schedule 17.06.2017    source источник


Ответы (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.");
    });
}

В конечном счете, это должно истечь время ожидания () для кнопки, а затем вы можете обработать ошибку в блоке catch (). Осторожно, это продолжается и продолжается :) Я не стал ждать до конца (у вас может не хватить памяти).

person devilpreet    schedule 22.06.2017
comment
Оцените ответ. Я бы предпочел не сталкиваться с проблемами памяти с решением. Я думаю, что в конечном итоге я буду делать это, просто отправляя один большой запрос GET время от времени. Не думаю, что это будет большой проблемой. - person Zach Harriott; 22.06.2017