最佳实践 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;
})
我试图找到 "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;
})