强制等待
// 1、强制等待
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
隐式等待
原理:在创建driver时,为浏览器对象设置一个全局的等待时间。这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常。 注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内不断的刷新页面去寻找我们需要的元素。
每个findElement都会进行隐式等待,在等待时间内不断的判断是否找到元素,一旦超过等待时间并且没有寻找到元素,抛出异常。
// 2、隐式等待
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
显示等待
原理:显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么就抛出Exception。
以上方法的使用例子:
// 3、显示等待
WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.presenceOfElementLocated(By.linkText("人工智能")));
System.out.println("人工智能导航块是存在的");
wait.until(ExpectedConditions.elementToBeClickable(By.linkText("人工智能")));
System.out.println("人工智能导航块是可用的并且可以被单击");
// 这里没有在csdn网站找的好的例子,只给出模板
// WebElement s = driver.findElement(By.id(""));
// s.click();
// wait.until(ExpectedConditions.elementToBeSelected(s));
// System.out.println("已经被选中");
WebElement t = driver.findElement(By.linkText("人工智能"));
wait.until(ExpectedConditions.textToBePresentInElement(t, "智能"));
System.out.println("该导航块包含‘智能’二字");
// 由于csdn每次搜索框的value可能是不同的,所以这个例子实践时有时会出现错误
// WebElement s = driver.findElement(By.id("toolber-keyword"));
// wait.until(ExpectedConditions.textToBePresentInElementValue(s, "Python进阶之路"));
// System.out.println("搜索框的value值‘是Python进阶之路’");
wait.until(ExpectedConditions.titleContains("CSDN"));
System.out.println("页面title包含‘CSDN’");
自定义等待(显示等待)
// 4、自定义的显示等待
WebElement input = (new WebDriverWait(driver, 5).until(new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(WebDriver arg0) {
return driver.findElement(By.linkText("人工智能"));
}
}));
System.out.println(input);
Boolean flag = (new WebDriverWait(driver, 5).until(new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver arg0) {
return driver.findElement(By.linkText("人工智能")).getText().contains("人");
}
}));
System.out.println(flag);
自定义等待也属于显示等待。这里要注意的是ExpectedCondition<V>的泛型V必须是包装器类型,而不能是基本数据类型。方法返回值是自定义的,所以可以自定义的接收返回值。apply方法中实现自定义的控制逻辑,如果抛出异常将会将异常抛出到until方法中,最终抛出timeout异常。