[英]Wait for actions to finish before executing again in 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的递归函数每个循环
我还尝试使用具有yields和promises的函数生成器,甚至尝试了eachSeries
来自async
包的eachSeries
函数Nodejs Puppeteer等待完成循环中的所有代码
我尝试过的一切都没有成功。 任何帮助,将不胜感激,谢谢!
无法使用同一标签同时访问两个网站。 您可以在浏览器上尝试确定。
撇开笑话,如果要搜索多个项目,则必须为此创建一个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
因此,我们遍历每个术语,并在操作列表中添加新的承诺。 添加功能不会花费很多时间。 然后我们可以运行承诺链。
您仍然需要修改上面的代码以拥有所需的内容。 和平!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.