有时候页面元素不是当下就出现的,这个时候就需要等待元素出现后再继续后面的操作了。
/**
* 1. 线程休眠---Thread.sleep(long millis);
* 强制等待,硬性等待--不确定具体需要等待多久时间的时候,容易造成时间的浪费
* 例子:Thread.sleep(2000);
*
* 2. 隐式等待---TimeOuts--implicitlyWait
* 设置方式:driver.manage.timeouts().implictlyWait(long time,TimeUnit unit)
* 例子:driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
* 特点:相对灵活(优),设置是针对全局的,在WebDriver实例整个生命周期有效,但并不是所有元素都需要等待(缺)
*
* 3. 显式等待--可以自己指定某个元素需要等待(在有必要进行等待的时候再执行等待)
* 每隔0.5秒扫描一次页面,检查元素是否满足等待结果条件,比如查找元素,则检查元素是否存在,存在的话返回true,不存在则继续等待,知道找到或超时。
* 特点:不是针对全局的,只有需要进行等待的元素才执行等待,可以自己设置场景(条件),条件满足时再继续执行
*/
显式等待的代码如下:
/**
* 智能查找元素方法,设置任意等待时间
* @param by
* @param timeOutInSeconds
* @return
*/
public WebElement getElement(By by,long timeOutInSeconds) {
WebDriverWait wait=new WebDriverWait(driver, timeOutInSeconds);
WebElement element=wait.until(new ExpectedCondition<WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(by);
}
});
return element;
}
/**
* 智能查找元素方法,设定等待时间为5s
* @param by
* @return
*/
public WebElement getElement(By by) {
return getElement(by,5);
}
PS: 有时对于页面加载时间有要求时,需要处理一下超时时页面仍位加载完成的情况:
public void f(){
try {
//页面超时3s,需要设置在get请求之前
driver.manage().timeouts().pageLoadTimeout(3, TimeUnit.SECONDS);
driver.get("https://docs.seleniumhq.org/download/");
//get:需要等待网页的所有请求全部加载完毕,才会进行下一步的操作:当前页面资源,异步请求(其他站点)
} catch (ImeNotAvailableException e) {
System.out.println("页面加载超时,提bug");
//超时后仍想后续的操作--让页面停止加载继续后面的操作,可以提高脚本的执行效率
//js执行器让页面停止加载
JavascriptExecutor javascriptExecutor=(JavascriptExecutor) driver;
javascriptExecutor.executeScript("window.stop()");
}
getElement(By.id("q")).sendKeys("driver");
}