更多关于Selenium的知识请访问CSND论坛“兰亭序咖啡”的专栏:
专栏《Selenium 从入门到精通》
目录
需要等待的场景
在 UI 自动化时,我们通常需要等待,比如以下场景:
- 登录后,页面会跳转,我们需要等待页面完全加载(否则,没ready访问元素会找不到)
- 点击搜索按钮后,页面异步刷新,我们需要等待加载框消失(否则,结果还没有update,拿到错误的数据)
- 页面满足部分条件后,预定按钮才会可以点击,我们需要等待它变成激活状态(否则,按钮还是disabled的状态,出现点击报错)
- ……
总之,这些等待,对于我们测试的稳定性和正确性非常重要。
自己实现等待逻辑
最简单的方法是,我们自己写一个While循环不断地检查条件是否满足。
while(true){
if(checkCondition()){
doSomeThing();
}else{
Thread.sleep(n秒);
}
}
不过这么做不但麻烦,自己实现也容易出错。值得庆幸的是,Selenium 就提供了内置的机制,帮助我们实现等待的功能。
学习中可以造轮子,帮助我们理解原理,但是生产项目中尽量用成熟的轮子。
Selenium 提供的三种等待机制
Selenium 查找元素默认是没有等待的,也就是说找到了就返回WebElement,否则就抛出异常。
我们测试一下,没有配置任何等待:
@Test
public void testDefault(){
WebDriver driver = null;
long begin = 0;
try{
driver = new ChromeDriver();
driver.get("https://mail.163.com");
begin = System.currentTimeMillis();
WebElement element = driver.findElement(By.id("inexistence"));
}finally {
long end = System.currentTimeMillis();
log.info("花费时间:{}毫秒", end-begin);
driver.close();
}
}
日志打印:-- 花费时间:100毫秒(这个很短的时间是findElem