学过或者了解过Appium、Selenium都知道,等待元素加载一般常用的三种方法:
- 强制等待
- 隐试等待
- 显示等待
(1)强制等待 ----sleep
示例:Thread.sleep(10000); 强制等待10s
强制等待方式不是全局限制,10s的等待时间只是对当前操作生效。
package com.sandy;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class ElementWait {
private static WebDriver driver;
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "E:\\eclipse_jar\\selenium_jar\\chromedriver.exe");
driver = new ChromeDriver();
driver.get("http://www.baidu.com/");
driver.manage().window().maximize(); //最大化
WebElement element = driver.findElement(By.name("tj_trnews")); //目标元素
Thread.sleep(1000); //强制等待1s
driver.quit();
}
}
(2)隐式等待 ----implicitlyWait
示例:driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
全局等待30s,不管元素是否已经加载出来。
当使用了隐式等待的时候,如果WebDriver没有找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常
换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找DOM,默认的时间是0
一旦设置了隐式等待,则它存在整个WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢。
它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。
implicitly_wait()方法比sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找DOM,默认的时间是0
一旦设置了隐式等待,则它存在整个WebDriver 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢。
它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。
implicitly_wait()方法比sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
package com.sandy;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
public class ElementWait {
private static WebDriver driver;
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "E:\\eclipse_jar\\selenium_jar\\chromedriver.exe");
driver = new ChromeDriver();
driver.get("http://www.baidu.com/");
driver.manage().window().maximize(); //最大化
WebElement element = driver.findElement(By.name("tj_trnews")); //目标元素
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); //隐式等待
driver.quit();
}
}
(3)显示等待 ----WebDriverWait
显示等待,这个需要增加一定等待时间,显示等待时间可以通过WebDriverWait 和util来决定,如果该元素在设置的等待时间(示例设置的时间是30s)以内出现就不在等待。
显示等待也可以这样写:
WebElement element = (new WebDriverWait(driver, 30).until(ExpectedConditions.presenceOfElementLocated(By.name("tj_trnews"))));
package com.sandy;
import java.util.concurrent.TimeUnit;
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.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
public class ElementWait {
private static WebDriver driver;
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "E:\\eclipse_jar\\selenium_jar\\chromedriver.exe");
driver = new ChromeDriver();
driver.get("http://www.baidu.com/");
driver.manage().window().maximize(); //最大化
/**
* 显示等待,等待时间设置的时30s
* element即时所需要等待的元素
*/
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return driver.findElement(By.name("tj_trnews"));
}
});
driver.quit();
}
}