WebDriver提供了两种类型的等待:显式等待和隐式等待。
1.显示等待
WebDriver提供了显式等待方法,专门针对某个元素进行等待判断。
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.WebDriverWait; import org.openqa.selenium.support.ui.ExpectedCondition; public class TimeOut01 { public static void main(String[]args) throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("https://www.baidu.com"); //显式等待, 针对某个元素等待 WebDriverWait wait = new WebDriverWait(driver,10,1); //调用java内部类 wait.until(new ExpectedCondition<WebElement>(){ @Override public WebElement apply(WebDriver text) { return text.findElement(By.id("kw")); } }).sendKeys("selenium"); driver.findElement(By.id("su")).click(); Thread.sleep(2000); driver.quit(); } }
WebDriverWait类是由WebDirver提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:
WebDriverWait(driver, 10, 1)
driver: 浏览器驱动。 10: 最长超时时间, 默认以秒为单位。 1: 检测的的间隔(步长) 时间, 默认为 0.5s。
2.隐式等待
WebDriver 提供了几种方法来等待元素。
- implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常。
- setScriptTimeout。异步脚本的超时时间。WebDriver可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间。
- pageLoadTimeout。页面加载时的超时时间。因为WebDriver会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么WebDriver就会抛出异常。
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.WebDriver; import org.openqa.selenium.By; import java.util.concurrent.TimeUnit; public class TimeOut02 { public static void main(String[] args){ WebDriver driver = new ChromeDriver(); //页面加载超时时间设置为 5s driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS); driver.get("https://www.baidu.com/"); //定位对象时给 10s 的时间, 如果 10s 内还定位不到则抛出异常 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.findElement(By.id("kw")).sendKeys("selenium"); //异步脚本的超时时间设置成 3s driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS); driver.quit(); } }