我想知道我是否可以告诉 puppet 师等待,直到一个元素显示。
const inputValidate = await page.$('input[value=validate]');
await inputValidate.click()
// I want to do something like that
waitElemenentVisble('.btnNext ')
const btnNext = await page.$('.btnNext');
await btnNext.click();
我有什么办法可以做到这一点吗?
8条答案
按热度按时间2skhul331#
我认为您可以使用
page.waitForSelector(selector[, options])
函数来实现此目的。要检查可用选项,请参见github link.
1bqhqjot2#
如果要确保元素实际可见,则必须使用
否则,您只是在DOM中查找元素,而不检查可见性。
brtdzjyr3#
因为如果存在或已定位
but NOT
可见或已显示,它将回答元素正确答案是使用
page.waitFor()
或page.waitForFunction()
检查元素大小或可见性,请参见下面的说明。解释
如果页面的DOM上存在的元素具有CSS属性
display:none
或visibility:hidden
,则该元素不总是可见的,这就是为什么使用page.waitForSelector(selector)
不是好主意的原因,让我们在下面的代码片段中查看不同之处。x一个一个一个一个x一个一个二个一个x一个一个三个一个
在上面的代码片段中,函数
isExist()
是模拟的我们可以看到,当对两个元素
#idA
和#idB
运行isExist()
时,返回存在。但运行
isVisible()
时,#idA
不可见或显示。这里还有其他对象来检查元素是否显示或使用CSS属性
display
。对于样式
visibility
,请检查而不是hidden
。注意:我不擅长Javascript或英语,请随时改进这个答案。
fjaof16o4#
您可以使用
page.waitFor()
、page.waitForSelector()
或page.waitForXPath()
来等待页面上的元素:**注:**在引用帧时,也可以使用
frame.waitFor()
、frame.waitForSelector()
或frame.waitForXPath()
。ykejflvf5#
更新答案,进行一些优化:
r6vfmomb6#
虽然我同意@ewwink的回答。Puppeteer的API默认检查不隐藏,所以当你这样做:
你不会被CSS隐藏和显示。为了确保渲染效果,你可以像@ewwink的
waitForFunction
那样做。然而,为了完全回答你的问题,这里有一个使用puppeteer的API的片段:在我自己编写了一些类似的方法之后,我发现expect-puppeteer可以做得更好(请参见toMatchElement)。
3xiyfsfu7#
上述函数使其具有通用性,以便您可以在任何地方使用它。
但是,如果您使用的是pptr,还有另一种更快更简单的解决方案:
https://pptr.dev/#?product=Puppeteer&version=v10.0.0&show=api-pagewaitforfunctionpagefunction-options-args
ev7lccsx8#
刚刚通过浏览一个健身网站进行了测试。@ewwink、@0fnt和@caram提供了最完整的答案。
仅仅因为DOM元素可见并不意味着它的内容已经完全填充。
今天,我跑了:
并且错误地接收到以下内容,因为表DOM没有被运行时完全填充。您可以看到外部HTML是空的。
user@env:$ <table id="some-table"></table>
添加1秒的暂停可以修复此问题,这可能是意料之中的:
user@env:$ <table id="some-table"><tr><td>Data</td></tr></table>
但@ewwink的回答也是如此,更优雅(没有人为的超时):
user@env:$ <table id="some-table"><tr><td>Data</td></tr></table>