# （十一）设置元素等待




<br>
WebDriver提供了两种类型的等待：__显式等待__和__隐式等待__。


### 显式等待

WebDriver提供了显式等待方法，专门针对某个元素进行等待判断。

```java
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);

    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。

<br>
### 隐式等待

WebDriver 提供了几种方法来等待元素。

* implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常。

* setScriptTimeout。异步脚本的超时时间。WebDriver可以异步执行脚本，这个是设置异步执行脚本脚本返回结果的超时时间。

* pageLoadTimeout。页面加载时的超时时间。因为WebDriver会等页面加载完毕再进行后面的操作，所以如果页面超过设置时间依然没有加载完成，那么WebDriver就会抛出异常。

```java
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();
  }
}
```




原始封面

![课程图片](https://images.unsplash.com/photo-1519389950473-47ba0277781c?w=300)


