等待动作完成,然后再在操纵up中执行

时间:2018-09-12 20:42:21

标签: javascript node.js automation puppeteer

我有一个操纵up脚本,可以将一些文本输入字段,提交查询并处理结果。

当前,该脚本一次只能处理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 For each loop中的递归函数

我还尝试了使用带有yields和promises的函数生成器,甚至尝试了本文Nodejs Puppeteer Wait to finish all code from loopeachSeries包中的async函数

我尝试的一切都没有成功。任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:2)

无法使用同一标签同时访问两个网站。您可以在浏览器上尝试确定。

开个玩笑,如果要搜索多个项目,则必须为此创建一个pagetab

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

因此,我们要遍历每个术语,并在操作列表中添加新的承诺。添加功能不会花费很多时间。然后我们可以运行承诺链。

您仍然需要修改上面的代码以获取所需的内容。 和平!