app自动化测试(Android)--显式等待机制

简介: 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 之后立即设置一个隐式等待,在测试过程中需要判断某个元素属性的时候,再加上显式等待。

相关文章
|
30天前
|
Android开发 移动开发 小程序
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
|
2天前
|
前端开发 JavaScript Android开发
手机APP开发|基于安卓APP实现掌上党支部——党员app
手机APP开发|基于安卓APP实现掌上党支部——党员app
|
2天前
|
Java API Android开发
安卓开发app 调用usb 摄像头 需要用到哪个库
在安卓开发中,调用USB摄像头常常使用libuvc库,这是一个跨平台处理USB视频设备的库。有多个基于libuvc的开源项目简化了在安卓上的使用,如UVCCamera和Android EasyCap UVC。例如,UVCCamera提供了一个更简单的接口来访问USB摄像头,并且可以在Jetpack Compose中显示预览。开发者可以参考官方文档、开源项目以及相关教程和资源来学习和实现这一功能。
|
3天前
|
存储 Android开发 Kotlin
Kotlin开发安卓app,在使用 MediaPlayer 播放 res/raw 中的音乐时遇到突然中断的问题,而 onErrorListener 没有接收到任何报错
在使用 Android MediaPlayer 播放 res/raw 中的音乐时遇到中断问题,可能的原因包括资源问题、媒体文件编码格式、生命周期管理和设备资源配置。要排查问题,检查音频文件是否正确包含,格式编码是否支持,MediaPlayer 是否正确管理及释放,以及设备是否有足够存储和配置。通过设置 onErrorListener 日志和确保在 onDestroy 中释放资源来调试。如果文件过大,考虑使用 AssetManager。遵循这些步骤可帮助诊断并解决播放中断的问题。
|
4天前
|
Android开发 Kotlin
kotlin开发安卓应用 如何修改app安装后的名称
在 Android 应用中,要修改安装后的显示名称,需更新 AndroidManifest.xml 文件中 application 标签的 android:label 属性。可直接在该属性内设置新名称,或在 res/values/strings.xml 文件中修改 app_name 并在 manifest 中引用。推荐使用 strings.xml 方式,以便支持多语言和集中管理。
|
4天前
|
缓存 Android开发 Kotlin
【安卓app开发】kotlin Jetpack Compose框架 | 先用OKhttp下载远程音频文件再使用ExoPlayer播放
使用 Kotlin 的 Jetpack Compose 开发安卓应用时,可以结合 OkHttp 下载远程音频文件和 ExoPlayer 进行播放。在 `build.gradle` 添加相关依赖后,示例代码展示了如何下载音频并用 ExoPlayer 播放。代码包括添加依赖、下载文件、播放文件及简单的 Compose UI。注意,示例未包含完整错误处理和资源释放,实际应用需补充这些内容。
|
4天前
|
存储 Android开发 Kotlin
开发安卓app OKhttp下载后使用MediaPlayer播放
在Android Jetpack Compose应用程序中,要使用OkHttp下载远程音频文件并在本地播放,你需要完成以下几个步骤: 1. **添加依赖**:确保`build.gradle`文件包含OkHttp和Jetpack Compose的相关依赖。 2. **下载逻辑**:创建一个`suspend`函数,使用OkHttp发起网络请求下载音频文件到本地。 3. **播放逻辑**:利用`MediaPlayer`管理音频播放状态。 4. **Compose UI**:构建用户界面,包含下载和播放音频的按钮。
|
4天前
|
存储 Android开发
安卓app,MediaPlayer播放本地音频 | 按钮控制播放和停止
在Jetpack Compose中,不直接操作原生Android组件如`Button`和`MediaPlayer`,而是使用Compose UI构建器定义界面并结合ViewModel管理音频播放逻辑。以下示例展示如何播放本地音频并用按钮控制播放/停止:创建一个`AudioPlayerViewModel`管理`MediaPlayer`实例和播放状态,然后在Compose UI中使用`Button`根据`isPlaying`状态控制播放。记得在`MainActivity`设置Compose UI,并处理相关依赖和权限。
|
7天前
|
安全 Android开发 数据安全/隐私保护
同样的 APP 为何在 Android 8 以后网络感觉变卡?
【6月更文挑战第8天】Android 8 及以后系统中,APP 网络感觉变卡源于更严格的安全机制和后台限制,系统对网络优化的侧重改变,以及APP自身兼容性问题。开发者需优化APP,适应新系统,用户可更新APP或检查权限设置。通过共同努力,有望改善网络卡顿现象,提升用户体验。
|
17天前
|
安全 物联网 测试技术
构建未来:Android与IoT设备的无缝交互深入探索软件自动化测试的未来趋势
【5月更文挑战第30天】在物联网(IoT)技术快速发展的当下,Android系统因其开放性和广泛的用户基础成为了连接智能设备的首选平台。本文将探讨如何通过现代Android开发技术实现智能手机与IoT设备的高效、稳定连接,并分析其中的挑战和解决方案。我们将深入挖掘Android系统的底层通信机制,提出创新的交互模式,并通过实例演示如何在Android应用中集成IoT控制功能,旨在为开发者提供一套可行的指导方案,促进IoT生态系统的进一步发展。

热门文章

最新文章