技术分享 | app自动化测试(Android)--显式等待机制

WebDriverWait类解析

WebDriverWait 用法代码

Python 版本
WebDriverWait(
    driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
 

参数解析:

driver:WebDriver 实例对象

timeout: 最长等待时间,单位秒

poll_frequency: 检测的间隔步长,默认为 0.5s

ignored_exceptions: 执行过程中忽略的异常对象,默认只忽略 TimeoutException 异常类

Java 版本

WebDriverWait(WebDriver driver, long timeOutInSeconds)
 

Java 版本常用的有两个参数,参数解析:

driver:WebDriver 实例对象

timeOutInSeconds: 最长等待时间,单位秒

until、util_not用法
WebDriverWait 通常与 until 和 util_not 结合使用,Java 与 Python 用法相同。

until(method, message=’’) 在规定时间内,每隔一段时间调用一下 method 方法,直到返回值为 True,如果超时抛出带有 message 的 TimeoutException 异常信息

until_not(method, message=’’) 与 until( ) 方法相反,表示在规定时间内,每隔一段时间调用一下 method 方法,直到返回值为 False,如果超时抛出带有 message 的 TimeoutException 异常信息

expected_conditions介绍
expected_conditions 是 Selenium 的一个模块,其中包含一系列可用于判断的条件。可以用来判断页面的元素是否可见,是否可点击等操作。

导入
需要先导入这个模块,导入代码如下:

Python 版本:

from selenium.webdriver.support import expected_conditions
 
  • Java 版本:
import org.openqa.selenium.support.ui.ExpectedConditions;
 
方法介绍

1.判断元素是否被加到了 DOM 树里,并不代表该元素一定可见,用法如下:

  • Python 版本
WebDriverWait().until(
    expected_conditions.presence_of_element_located(locator))
 
  • Java 版本
new WebDriverWait( )\
    .until(ExpectedConditions.presenceOfElementLocated(locator));
 

2.visibility_of_element_located(locator) 方法,用来判断某个元素是否可见(可见代表元素非隐藏,并且元素的宽和高都不等于 0,用法如下:

  • Python 版本
WebDriverWait().until(
    expected_conditions.visibility_of_element_located(locator))
 
  • Java 版本
new WebDriverWait( ).until(
        ExpectedConditions.visibilityOfElementLocated(locator));
 

3.element_to_be_clickable(locator) 方法,判断某元素是否可见并能点击,用法如下:

  • Python 版本
WebDriverWait().until(
    expected_conditions.element_to_be_clickable((By.ID, "kw")))
 
  • Java 版本
new WebDriverWait( ).until(
    ExpectedConditions.elementToBeClickable(locator));
 

案例

使用“雪球”应用,打开雪球 APP,点击页面上的搜索输入框输入“alibaba”,然后在搜索联想出来的列表里面点击“阿里巴巴”,选择股票分类,获取股票类型为“09988”的股票价格,最后验证价格大于 170,核心代码如下:

Python 版本
...
def test_wait(self):
    # 点击搜索输入框
    self.driver.find_element_by_id(
        "com.xueqiu.android:id/tv_search").click()
    # 输入 “alibaba”
    self.driver.find_element_by_id(
        "com.xueqiu.android:id/search_input_text"
        ).send_keys("alibaba")
    # 点击“阿里巴巴”
    self.driver.find_element_by_xpath("//*[@text='阿里巴巴']").click()
    # 点击“股票”
    self.driver.find_element_by_xpath(
        "//*[contains(@resource-id,'title_container')]//*[@text='股票']"
        ).click()
    # 获取股票价格
    locator = (MobileBy.XPATH,
    "//*[@text='09988']/../../..\
    //*[@resource-id='com.xueqiu.android:id/current_price'")
 
    ele = WebDriverWait(self.driver,10)\
    .until(expected_conditions.element_to_be_clickable(locator))
    print(ele.text)
    current_price = float(ele.text)
    expect_price = 170
    # 判断价格大于 expect_price
    assert current_price > expect_price
...
 
Java 版本
...
private final By locator = By.xpath("//*[@text='09988']/../../..\
    //*[@resource-id='com.xueqiu.android:id/current_price'");
 
@Test
public void waitTest(){
    // 点击搜索输入框
    driver.findElementById("com.xueqiu.android:id/tv_search").click();
    // 输入 “alibaba”
    driver.findElementById("com.xueqiu.android:id/\
        search_input_text").sendKeys("alibaba");
    // 点击“阿里巴巴”
    driver.findElementByXPath("//*[@text='阿里巴巴']").click();
    // 点击“股票”
    driver.findElementByXPath("//*[contains(@resource-id,\
        'title_container')]//*[@text='股票']").click();
    // 获取股票价格
    WebDriverWait wait=new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.elementToBeClickable(locator));
    String locatorText = driver.findElement(locator).getText();
    System.out.println(locatorText);
 
    float currentPrice = Float.parseFloat(locatorText);
    float expectPrice = 170;
    //判断价格大于 expect_price
    assertThat(currentPrice, greaterThan(expectPrice));
}
...
 

这条测试用例仅仅使用隐式等待是解决不了问题的,因为【当前价格】这个元素一直在,而实际需要等待的是这个元素是否处于可点击的状态。

上面的代码通过判断元素是否可点击的方法来判断元素是否处于可点击状态,中间添加了 10 秒的等待时间,在 10 秒之内每隔 0.5 秒查找一次元素,如果找到了这个元素,就继续向下执行,如果没找到就抛出 TimeoutException 异常信息。显式等待可以在某个元素上灵活的添加等待时长,尤其是文件上传,或者资源文件下载的场景中,可以添加显式等待,提高脚本的稳定性。

一般来说,在项目中会使用隐式等待与显式等待结合的方式,定义完 driver 之后立即设置一个隐式等待,在测试过程中需要判断某个元素属性的时候,再加上显式等待。

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。 

相关推荐

  1. APP自动化测试-Appium元素定位之元素等待

    2023-12-22 19:22:05       36 阅读
  2. 等待、隐等待、强制等待

    2023-12-22 19:22:05       29 阅读
  3. 详解Selenium 强制等待、隐等待等待

    2023-12-22 19:22:05       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-22 19:22:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-22 19:22:05       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-22 19:22:05       87 阅读
  4. Python语言-面向对象

    2023-12-22 19:22:05       96 阅读

热门阅读

  1. 【LeetCode】232. 用栈实现队列(Stack类 & Vector类)

    2023-12-22 19:22:05       69 阅读
  2. 前端websocket实体类,开箱即用

    2023-12-22 19:22:05       56 阅读
  3. uni-app上传音频,图片步骤

    2023-12-22 19:22:05       56 阅读
  4. Spring启用https

    2023-12-22 19:22:05       73 阅读
  5. C语言 空指针导致内存溢出

    2023-12-22 19:22:05       67 阅读
  6. Cookie中的Expiry标示是什么

    2023-12-22 19:22:05       56 阅读
  7. ZooKeeper 集群搭建

    2023-12-22 19:22:05       60 阅读