最佳实践 puppeteer waitForSelector 或 setTimeout

best practice puppeteer waitForSelector or setTimeout

我试图找到 "wait until the complete website is loaded" 的最佳方式。而这似乎是一件棘手的事情。我在谷歌上搜索了很多,发现有两种方法:waitForSelector 和 SetTimout。

我的问题是,即使我等待选择器#CheckSelectAll 选中此复选框,它似乎总是为时过早。所以我不得不添加 2 秒的延迟。这对我来说看起来很不专业。我想为此使用最佳实践。

这应该是大家在不同页面和表单中使用puppeteer时经常遇到的问题。

Is it possible that this waitForSelector doesn't work when the selector is inside an iFrame?

感谢您的建议和帮助!

  function delay(time) {
    return new Promise(function(resolve) { 
        setTimeout(resolve, time)
    });

  await page.waitForSelector('#CheckSelectAll');
  await delay(2000);
  await page.click('#CheckSelectAll');

如果您想以 "puppeteer" 的方式实现它,请查看 this
有几个选项可供选择,但在我的实践中,我发现最有用的 networkidle2
如文档中所述,您的脚本将等到

there are no more than 2 network connections for at least 500 ms.

await page.waitForNavigation({ waitUntil: 'networkidle2' })


但是,如果出于某种原因 in-box 解决方案无法处理您的情况,那么 O.K 就是解决方案。像您一样制作自定义等待功能。
这是很好的一行,可以少写代码:
await new Promise(resolve => setTimeout(resolve, 2000))


最后一个选项,您可以使用 page.evaluate() 访问 DOM 并验证元素是否可见。

const visibleVerification = await page.evaluate(() => { 
   // your verify logic.
   // return boolean, if element exists on page
   return true;
})