最佳作法puppeteer waitForSelector或setTimeout

时间:2019-06-03 09:22:30

标签: javascript checkbox puppeteer

我尝试找到“等到完整的网站加载完毕”的最佳方法。这似乎是一件棘手的事情。我在Google上搜索了很多,发现有两种方法:waitForSelector和SetTimout。

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

这应该是每个人在使用具有不同页面和形式的木偶时始终需要的一个问题。

当选择器位于iFrame中时,这个waitForSelector是否可能不起作用?

感谢您的任何建议和帮助!

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

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

1 个答案:

答案 0 :(得分:0)

如果您想使其成为真正的“伪装者”方式,请查看this
有一些选项可供选择,但是在我的实践中,我发现最有用的networkidle2
如文档所述,您的脚本将一直等到

  

在至少500毫秒内,最多有2个网络连接。

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


但是,如果出于某种原因收件箱解决方案无法处理您的案件,那就可以了。像您一样制作自定义的等待功能。
这行很不错,只需编写更少的代码:
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;
})