如何用 puppeteer 延迟这个评估

Posted

技术标签:

【中文标题】如何用 puppeteer 延迟这个评估【英文标题】:how to put a delay in this evaluate with puppeteer 【发布时间】:2022-01-07 03:13:01 【问题描述】:

我正在尝试使用 puppeteer 延迟此评估,但我尝试了所有方法但没有成功,例如:

await page.waitForTimeout(1000);

或与:

setTimeout(() =>  , 1000);
                await page.evaluate(() => 
                    let elements = document.getElementsByClassName('button-text');
                    for (let element of elements) if (element.innerText == 'Add') element.click();
                )

我希望它像这个示例一样在每次点击后都出现,但它永远不会起作用:

await page.evaluate(() => 
    let elements = document.getElementsByClassName('button-text');
    for (let element of elements)
        if (element.innerText == 'Add')
            await page.waitForTimeout(1000);
            element.click();   
        
)

【问题讨论】:

page.evaluate 中的所有内容都在无法访问page 的浏览器进程中进行序列化和执行。您必须在浏览器中使用通用睡眠,例如await new Promise(r => setTimeout(r, 1000))。但是,您真正想要完成什么?如果您不介意分享您正在抓取的网站和您想要提取的数据,我可以写一个更完整的答案。原因是睡眠或等待超时对于您尝试解决的任何问题几乎总是一个糟糕的解决方案,因为它会导致竞争条件。谢谢。 【参考方案1】:

您想在浏览器上下文之外执行此操作:

let elements = await page.$$eval('.button-text', els => els.filter(el => el.innerText === 'Add'))
for(let element of elements)
  await page.waitForTimeout(1000)
  await element.click()

【讨论】:

以上是关于如何用 puppeteer 延迟这个评估的主要内容,如果未能解决你的问题,请参考以下文章

Puppet批量修改SSH端口-Linux软件分发

Windows Puppet 代理未连接到 AWSOpsWorks Puppet Enterprise 主服务器

是什么原因让华为测试工程师都说puppeteer比selenium好呢?

如何用 Python 实现优先级调度器?

如何用 C 预处理器编写一个 while 循环?

puppeteer:console.log 在评估中触发错误“未处理的承诺拒绝”