Javascript 等待动作完成,然后在Puppeter中再次执行

Javascript 等待动作完成,然后在Puppeter中再次执行,javascript,node.js,automation,puppeteer,Javascript,Node.js,Automation,Puppeteer,我有一个木偶脚本,它向字段中输入一些文本,提交查询并处理结果 目前,该脚本一次只处理一个搜索词,但我需要它能够连续处理一组项目 我想我应该将代码放在一个循环中(请参见下面的代码),但是,它只是将数组中的所有项目一次输入到字段中,并且不会对每个搜索项执行代码块: for (const search of searchTerms) { await Promise.all([ page.type('input[name="q"]', 'in:spam ' + search +

我有一个木偶脚本,它向字段中输入一些文本,提交查询并处理结果


目前,该脚本一次只处理一个搜索词,但我需要它能够连续处理一组项目

我想我应该将代码放在一个循环中(请参见下面的代码),但是,它只是将数组中的所有项目一次输入到字段中,并且不会对每个搜索项执行代码块:

  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);
    }
  }
我试着使用一个递归函数

我还尝试使用一个函数生成器,它具有收益率和承诺,甚至还尝试了本文中
async
包中的
eachSeries
函数


我试过的都不成功。任何帮助都将不胜感激,谢谢

无法使用同一选项卡同时访问两个网站。您可以在浏览器上尝试以确保

除了笑话,如果你想搜索多个项目,你必须为此创建一个
页面
选项卡

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
const pAll=require('p-all');
常量操作=[]
for(搜索词的常量搜索){
actions.push(异步()=>{
const newTab=wait browser.newPage()
//这里有其他修改过的代码
})
}

pAll(actions,{concurrency:2})/无法使用同一选项卡同时访问两个网站。您可以在浏览器上尝试以确保

除了笑话,如果你想搜索多个项目,你必须为此创建一个
页面
选项卡

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
const pAll=require('p-all');
常量操作=[]
for(搜索词的常量搜索){
actions.push(异步()=>{
const newTab=wait browser.newPage()
//这里有其他修改过的代码
})
}

pAll(actions,{concurrency:2})/>目前,该脚本一次只处理1个搜索项,但我需要它能够连续处理一组项。你是说。。。并行?按顺序,连续表示一个接一个。>目前,脚本一次只处理一个搜索词,但我需要它能够连续处理一组项目。你是说。。。并行?连续的意思是一个接一个,按顺序。这根本不是我想要做的。我只打开了1个选项卡,希望在同一页中多次执行代码块x。@NativeCoder我相信您发布的代码应该已经这样做了
for(const search of searchTerms)
表示将对术语进行系列处理。如果你需要并行执行,你需要一个类似于这个答案中建议的东西。事实上,你是对的,它确实工作得很好,lol,没有返回结果,所以它将执行下一次搜索。我只需要清理场地,现在它工作得很好。谢谢你们的帮助,哈哈,为我的错误感到抱歉@NativeCoder如果返回数据,则可以在完成所有操作后获得结果。;)鲍尔本身也会做出承诺。这根本不是我想要做的。我只打开了1个选项卡,希望在同一页中多次执行代码块x。@NativeCoder我相信您发布的代码应该已经这样做了
for(const search of searchTerms)
表示将对术语进行系列处理。如果你需要并行执行,你需要一个类似于这个答案中建议的东西。事实上,你是对的,它确实工作得很好,lol,没有返回结果,所以它将执行下一次搜索。我只需要清理场地,现在它工作得很好。谢谢你们的帮助,哈哈,为我的错误感到抱歉@NativeCoder如果返回数据,则可以在完成所有操作后获得结果。;)帕尔本身也会做出承诺。