UI自动化测试-UiAutomator

本文介绍了Android 4.1中引入的UiAutomator工具,包括UiAutomatorViewer和UiAutomator测试Java库。UiAutomatorViewer用于扫描和分析应用UI控件,而UiAutomator则包含了创建UI测试的API及自动化测试引擎。文章还详细阐述了如何使用这些工具进行UI自动化测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UiAutomator简介

  1. Android 4.1发布的时候包含了一种新的测试工具– UiAutomator;
  2. Android SDK在4.1中提供了如下工具来支持UI自动化测试:
    1.UiAutomatorViewer –扫描和分析应用的UI控件的图形界面工具
    2.UiAutomator – 测试Java库,包含了创建UI测试的各种API和执行自动化测试的引擎

UiAutomator使用条件

  1. Android SDK Tools, Revision 21 or higher
  2. Android SDK Platform, API 16 or higher

UiAutomator 工作流程

  1. 将需要测试应用安装到手机或者虚拟机中,分析应用的UI界面元素 并确保被测试应用的各个控件可以被测试工具获取到。
  2. 创建知道测试案例来模拟应用中的用户操作步骤。
  3. 编译测试案例代码为Jar包并复制该Jar包到安装了待测应用的测试手机中。
  4. 运行测试并查看结果
  5. 修改任何发现的bug,然后修复并重新测试。

UiAutomatorViewer 工具

UiAutomatorViewer 工具来获取应用的界面截图。UiAutomatorViewer工具提供了一个便利的方式来查看UI布局结构,并且可以查看各个控件的相关属性。利用这些信息可以用来创建UI测试代码。

分析UI方法

  • 把Android手机连接到电脑上直接用虚拟机
  • 打开命令行窗口并导航到目录 /tools/ dos进入命令符
  • windows下运行 uiautomatorviewer.bat 命令 程序截图
  • 点击UiAutomatorViewer工具文件夹按钮旁边的“Device Screenshot”按钮来获取当前屏幕界面信息。意:如果当前电脑连接了多个设备,通过设置ANDROID_SERIAL环境变量来指定要分析的设备。步骤如下: a.运行如下命令获取连接到电脑的设备序列号 $ adb devices b.设置ANDROID_SERIAL为需要测试的设备序列号 Windows:set ANDROID_SERIAL= Unix: export ANDROID_SERIAL= 如果电脑只连接一个设备则无需设置ANDROID_SERIAL 环境变量。
  • 查看待测应用的UI界面元素属性 把鼠标放到uiautomatorviewer工具左边的截图中的控件上来查看该控件的属性。属性显示在右侧界面下方,上方显示当前界面的布局结构。 点击右侧上方的黄三角按钮(Toggle NAF Nodes)来查看不能被uiautomator测试工具访问到的控件。这些控件只设置了有限的属性,所以导致uiautomator无法获取到这些控件。所以你可能很难测试这些控件。这种情况下你可以要求开发者为这些控件添加必要的属性,比如 如果是ImageView或者ImageButton应该添加android:contentDescription属性。

开始工作

1.将被测应用装到手机、虚拟机中
2.辨别待测应用UI控件

在开始编写uiautomator测试代码之前,需要先辨别待测应用的UI控件元素。一般而言,优秀的待测应用的UI元素应该是可见的并且用户可以操作的。这些UI元素也应该具有可见的文本标签、android:contentDescription值或者二则兼具。
通过uiautomatorviewer 工具可以查看应用的可见控件。具体使用情况见上面所述。

3.确保待测应用是可访问性

由于uiautomator 工具依赖Android设备的可访问行来获取UI控件,所以这不是非常重要的。要支持uiautomator 工具需要一下条件:
- 使用android:contentDescription属性给 ImageButton, ImageView, CheckBox和其他控件设置标签。
- 使用android:hint 属性来标记EditText 控件,而不是使用里面的文本(文本内容用户是可以修改的)。
- 对于用来提供操作视觉反馈的UI(文本或者图标),都添加一个android:hint 属性来识别。
- 确保所有用户可操作的界面元素都可以通过方向控制键选中(例如轨迹球)。
- 通过uiautomatorviewer 工具来确保所有的UI元素都可以被测试工具访问到。还可以通过“辅助功能”(在设置界面)中的“TalkBack”等服务来测试UI的可访问性。

根据UIAutomation封装了很多自定义方法 现在只需要实例化之后 直接调用方法即可完成。比如单击某个按钮,现在只需要直接调用ClickElement,非常实用。 ClickElement 单击指定的自动化元素 DisselectAllDataGridRow 不选中所有行 DisselectDataGridRow 不选中特定的某一行 FocusWindow 获取窗口焦点 GetAllElement 获取指定父自动化元素下的所有激活的控件 GetAllElementDetails 获取指定自动化元素下的详细信息包括AutomationID,ControlType以及Name GetAllMenus 获取所有菜单项 GetAllSubMenus 获取某个菜单下的所有子菜单项 GetColumnsFromGridLine 获取指定行的所有列 GetColumnValuesFromGridLine 获取行的每一列数据 GetControlType(AutomationElement) 获取制动自动化元素的控件类型 GetControlType(TypeOfControl) 获取UIAutomation的控件类型 GetDocumentText 获取document控件的值 GetElementByID 获取父自动化元素下指定元素控件ID的引用 GetElementByName 获取父自动化元素下的指定子元素的引用 GetElementsByControlType 获取父自动化元素下的特定类型的所有自动化元素 GetGridLinesFromDataGrid 获取网格控件的全部行元素的引用 GetHeaderFromDataGrid 获取指定网格控件的标题栏引用 GetMenuBar 获取菜单栏控件 GetMenuByName 通过特定的名称去获取菜单UI自动化元素 GetName 获取指定自动化元素的名称 GetSubMenuByName 获取主菜单下的指定子菜单项的引用 GetValue 获取指定自动化元素的值 GetWindowByName(String) 获取desktop下的指定窗口名称的子UI自动化元素 GetWindowByName(String, AutomationElement) 获取特定父UI自动化元素下的制定窗口名称的子UI自动化元素 GetWindowList() 获取当前桌面根下所有的UI自动化元素下 GetWindowList(AutomationElement) 获取特定父UI自动化元素下的所有窗口的名称 RefindMainApplication 重新获取desktop下的指定窗口的自动化元素引用 SelectAllDataGridRow 选中所有行 SelectDataGridRow(AutomationElement) 选中特定的某一行 SelectDataGridRow(AutomationElement, Boolean) 将特定的DateGridRow加入选中项中 SelectValueInComboBox 从下拉框中选中指定值的项 SelectValueInListBox 从列表中选中指定值的项 SetValue 给予指定自动化元素赋值 以上的方法还不是很完善 正在完善中。如果有什么意见和建议,请发送邮件获取 chenxu7601257@qq.com 如果你看了这个帮助文件之后觉得有用的,请发邮件获取,我将把dll文件给你。谢谢。
### 使用 uiautomator2 编写车载自动化测试脚本 #### 创建环境准备 为了使用 `uiautomator2` 进行车载系统的自动化测试,首先需要设置好开发环境。这包括安装必要的软件包以及配置连接至目标设备的方式。 确保已安装 Python 环境,并通过 pip 安装最新版本的 `uiautomator2` 库[^3]: ```bash pip install -U uiautomator2 ``` #### 初始化设备连接 初始化与待测车辆内置 Android 设备之间的 USB 或 Wi-Fi 连接。假设已经成功建立了 ADB (Android Debug Bridge) 连接,则可以通过如下命令激活 `uiautomator2`: ```python import uiautomator2 as u2 d = u2.connect() # 默认连接第一个可用设备 print(d.info) ``` 这段代码会打印出当前连接设备的信息,确认是否正确连上了车载终端[^1]。 #### 控制 UI 组件交互 利用所提供的五个核心类之一——`UiObject`, 可以方便地找到并操控界面上的对象: ```python # 查找指定文本按钮并点击 button = d(text="Start Navigation") if button.exists: button.click() else: print("Button not found") # 输入目的地地址 search_box = d(resourceId="com.example.carapp:id/searchBox") if search_box.exists: search_box.set_text("Beijing, China") ``` 这里展示了如何寻找特定的文字标签 "Start Navigation" 来触发导航功能,同时也示范了怎样向搜索框内输入文字内容。 #### 处理滚动列表项 当面对可滚动的内容区域时,比如地图上的地点建议列表,可以借助 `UiScrollable` 类来进行上下翻页直到找到所需选项为止: ```python from time import sleep scroll_view = d(scrollable=True) def find_and_click_item(target_text): while True: items = scroll_view.child_by_text(target_text=target_text) if items.exists: items.click() break else: try: scroll_view.scroll(steps=10) sleep(1) # 加入适当延时防止过快滚动错过目标 except Exception as e: raise ValueError(f"Failed to locate '{target_text}' after scrolling") from e find_and_click_item('Tiananmen Square') ``` 此函数尝试在滚动视图中查找名为 'Tiananmen Square' 的位置条目,并对其进行点击操作。如果未能立即发现该元素,则继续向下滚动直至匹配成功或抛出异常终止循环。 #### 执行复杂场景模拟 最后,在某些情况下可能还需要模拟更复杂的用户行为序列,例如切换应用程序、调整系统设置等动作。这些都可以依靠调用相应的 API 方法完成: ```python # 切换回主屏幕 d.press_home() # 开启蓝牙开关 settings_app = d.app_start("com.android.settings") bluetooth_toggle = settings_app.xpath('//android.widget.Switch[@text="ON"]|//android.widget.Switch[@text="OFF"]').get_one(timeout=5.0) current_state = bluetooth_toggle.get_text().strip().upper() desired_state = "ON" if current_state != desired_state: bluetooth_toggle.click() sleep(2) # 等待状态改变生效 assert bluetooth_toggle.get_text().strip().upper() == desired_state, f"Bluetooth should be {desired_state}" ``` 上述片段实现了打开设置应用并将蓝牙开启的功能验证逻辑。注意实际执行过程中应当加入更多的错误处理机制来提高稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值