【问题标题】:how to put a delay in this evaluate with puppeteer如何用 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))。但是,您真正想要完成什么?如果您不介意分享您正在抓取的网站和您想要提取的数据,我可以写一个更完整的答案。原因是睡眠或等待超时对于您尝试解决的任何问题几乎总是一个糟糕的解决方案,因为它会导致竞争条件。谢谢。

标签: javascript web-scraping automation puppeteer delay


【解决方案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()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多