java+selenium3-等待机制
等待机制
实际问题
当我们在用selenium定位元素时,需要页面元素加载完成后才能操作,否则会抛出异常,所以在测试中添加合理的等待时间是非常必要的。
selenium提供了多种等待机制:显示等待、隐式等待和流畅等待。
显示等待
显示等待比隐式等待更节约测试脚本执行的时间,使用ExceptedCondtions类中的方法可以进行显示等待的判断。
显示等待可以自定义等待的条件,用于更加复杂的页面元素判断。
常用的显示等待条件
等待条件 | WebDriver方法 |
页面元素是否在页面上可用和可被单击 | elementToBeClickable(By locator) |
页面元素处于被选中状态 | elementToBeSelected(WebElement element) |
页面元素在页面中存在 | presenceOfElementLocated(By locator) |
在页面元素中是否包含特定的文本 |
textToBePresentInElement(By locator) |
页面元素值 | textToBePresentInElementValue(Bylocator locator, String text) |
标题 | titleContains(String title) |
test.html
<!DOCTYPE html> <html> <head> <title>你喜欢的水果</title> </head> <body> <p>请选择你喜欢的水果</p><br> <select name="fruit"> <option id="peach" value="taozi">桃子</option> <option id="watermelon" value="xigua">西瓜</option> </select> <br> <input type="checkbox" name="是否喜欢水果"></input> <br><br> <input type="text" id="text" value="今天的西瓜相当甜"> </body> </html>
Test.java
//显示等待 WebDriverWait wait = new WebDriverWait(driver, 10); //获取网页标题 wait.until(ExpectedConditions.titleContains("水果")); System.out.println("1.网页出现水果的标题"); //获取下拉列表中的桃子选项 WebElement selElement = driver.findElement(By.xpath("//option[@id='peach']")); wait.until(ExpectedConditions.elementToBeSelected(selElement)); System.out.println("2.桃子处于选中状态"); //判断单选框状态 wait.until(ExpectedConditions.elementToBeClickable(By.xpath("/html/body/input[1]"))); System.out.println("3.页面单选框处于显示和可被单击状态"); //判断p标签状态 wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("/html/body/p"))); System.out.println("4.页面的p元素已显示"); //获取p标签对象 WebElement pEle = driver.findElement(By.xpath("/html/body/p")); //判断p标签是否包含某些内容 wait.until(ExpectedConditions.textToBePresentInElement(pEle, "喜欢的水果")); System.out.println("end");
只有满足显式等待的条件满足,代码才会继续执行后续的测试逻辑
如果超过设定的最大显式等待时间, 测试程序会抛出异常。
隐式等待
隐式等待是等待整个页面加载完成,针对的是整个页面。
implicitlyWait方法设定查找页面元素的最大等待时间,当调用findElement方法没有找到定位的元素时,
则程序每隔一段时间就会尝试再次寻找,若超过设定的最大时间,则将抛出NoSuchElementException异常
//隐式等待 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); try { WebElement inputSearch = driver.findElement(By.id("kw")); inputSearch.sendKeys("hello"); } catch (NoSuchElementException e){ e.printStackTrace(); }
流畅等待
FluentWait就是一个普通的类,我们使用这个类能支持一直等待直到特定的条件出现。
1)是一个类而且是包org.openqa.selenium.support.ui的一部分
2)是Wait接口的一种实现
3)每个Fluent wait,我们可以设置等待最大时间,而且可以做设置等待的频率去检查一些特定的条件。
流畅等待与显示等待的区别
FluentWait 和 Explicit Wait的区别:简单来说就是Explicit Wait里有一些设定好了的前置条件的等待方式,而Fluent wait你可以设置自己的方法去处理各种等待的问题。