本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:UIautomator2.0是Google推出的升级版Android UI测试框架,具有性能和功能的提升。本指南将详细介绍如何编写UIautomator2.0脚本,包括安装配置、基本用法、查找UI元素、执行操作、断言与等待、异常处理、多线程与并发、测试用例与测试套件,以及运行与调试。目的是帮助开发者更好地理解和运用UIautomator2.0进行高效的自动化测试。 UI Automator 2.0

1. UIautomator2.0框架概述

1.1 UIautomator2.0的定义与用途

UIautomator2.0是一个轻量级的自动化测试框架,专门用于Android设备上的UI测试。开发者和测试工程师可以利用该框架编写脚本,来模拟用户在设备上的操作,如点击、滑动、输入文本等,以实现对应用界面的自动化测试。

1.2 UIautomator2.0的核心优势

相较于其他自动化测试工具,UIautomator2.0的主要优势在于其能够跨应用进行操作,即可以操作在不同应用中的UI组件。这意味着测试人员能够模拟复杂的用户场景,验证应用的深度交互功能,从而提高测试的覆盖率和效率。

1.3 UIautomator2.0在行业中的应用案例

在持续集成(CI)和持续部署(CD)流程中,UIautomator2.0被广泛应用于自动化回归测试和新版本功能验证。通过脚本可以快速模拟用户行为,及时发现并修复在功能迭代过程中引入的问题,确保产品质量的稳定性和可靠性。

2. 安装与配置步骤

2.1 系统需求与环境准备

2.1.1 确认开发环境和依赖库

在开始安装UIautomator2.0之前,确保你的开发环境已经安装了所有必要的依赖库。UIautomator2.0是基于Android平台的自动化测试工具,它要求开发机上安装有Android SDK和相应的开发工具。以下是安装UIautomator2.0前应满足的系统需求:

  • 操作系统 : 推荐使用Linux或Mac OS X,Windows用户可能需要额外配置环境以兼容Android命令行工具。
  • Python : UIautomator2.0要求Python版本至少为Python 2.7或Python 3.x。
  • Android SDK : 需要安装最新版本的Android SDK,并且已经下载并配置了至少一个Android平台版本。
  • Java Development Kit (JDK) : 确保安装了JDK 1.7或更高版本,因为部分工具和库需要JDK来编译和运行。
  • 开发工具 : 包括但不限于Android Studio、Adb工具、Gradle构建系统等。
代码块:
# 检查Java版本
java -version
# 安装Python(如果未安装)
sudo apt-get install python
# 检查Python版本
python --version
# 检查ADB版本(Android Debug Bridge)
adb version
参数说明:
  • java -version :用于检查当前安装的Java版本。
  • sudo apt-get install python :对于基于Debian的Linux系统,使用此命令安装Python。
  • python --version :检查Python版本是否满足要求。
  • adb version :确保Android Debug Bridge工具已安装,它是调试Android应用的重要工具。

2.1.2 下载与安装UIautomator2.0

安装UIautomator2.0相对简单,如果你已经满足了上述的系统需求,可以通过Python的包管理器pip来进行安装。以下是安装步骤:

步骤1:安装pip

如果你尚未安装pip,可通过以下命令进行安装(仅限于Linux和Mac OS X用户):

sudo apt-get install python-pip
步骤2:使用pip安装UIautomator2.0

打开终端或命令行界面,执行以下命令安装UIautomator2.0:

pip install uiautomator2
步骤3:验证安装

安装完成后,你可以通过以下命令来验证是否安装成功:

python -m uiautomator2 --version

如果系统返回了版本号,说明安装成功。

代码块:
# 使用Python脚本检查UIautomator2.0的安装状态
import uiautomator2 as u2
print(u2.__version__)
参数说明:
  • uiautomator2 as u2 :导入UIautomator2模块,并使用别名u2。
  • u2.__version__ :打印出安装的UIautomator2.0版本号。

2.2 配置开发环境

2.2.1 配置Android SDK

Android SDK是UIautomator2.0运行所必需的,配置Android SDK包括安装SDK以及设置环境变量,以便可以从命令行访问SDK的工具。

操作步骤:
  1. 下载并解压Android SDK,或者通过Android Studio安装。
  2. 定位到SDK的安装目录,找到 tools platform-tools 文件夹。
  3. 设置环境变量 ANDROID_HOME ,将其指向SDK的安装路径。
  4. platform-tools 添加到系统的PATH环境变量中,以方便使用 adb 命令。
代码块:
# 设置环境变量ANDROID_HOME
export ANDROID_HOME=/path/to/your/android/sdk
# 将platform-tools目录添加到PATH环境变量中
export PATH=$PATH:$ANDROID_HOME/platform-tools
参数说明:
  • ANDROID_HOME :环境变量,指向Android SDK的安装路径。
  • platform-tools :包含Android SDK工具如adb等。

2.2.2 设置环境变量

正确设置环境变量对于开发Android应用和进行自动化测试至关重要。以下是在Linux和Mac系统中设置环境变量的方法。

操作步骤:
  1. 打开终端。
  2. 输入 export 命令来设置环境变量。
  3. 如果需要永久设置环境变量,可以在用户的 .bashrc .bash_profile 文件中添加 export 命令。
  4. 使用 source 命令使设置立即生效。
代码块:
# 打开.bashrc文件,用于持久化环境变量配置
nano ~/.bashrc
# 在文件末尾添加以下行,替换相应的路径
export ANDROID_HOME=/path/to/your/android/sdk
export PATH=$PATH:$ANDROID_HOME/platform-tools
# 保存文件并退出,使用source命令使设置立即生效
source ~/.bashrc
参数说明:
  • nano ~/.bashrc :使用文本编辑器打开 .bashrc 文件。
  • export ANDROID_HOME export PATH :设置环境变量。
  • source ~/.bashrc :重新加载 .bashrc 文件,使设置立即生效。

2.3 验证安装

2.3.1 运行第一个UIautomator2.0脚本

安装并配置好UIautomator2.0后,可以尝试运行第一个脚本以验证安装是否成功。UIautomator2.0提供了一个简单的命令行界面来测试脚本的运行。

操作步骤:
  1. 打开终端。
  2. 使用以下命令连接到一个已经开启开发者选项的Android设备:
uiautomator2 init
  1. 然后运行一个简单的测试脚本:
uiautomator2 runtest example.py

这里 example.py 是一个示例脚本,你可以通过 uiautomator2 init 命令自动生成一个。

代码块:
# 示例脚本:example.py
from uiautomator2 import Device

device = Device('emulator-5554')  # 连接指定设备
device.info()  # 获取设备信息
参数说明:
  • uiautomator2 init :初始化测试环境,通常用于生成示例脚本或配置文件。
  • uiautomator2 runtest example.py :运行名为 example.py 的测试脚本。

2.3.2 检查输出结果与诊断问题

运行脚本后,你应该检查终端输出的结果。如果一切正常,你将看到一些输出信息,包括设备的状态和脚本的执行结果。如果遇到错误,UIautomator2.0通常会提供错误提示,帮助你诊断问题。

输出示例:
[INFO] Connected to emulator-5554
{'display': 'Android_SDK_built-for_x86', 'orientation': 'portrait', 'density': 160, 'size': '720x1280'}

这个输出表示你的脚本已经成功连接到了模拟器,获取了设备的一些基本信息。如果没有输出或者有错误信息,请根据错误提示进行问题诊断,比如检查设备是否正确连接,Android开发者选项是否开启,ADB是否安装正确等。

代码块:
# 检查脚本中可能发生的异常
try:
    device.info()
except Exception as e:
    print(f"发生错误: {e}")
参数说明:
  • try...except 块:用于捕获可能发生的异常。
  • device.info() :尝试获取设备信息。
  • print(f"发生错误: {e}") :如果有错误发生,打印错误详情。

3. 编写UIautomator2.0脚本基础

3.1 脚本结构与组成

3.1.1 了解脚本的基本结构

一个UI Automator脚本通常包含多个部分,每一部分都有其特定的作用和结构。首先,每个脚本至少需要一个main函数作为程序的入口点。然后,脚本需要导入必要的模块,如 uiautomator time 。这些模块分别提供了与UI Automator框架交互的方法和用于延时的功能。

from uiautomator import device,_dump

def main():
    # 脚本的主要逻辑部分将放在这里
    pass

if __name__ == '__main__':
    main()

3.1.2 导入必要的模块和类

在Python脚本中,使用import语句可以导入其他模块或者类。例如,UI Automator库提供了 device 对象,用于执行UI交互, dump 用于获取当前设备的UI层次结构和窗口状态。

from uiautomator import device, dump

# 使用device和dump模块提供的功能
device(text='OK').click()
dump()

# 可以进一步导入其他需要的模块或类

3.2 编写测试用例

3.2.1 设计测试逻辑与步骤

编写测试用例是自动化测试的基础,它要求测试人员具备一定的逻辑思维能力。测试用例设计首先要明确测试目标,然后通过一系列的步骤来验证被测对象是否满足这些目标。

def test_example():
    # 验证目标应用是否能正确响应点击事件
    target_app = device(text='目标应用的按钮')
    target_app.click()
    # 等待页面跳转或状态变化
    time.sleep(2)
    # 验证是否达到期望的状态或结果
    assert device(text='预期的结果文本').exists

3.2.2 构建测试用例的框架

一个完整的测试用例框架包括初始化、前置操作、执行步骤、后置操作和结果验证。使用类来组织测试用例是一种常见的做法,能够提高代码的可读性和可维护性。

class ExampleTestCase(object):
    def setUp(self):
        # 测试前的准备工作
        pass

    def test_function(self):
        # 测试步骤
        pass

    def tearDown(self):
        # 测试后的清理工作
        pass

    def assert_result(self):
        # 断言期望结果
        pass

3.3 脚本中的常用命令

3.3.1 设备状态查询与控制

在编写自动化测试脚本时,我们常常需要获取设备的状态信息或者对设备进行一些控制操作。例如,检查设备是否处于锁屏状态,或者将设备从锁屏状态唤醒。

# 查询设备是否锁屏
def is_locked():
    return device.info['lock']

# 解锁设备
def unlock():
    device.swipe(device.width * 0.5, device.height * 0.8, device.width * 0.5, device.height * 0.2, 100)

3.3.2 日志记录和断言方法

日志记录对于调试和分析测试脚本是必不可少的。除了打印信息到控制台,我们还可以将日志记录到文件中供后续分析。断言是自动化测试中的核心,它用于验证预期和实际结果是否一致。

import logging

# 配置日志记录器
logging.basicConfig(filename='uiautomator.log', level=logging.DEBUG)

# 日志记录
logging.debug('测试日志信息')

# 断言方法
assert device(text='期望的文本').exists

在本章节中,我们介绍了UI Automator脚本的基本结构,包括如何设计测试用例和编写常用的命令。通过具体的代码示例,我们展示了如何导入模块,定义测试用例的框架,以及如何进行设备状态查询、日志记录和断言。这些基础知识是构建更复杂测试脚本和进行深入UI自动化测试的基石。在后续章节中,我们将深入探讨UI元素的定位方法,以及如何在测试脚本中实现UI元素的查找、操作和断言验证。

4. 查找UI元素的方法与技巧

4.1 UI元素定位基础

4.1.1 通过ID和文本定位元素

在UI自动化测试中,最直接和常见的元素定位方法是通过元素的ID或者可见文本。这两种方法相对简单,易于理解和实现,是初学者入门的首选。

在使用UIautomator2.0框架时,可以利用其提供的查找API进行元素定位。通过元素ID定位通常是最快的定位方式,因为ID是唯一标识一个UI元素的属性。

举一个简单的例子,假设我们要定位一个按钮,其ID为 com.example:id/button

button = device.find_object(uiSelector().resourceId("com.example:id/button"))
if button:
    button.click()

代码中, find_object 方法通过 uiSelector 进行元素的定位,如果找到了对应的元素,则执行点击操作。

定位元素的文本是另一种常见的需求,特别是在处理具有大量相同控件类型的动态内容时。文本定位能够帮我们快速找到特定的元素,如确认消息、按钮等。

例如,定位到一个文本为"OK"的按钮:

ok_button = device.find_object(uiSelector().text("OK"))
if ok_button:
    ok_button.click()

需要注意的是,文本定位可能比ID定位慢一些,并且如果应用中有多个相同文本的按钮,可能需要添加其他条件来精确匹配。

4.1.2 使用控件属性和组合定位

在某些情况下,UI元素可能没有明确的ID,或者UI设计的特殊性使得仅用ID和文本无法精确定位元素。此时,可以采用控件属性和组合定位的方法。

控件属性定位是通过元素的其他属性进行定位,例如控件的类名、描述文本、包名等。

例如,定位一个文本输入框,可以通过其类名进行:

input_text = device.find_object(uiSelector().className("android.widget.EditText"))

组合定位是指使用多个属性进行元素定位,这是提高定位准确性的常用方法。

举一个例子,定位一个包含特定文本的按钮,可以组合使用 className text 属性:

specific_button = device.find_object(
    uiSelector().className("android.widget.Button").text("Submit")
)

这种方法将类名和文本结合起来,使得定位更精确。

4.1.3 控件属性及组合定位方法汇总

| 控件属性 | 描述 | 示例代码 | |-----------------|--------------------------------------------------------------|---------------------------------------| | className | UI控件的类名,例如"android.widget.Button"代表按钮 | device.find_object(uiSelector().className("android.widget.Button")) | | description | UI控件的描述信息 | device.find_object(uiSelector().description("Continue")) | | packageName | 应用的包名 | device.find_object(uiSelector().packageName("com.example")) | | text | UI控件的文本 | device.find_object(uiSelector().text("OK")) | | resource_id | UI控件的资源ID | device.find_object(uiSelector().resourceId("com.example:id/btn")) |

通过以上这些方法,我们可以灵活地在复杂的UI结构中定位所需的元素。在实际操作中,可能需要结合多种属性进行定位,以确保定位的准确性。在进行组合定位时,应尽量减少属性的数量,避免过度约束导致定位失败。

4.2 进阶定位技巧

4.2.1 理解控件的层级关系

为了能够更加精确地定位元素,理解Android中控件的层级关系是十分重要的。控件是按照层级结构组织的,一个控件可能被其他控件所包含。

在UIautomator2.0中,我们可以通过UiSelector的层级查询方法来定位具有特定层级关系的控件。例如,要定位一个在某个特定视图内的按钮:

view = device.find_object(uiSelector().resourceId("com.example:id/specific_view"))
button = view.getChild(uiSelector().text("OK"))

这里我们先定位到一个特定视图,然后调用 getChild 方法来获取该视图内部的按钮。

4.2.2 使用UiSelector进行复杂匹配

在某些复杂的UI场景下,可能需要使用更复杂的匹配逻辑来进行元素定位,这时可以使用UiSelector的复合条件查询。

例如,要查找一个同时满足具有特定描述文本、在特定父视图中,以及具有特定访问权限的按钮:

button = device.find_object(
    uiSelector().descriptionContains("Submit").pkg("com.example").inPackage("com.example").checkable(false)
)

在这个例子中,我们使用了 descriptionContains pkg inPackage checkable 等多种属性来精确地定位按钮。

4.2.3 UiSelector的高级属性应用

UiSelector支持许多高级属性,以下是一些常用的高级属性列表和示例代码:

| 属性 | 描述 | 示例代码 | |---------------|--------------------------------------------------------------|----------------------------------------------------| | index | 控件在其父视图中的索引位置 | device.find_object(uiSelector().index(1)) | | textStartsWith| 控件文本以特定字符串开头 | device.find_object(uiSelector().textStartsWith("Download")) | | checkable | 控件是否可以被选中 | device.find_object(uiSelector().checkable(true)) | | checked | 控件是否已被选中 | device.find_object(uiSelector().checked(true)) | | focusable | 控件是否可以获得焦点 | device.find_object(uiSelector().focusable(true)) | | focused | 控件是否当前获得焦点 | device.find_object(uiSelector().focused(true)) | | scrollable | 控件是否可以滚动 | device.find_object(uiSelector().scrollable(true)) | | longClickable | 控件是否支持长按 | device.find_object(uiSelector().longClickable(true)) |

通过这些高级属性,我们可以构建出非常复杂且精确的元素定位条件。

4.3 定位方法的实践应用

4.3.1 定位方法的选择策略

在实际应用中,选择合适的元素定位方法对于自动化测试的稳定性和效率至关重要。在不同的测试场景下,我们可能需要不同的定位策略。

  • 对于界面频繁变动的应用 :可能需要使用更稳定的属性,如 className resourceId ,避免因界面布局变化导致定位失败。
  • 对于功能复杂的应用 :则需要根据测试需求,灵活组合不同的属性进行定位。

4.3.2 案例分析:复杂界面元素定位

在复杂界面中,元素定位可能会遇到一些挑战,比如元素重叠、动态生成的内容等。

例如,在一个具有列表项动态生成的界面中,我们可能需要根据内容定位列表项:

list_item = device.find_object(
    uiSelector().className("android.widget.TextView").textStartsWith("Item")
)

在这个例子中,我们通过 className 定位到了所有的 TextView 控件,并通过 textStartsWith 来过滤出以"Item"开头的控件,以定位到列表项。

4.3.3 定位方法的实践应用小结

进行元素定位时,我们通常需要根据实际情况选择适当的定位方法。在测试场景较为简单时,我们倾向于使用直接和高效的定位方式;而在复杂场景中,可能需要构建较为复杂的定位策略,甚至结合多种方法进行定位。

通过实践,我们会发现,尽管有多种定位方法可用,但在编写自动化测试脚本时,合理地选择和组合这些方法,才能够使测试过程既稳定又高效。此外,随着自动化测试工具和框架的不断更新,了解并掌握各种定位技术,对于提高测试人员的技能和效率也非常重要。

5. 执行操作:点击、滑动、输入文本等

5.1 基本UI交互操作

5.1.1 点击和长按操作

在移动自动化测试中,模拟用户的点击和长按操作是极其常见的任务。对于UI Automator2.0来说,提供了一系列简单易用的API来完成这些操作。点击操作通常是指通过坐标或者UI元素来进行一次触摸屏幕的行为。长按操作则是在屏幕的特定位置进行较长时间的触摸,这通常用来触发一些元素的快捷菜单或者展开更多选项。

在代码实现中, u2.uiautomator.device.click(x, y) 函数可以用来模拟点击操作,其中x和y代表了屏幕上坐标的位置。如果要进行长按操作,则可以使用 u2.uiautomator.device.longPress(x, y, duration) 函数,其中x和y代表长按的起始坐标,duration则表示长按的持续时间(单位为毫秒)。

# 点击操作示例代码
import uiautomator2 as u2

d = u2.connect()  # 连接到设备
d.click(100, 200)  # 在屏幕上(100, 200)的位置点击

# 长按操作示例代码
d.longPress(100, 200, 2000)  # 在屏幕上(100, 200)的位置长按2秒

5.1.2 滑动和多点触控

滑动操作模拟的是用户在屏幕上的滑动行为,它通常用于打开抽屉菜单、滚动列表或者切换页面等。多点触控则能够模拟多指触摸操作,这在一些特殊的交互如放大缩小图片、模拟多指手势等场景下非常有用。

滑动操作可以通过 u2.uiautomator.device.swipe(start_x, start_y, end_x, end_y, duration) 函数来实现,其中start_x、start_y代表滑动起始点坐标,end_x、end_y代表滑动结束点坐标,duration代表滑动的持续时间(单位为毫秒)。

对于多点触控,我们使用 u2.uiautomator.device.touch(multi_points, duration=None) 函数。multi_points 是一个坐标点列表,表示触控点的起始和结束位置。duration 则是可选参数,用于设置多点触控的持续时间。

# 滑动操作示例代码
d.swipe(100, 500, 100, 0, duration=2000)  # 从屏幕上方滑动到下方,模拟打开抽屉菜单

# 多点触控操作示例代码
points = [{'x': 300, 'y': 800}, {'x': 500, 'y': 800}]  # 起始位置点
d.touch(points, duration=500)  # 两点同时触摸屏幕,持续时间为500毫秒

5.2 输入文本与数据验证

5.2.1 输入文本和特殊按键

自动化测试不仅仅需要对UI元素进行操作,还需要验证和输入数据。UI Automator2.0提供了输入文本的功能,使用 u2.uiautomator.device.setText(text) 函数即可向当前选中的文本框输入指定的字符串。

除了常规文本输入,对于特殊按键,如回车、删除等,可以直接调用 u2.uiautomator.device.press(key) 函数来模拟按键操作,key可以是特定的按键代码,如 "back" 表示返回键, "enter" 表示回车键等。

# 输入文本操作示例代码
d.setText("Hello, UI Automator 2.0")  # 向文本框中输入文本

# 特殊按键操作示例代码
d.press("back")  # 模拟按下返回键

5.2.2 文本验证和校验码处理

在实际测试过程中,经常需要验证输入框中显示的文本是否符合预期。这可以通过 u2.uiautomator.device.text() 函数获取文本框的当前内容,然后使用断言来比较预期值和实际值是否一致。

当处理含有校验码的场景时,我们需要对校验码进行识别和输入。校验码识别可能需要图像识别技术,但UI Automator2.0专注于UI层面的自动化,因此这里我们聚焦于如何准确地识别和输入校验码。

# 文本验证操作示例代码
expected_text = "Welcome to UI Automator 2.0"
current_text = d.text()  # 获取当前文本框内容
assert current_text == expected_text  # 验证文本是否符合预期

# 校验码处理操作示例代码(假设校验码为1234)
d.setText("1234")  # 输入校验码

5.3 高级交互技术

5.3.1 使用JavaScript执行复杂的UI操作

在某些情况下,基础的UI操作API可能不足以完成复杂的交互任务,这时可以使用JavaScript执行器来绕过这些限制。UI Automator框架提供了JavaScript执行器,允许测试脚本执行JavaScript代码,从而实现更深层次的自动化控制。

例如,如果需要点击一个被遮挡的按钮,我们可以使用JavaScript来模拟点击操作。需要注意的是,使用JavaScript执行器之前,应确保目标应用已经注入了相应的JavaScript环境。

// JavaScript脚本示例
var btn = document.querySelector('#buttonId');
btn.click();
# Python调用JavaScript脚本示例代码
d(
    '''
    (function() {
        var btn = document.querySelector('#buttonId');
        btn.click();
    })();
    '''
)

5.3.2 事件监听和自定义控件交互

当需要监听特定事件或者与自定义控件交互时,我们可能需要编写特定的代码来进行这些操作。自定义控件可能拥有特殊的属性或者方法,需要在了解其API的情况下才能进行交互。

事件监听是基于JavaScript执行器的另一个常用功能。通过监听事件,我们可以获得控件状态的变化信息,例如点击事件、滑动事件等。这能够帮助我们在测试中更准确地掌握控件的状态变化,从而做出相应的动作。

# JavaScript事件监听示例代码
d(
    '''
    (function() {
        var element = document.querySelector('#elementId');
        element.addEventListener('click', function() {
            console.log('Element clicked');
        });
    })();
    '''
)

通过结合使用JavaScript执行器和事件监听,可以极大地扩展自动化测试的范围和深度。同时,这也是UI Automator2.0框架灵活性和强大功能的体现。

6. 断言与等待操作的实现

6.1 断言机制基础

6.1.1 理解断言的作用和时机

在自动化测试脚本中,断言是确保应用程序行为符合预期的重要环节。它们通常在测试用例中用来验证某个特定条件,例如,某个按钮是否存在,文本框是否包含正确的数据,或者用户是否被导航到了期望的页面。

断言的使用时机是在预期结果应该发生,但还未发生的时候。通常,一个测试用例会包含一系列的步骤,当达到某个关键步骤时,就会进行断言。若断言失败,则意味着在该步骤发现了问题,测试用例会标记为失败。

6.1.2 常用断言方法的介绍

在UIautomator2.0中,可以使用 u2 对象来访问断言方法。以下是一些常用的断言方法:

  • u2.assertEqual(expected, actual) : 检查两个值是否相等,例如,检查一个文本字段的内容是否与预期相符。
  • u2.assertTrue(condition) : 检查一个条件是否为真,例如,一个布尔值或表达式。
  • u2.assertFalse(condition) : 检查一个条件是否为假。
  • u2.assertNotEquals(expected, actual) : 确保两个值不相等。
  • u2.assertTextPresent(text) : 确保指定文本在屏幕上可见。

6.2 等待操作的实现

6.2.1 静态等待与动态等待

等待操作通常用来确保元素在进行下一步操作之前已经就绪。 u2 提供了两种等待方法:

  • 静态等待 :通过 u2.wait(timeout) 方法实现,它会暂停脚本执行指定的时间(毫秒),不考虑任何条件是否满足。
  • 动态等待 :通过 u2.waitUntil(condition, timeout) 实现,它会周期性地检查一个条件是否成立,并在条件成立或超时发生时继续执行。

6.2.2 使用期望(Expectation)进行智能等待

在某些复杂场景中,UI元素的出现可能依赖于多种因素,这时使用 u2.expect() 方法会非常有用。 u2.expect() 允许你定义一个期望(期望的条件),并持续检查直到条件成立或超时。这可以更好地模拟用户与应用交互时的自然等待,同时避免了不必要的长时间等待。

from uiautomator2 import期望, wait

def espera_elemento(elemento):
    """
    等待UI元素出现。
    """
    u2.expect(elemento).to_appear(timeout=10000)  # 最多等待10秒
    assert u2(text=elemento).exists  # 断言元素是否存在

espera_elemento("OK")

6.3 断言与等待的最佳实践

6.3.1 设计稳定的测试逻辑

编写测试脚本时,应该将断言和等待操作放在关键步骤,且这些步骤对测试结果有直接影响。确保测试逻辑的稳定性,避免因偶然的界面变化导致测试失败。

6.3.2 处理超时和异常的策略

在设计测试用例时,应当考虑到测试执行过程中可能发生的超时和异常情况。合理的异常处理机制能够帮助记录更多的错误信息,并提供快速的反馈,以便于调试。

try:
    u2.waitUntil(lambda: u2(text="Continue").clickable, 10)  # 等待最多10秒
    u2(text="Continue").click()
except TimeoutError:
    print("未能在10秒内找到Continue按钮")

以上代码尝试在最多10秒内找到并点击Continue按钮。如果失败,将捕获 TimeoutError 异常并打印一条错误信息。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:UIautomator2.0是Google推出的升级版Android UI测试框架,具有性能和功能的提升。本指南将详细介绍如何编写UIautomator2.0脚本,包括安装配置、基本用法、查找UI元素、执行操作、断言与等待、异常处理、多线程与并发、测试用例与测试套件,以及运行与调试。目的是帮助开发者更好地理解和运用UIautomator2.0进行高效的自动化测试。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

更多推荐