selenium脚本中增加时间等待有助于提高脚本的稳定性、健壮性。selenium为我们提供了三种设置时间等待的方式。
一、强制等待
Thread.sleep():固定休眠时间设置,Java的Thread类里提供了休眠方法sleep,导入包后就能使用;
sleep()方法以毫秒为单位 ,简单粗暴但不够智能
Thread.sleep(3000);
// 执行到这里时,固定等待三秒之后,再接着执行后面的操作
二、隐式等待
使用 implicitlyWait 方法设定查找页面元素的最大等待时间,调用 findElement 方法时没有立刻找到定位元素,则程序会每间隔一定时间后不断尝试判断页面的DOM中是否出现被查找元素,若超过设定的等待时长依然没有找到,则抛出 NoSuchElementException;
- 一旦设置,隐式等待会在WebDriver对象实例的整个生命周期生效,无需重复设置.
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
//针对所有findElement方法,最长等待10s
//第一个参数将接受时间作为整数值,第二个参数将接受时间测量
//包括SECONDS,MINUTES,MILISECOND,MICROSECONDS,NANOSECONDS,DAYS,HOURS等
三、显式等待
显示等待更节约脚本的执行时间,效率最高.
显示等待分为两类:
- 系统提供:ExpectedConditions 类中提供了一些常见的显示等待的方法
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");
WebElement element = (new WebDriverWait(driver,5))
.until(ExpectedConditions.presenceOfElementLocated(By.id("kw")));
/**
* 上面第三条语句表示,在0-5s中去定位id为“kw”的元素,
* WebDriverWait默认每500ms就调用一次ExpectedCondition
* 直到定位成功或者时间截止,ExpectedCondition的返回值要么
* 为true要么为不为空的对象,在规定时间内若没有定位成功元素,
* 则until()会抛出org.openqa.selenium.TimeoutException
*/
- 自定义:用户自定义的去编写适合自己的显示等待.
Boolean boo = (new WebDriverWait(driver, 5)).until(new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver arg0) {
return driver.findElement(By.id("kw")).isDisplayed();
}
});
Assert.assertTrue(boo);
/**
* 自定义的显示等待,判断id = kw 的元素在5s是否可见;
* 如果可见,则返回true;
* 如果5s后仍不可见,则返回false
*/
推荐使用显示等待的方式以提高脚本的执行效率.