【问题标题】:best practice puppeteer waitForSelector or setTimeout最佳实践 puppeteer waitForSelector 或 setTimeout
【发布时间】:2019-06-03 09:22:30
【问题描述】:

我试图找到“等到整个网站加载完毕”的最佳方式。这似乎是一件棘手的事情。我在谷歌上搜索了很多,发现有两种方法: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');

【问题讨论】:

    标签: javascript checkbox puppeteer


    【解决方案1】:

    如果你想让它成为真正的“傀儡”方式,请查看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;
    })
    

    【讨论】:

      猜你喜欢
      • 2020-06-12
      • 1970-01-01
      • 2013-11-04
      • 2010-09-15
      • 2019-11-14
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多