我有一个木偶脚本,登录到一个网站,然后正在寻找点击7个不同的'添加时间';按钮在iFrame内。由于id是动态变化的,所以我让它查找按钮的文本。
我有它登录正确,能够点击有时,但它不点击所有的按钮。它也不一致,最后两个按钮可能被点击或第二个按钮。
代码如下:
let test = await frame.$$('[type="button"]')
test.forEach(async el => {
var text = await (await el.getProperty('textContent')).jsonValue()
if (text == "Add Time") {
await el.click();
}
});
如注释中所述,以下模式同时运行所有单击:
test.forEach(async el => {...});
大多数网站通常不会设计成7个不同的点击应该几乎同时发生——这是不人道的。通常,在用户再次点击之前,会有一些加载动画或暂停。
上述模式的另一个问题是,在此之后的任何代码都将处于不同的承诺链中,并且无法等待这些点击的结果。你必须使用await Promise.all([test.map(async el => {...})])
才能做到这一点。
正如OP在评论中确认的那样,典型的解决方案是顺序迭代:
for (const el of test) {
...
}
这完全运行每个点击完成,然后下一个只有在最后一个完成后。for
循环后的代码将在循环的所有迭代完成后执行。
参见在一个循环中使用Puppeteer抓取多个url和在forEach循环中使用async/await。