Дождитесь окончания действия, прежде чем снова выполнить в кукловоде - PullRequest
0 голосов
/ 12 сентября 2018

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

В настоящее время сценарий обрабатывает только 1 поисковый запрос за раз, но мне нужно, чтобы он былвозможность обрабатывать массив элементов последовательно.

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

  for (const search of searchTerms) {
    await Promise.all([
      page.type('input[name="q"]', 'in:spam ' + search + String.fromCharCode(13)),
      page.waitForNavigation({
          waitUntil: 'networkidle2'
        })
    ]);

    const count = await page.evaluate((sel) => {
      return document.querySelectorAll(sel)[1].querySelectorAll('tr').length;
    }, 'table[id^=":"]');

    if (count > 0) {
      const more = await page.$x('//span[contains(@class, "asa") and contains(@class, "bjy")]');
      await more[1].click();

      await page.waitFor(1250);
      const markRead = await page.$x('//div[text()="Mark all as read"]');
      await markRead[0].click();

      const selectAll = await page.$x('//span[@role="checkbox"]');
      await selectAll[1].click();

      const move = await page.$x('//div[@act="8"]');
      await move[0].click();

      await page.waitFor(5000);
    }
  }

Я пытался использовать функцию рекурсии из Nodejs Synchronous Для каждого цикла

Я также пытался использоватьГенератор функций с выходами, а также с обещаниями и даже попытался использовать функцию eachSeries из пакета async из этого поста Nodejs Puppeteer Подождите, чтобы закончить весь код из цикла

Ничего я не пыталсяБыл успешен.Любая помощь будет оценена, спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

Невозможно посетить два сайта одновременно с одной вкладкой.Вы можете попробовать это в своем браузере, чтобы убедиться.

Шутки в сторону, если вы хотите искать несколько элементов, вы должны создать page или tab для этого.

for (const search of searchTerms) {
  const newTab = await browser.newPage()
  // other modified code here
}

... подождите, что все еще будет искать один за другим.Но если вы используете карту с ограничением параллелизма, она будет хорошо работать.

Мы можем использовать p-all для этого.

const pAll = require('p-all');
const actions = []
for (const search of searchTerms) {
  actions.push(async()=>{
    const newTab = await browser.newPage()
    // other modified code here
  })
}
pAll(actions, {concurrency: 2}) // <-- set how many to search at once

Таким образом, мы выполняем цикл по каждому члену и добавляемновое обещание в списке действий.Добавление функций не займет много времени.И тогда мы сможем запустить цепочку обещаний.

Вам все равно придется изменить приведенный выше код, чтобы получить то, что вы хотите.Мир!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...