UI自动化实践过程中,我们经常会遇到页面元素找不到的错误,而照成这种错误的很大原因就是我们脚本执行速度远远快于元素加载速度,也就是说元素还没有加载,而我们的脚本已经去执行操作该元素。那为了避免这个问题的发生,往往我们需要在脚本中加入等待操作,等待页面元素加载后脚本再继续往下执行。
等待元素加载通常有三种方式:
- 线程等待
- 全局等待(隐示等待)
- 显示等待
线程等待:
Thread.sleep(xxxx)
以往我们都用了这种方式去等待一个页面元素的加载,但这种方式我们在实际工作中是非常不建议使用。 原因是如果时间设置过长则脚本执行效率就降低,时间设置过短,万一网络等因素页面元素加载慢了,则会出现元素找不到的错误。
全局等待:
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS)
全局等待设置于实例化WebDriver 之后,虽然很便利,但也不是太推荐,往往在一些异步加载的元素上即使页面元素已经出现也需要等待你设置的时间长度。
代码例子:
WebDriver driver;
@BeforeTest
public void openBrowser() {
System.setProperty("webdriver.chrome.driver", "./drivers/chromedriver.exe");
driver = new ChromeDriver();
// 设置全局等待时间为 30S
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
显示等待:
new WebDriverWait(driver, 30).until(ExpectedConditions.presenceOfElementLocated(By))
例子
测试用例
1. 打开UI测试界面
2. 点击wait按钮
3. 获取文本值,并打印
代码示例
@Test
public void waitTest() {
driver.get("file:///D:/html/index.html");
// 点击 wait 按钮
driver.findElement(By.xpath("//*[@id=\"wait\"]/input")).click();
// 定位 文本
By el = By.xpath("//*[@id=\"display\"]/div");
// 等待元素加载
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.presenceOfElementLocated(el));
// 获取 文本值
String text = driver.findElement(el).getText();
System.out.println(text);
}
实际过程我们都推荐使用显示等待,但如果每个 元素都这么写是不是觉得很麻烦?这里可以去思考下,如何让显示等待方式简单化。