注意,直到今天提交的所有答案都是错误的
因为如果Exist 或 Location Visible 或 Displayed,它会回答一个元素but NOT
正确的答案是使用page.waitFor()
或检查元素大小或可见性page.waitForFunction()
,请参阅下面的说明。
// wait until present on the DOM
// await page.waitForSelector( css_selector );
// wait until "display"-ed
await page.waitForFunction("document.querySelector('.btnNext') && document.querySelector('.btnNext').clientHeight != 0");
// or wait until "visibility" not hidden
await page.waitForFunction("document.querySelector('.btnNext') && document.querySelector('.btnNext').style.visibility != 'hidden'");
const btnNext = await page.$('.btnNext');
await btnNext.click();
解释
存在于页面 DOM 上的元素如果具有 CSS 属性并不总是可见的,display:none
或者visibility:hidden
为什么使用page.waitForSelector(selector)
不是一个好主意,让我们看看下面的片段中的不同之处。
function isExist(selector) {
let el = document.querySelector(selector);
let exist = el.length != 0 ? 'Exist!' : 'Not Exist!';
console.log(selector + ' is ' + exist)
}
function isVisible(selector) {
let el = document.querySelector(selector).clientHeight;
let visible = el != 0 ? 'Visible, ' + el : 'Not Visible, ' + el;
console.log(selector + ' is ' + visible + 'px')
}
isExist('#idA');
isVisible('#idA');
console.log('=============================')
isExist('#idB')
isVisible('#idB')
.bd {border: solid 2px blue;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="bd">
<div id="idA" style="display:none">#idA, hidden element</div>
</div>
<br>
<div class="bd">
<div id="idB">#idB, visible element</div>
</div>
在上面的代码片段中,函数isExist()
是模拟
page.waitForSelector('#myId');
我们可以看到,同时运行isExist()
两个元素#idA
的#idB
是回报存在。
但是,当运行isVisible()
在 #idA
不可见或dislayed。
这里还有其他对象来检查元素是否显示或使用 CSS 属性display
。
scrollWidth
scrollHeight
offsetTop
offsetWidth
offsetHeight
offsetLeft
clientWidth
clientHeight
用于样式visibility
检查与 not hidden
。
注意:我不擅长 Javascript 或英语,请随时改进此答案。