定位元素的等待方法
1、sleep()方法
Thread.sleep(60000)强制等待60s
这个方法是最不推荐的,是用线程等待的方式来实现,每次元素出现在页面的时间不一样,如果设置的时间长了,白白浪费了时间,如果设置的时间短了,脚本依然会报没有找到元素的错误。
2、WebDriver PageLoadTimeOut()方法
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
这个方法实际上跟上面那个是一样的,也不推荐
3、隐式等待implicitlyWait()
driver.manage().timeouts().implicitlyWait(second, TimeUnit.SECONDS); //second为等待时间,单位秒
针对Driver 每次执行命令的最长执行时间,也可以理解为超时时间。但参数只有时间,这就导致我需要什么元素出现,我不一定能等到它。
原理:隐式等待,就是在创建driver时,为浏览器对象设置一个等待时间。这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
注:此处设置的等待时间 是针对全局设置的,webdriver中执行所有命令的超时时间都设置为second秒了
注:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内不断的刷新页面去寻找我们需要的元素
改进后方法:
private boolean isElementPresent(By by) {
try {
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
4、显示等待WebDriverWait()
public static void waitForLoad(WebDriver driver, final By locator, int timeOut) {
WebDriverWait wait = new WebDriverWait(driver, timeOut); // timeOut为等待时间,单位秒
wait.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
boolean loadcomplete = d.findElement(locator).isDisplayed();
return loadcomplete;
}
});
}
WebDriverWait wait = new WebDriverWait(driver, timeOut); // timeOut为等待时间,单位秒
wait.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
boolean loadcomplete = d.findElement(locator).isDisplayed();
return loadcomplete;
}
});
}
newWebDriverWait(driver,10).until(
ExpectedConditions.presenceOfElementLocated(By.cssSelector("css locator")));
原理:显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就跳出Exception.(简而言之:就是直到元素出现才去操作,如果超时则报异常)
改进后方法:
WebElementelementId=(newWebDriverWait(driver,10)).until(
new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d){
return d.findElement( By.id("id locator"));
}
}
);
显式与隐式的区别:
显示等待是针对某个元素的等待相当于局部的,隐身等待是针对driver实例来的相当于是全局的。一般情况使用显示等待。