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你可以设置自己的方法去处理各种等待的问题。

原文地址:https://www.cnblogs.com/marton/p/11374333.html