selenium的等待,有种情况必须写死等待时间。
Posted 在天成象
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了selenium的等待,有种情况必须写死等待时间。相关的知识,希望对你有一定的参考价值。
代码都是手打,方法名可能出现部分字段错误,但大部分字段不会错误,对比这个类的所有方法就能明白我写的是哪个方法. 错误也是大致的意思,因为这只是我的总结。
页面元素定位并操作的问题大致分以下4种,这里按照顺序讲:
1. 首先是元素不存在,也就是element not existed。 这时候可以设置全局等待时间:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);这句代码的含义就是元素不存在时会等待,直到10s。
2. 元素存在,但是被遮挡了或者隐藏了,这时候就是element not visited、clickable。就算你上面添加了那句也没用,因为元素存在啊。这时候大可不必写死让线程水几秒。而是可以让线程每次睡0.5s,直到10s后。方式:
int i = 0;
while(i<20){
try{
WebElement element = driver.findElement(By);
if(element.isDisplay()){
return element;
}
Thread.currentThread().sleep(500);
}catch(Exception e){
Thread.currentThread().sleep(500);
}
i++;
}
3. 接下来就是我要说的比较坑的一个,也是上面那个情况的变种。用例操作步骤是点击弹窗的确定按钮,弹窗消失后点击被弹窗挡住焦点的某个按键。情况是:点击弹窗口,页面关弹窗的时候卡了一下,但是这时候没刷新页面,卡完了才刷新页面。
这时候就有个问题了。关弹窗卡的时候,你要点的元素存在,因为是隐藏状态,所以在第2点代码(上面我写的代码)处等待显示;关闭弹窗后,页面刷新了,然后页面元素要重新加载才行,而代码如果恰好走到
element.isDisplay()这行,那么就会报错:element is not attached in page。 解决办法就是写死Thread.currentThread().sleep(3000); 没办法,因为element并没有提供isClicked()方法。按照webdriver的
想法:既然存在并且没有被遮挡和隐藏,那就可以点击,除非本身就不可以点击。
以上是关于selenium的等待,有种情况必须写死等待时间。的主要内容,如果未能解决你的问题,请参考以下文章