在移动应用测试领域,自动化测试框架能够显著提升测试效率和覆盖度。uiautomator2
作为一款基于Python的Android自动化测试工具,凭借其简单易用的API接口和强大的功能支持,成为许多测试工程师的首选。本文将详细解析 uiautomator2
的使用方法,从环境搭建到实际操作示例,帮助读者快速掌握这一高效工具的核心技能,并应用于实际的Android应用测试场景中。无论您是测试新手还是资深工程师,本文都能为您提供有价值的参考和启发。
一、框架简介
uiautomator2是Google开源的Android自动化测试框架uiautomator的Python封装版本,由阿里巴巴团队维护。相比Appium等传统方案,它具有以下优势:
轻量级:无需安装Appium服务端
高性能:直接通过ADB与设备通信
原生支持:基于Android原生API开发
跨平台:支持Python2/3,兼容macOS/Linux/Windows
二、环境搭建
2.1 安装依赖
# 安装Python库 pip3 install uiautomator2 # 安装ATX守护进程(手机端) python3 -m uiautomator2 init
2.2 设备连接准备
开启USB调试模式(设置→关于手机→连续点击版本号)
允许模拟点击(设置→开发者选项→启用"USB调试(安全设置)")
连接设备并验证:
adb devices # 应显示设备序列号
三、核心功能详解
3.1 设备连接管理
import uiautomator2 as u2 # 连接单个设备 d = u2.connect('device_serial') # 通过序列号连接 # 或自动连接唯一设备 d = u2.connect() # 连接多个设备 devices = u2.connect_multi(['serial1', 'serial2'])
3.2 基础操作API
3.2.1 元素定位
# 通过资源ID定位(推荐) d(resourceId="com.example:id/btn_submit").click() # 通过文本定位 d(text="确认").click() # 通过XPath定位 d.xpath('//android.widget.Button[@text="登录"]').click() # 组合定位 d(resourceId="com.example:id/et_username", text="用户名").set_text("testuser")
3.2.2 常用操作
# 点击操作 d(text="设置").click() d.click(0.5, 0.5) # 屏幕坐标点击 # 输入文本 d(resourceId="password").set_text("123456\n") # 输入后自动隐藏键盘 # 滑动操作 d.swipe(0.1, 0.5, 0.9, 0.5, duration=0.5) # 左滑 d.swipe_ext("up", 0.8) # 向上滑动80%屏幕高度 # 截图保存 d.screenshot("homepage.png") # 获取设备信息 print(d.device_info) # 输出分辨率、品牌等
3.3 高级功能
3.3.1 混合应用测试
# 启动WebView上下文 d.web_context.start() # 执行Web操作 d.web_context.click("a.login-btn") d.web_context.set_text("input[name=username]", "web_user") # 返回原生上下文 d.web_context.stop()
3.3.2 性能监控
# 获取CPU/内存信息 print(d.devinfo.cpu) print(d.devinfo.meminfo) # 监控FPS(需root权限) d.monitor.start_fps_monitor()
3.3.3 自动化构建
# 生成页面对象模型 from uiautomator2 import Page class LoginPage(Page): username = ("com.example:id/et_username", "id") password = ("com.example:id/et_password", "id") login_btn = ("//android.widget.Button[@text='登录']", "xpath") # 使用页面对象 page = LoginPage(d) page.username.set_text("admin") page.login_btn.click()
四、实战案例:微信自动化测试
4.1 测试场景
启动微信
进入通讯录
搜索指定好友
发送消息
4.2 完整代码实现
import uiautomator2 as u2 import time def test_wechat_chat(): # 连接设备 d = u2.connect() # 启动微信 d.app_start("com.tencent.mm") time.sleep(5) # 进入通讯录 d(resourceId="com.tencent.mm:id/g2").click() time.sleep(2) # 搜索好友 d(resourceId="com.tencent.mm:id/b_n").click() d(resourceId="com.tencent.mm:id/b_q").set_text("文件传输助手") time.sleep(1) # 选择搜索结果 d(resourceId="com.tencent.mm:id/b_t").click() time.sleep(2) # 发送消息 d(resourceId="com.tencent.mm:id/b_q").set_text("自动化测试消息\n") # 验证发送成功 assert d(text="自动化测试消息").exists, "消息发送失败" if __name__ == "__main__": test_wechat_chat()
五、调试技巧
5.1 元素定位辅助
# 实时查看页面结构 d.dump_hierarchy() # 生成XML结构到控制台 # 实时截图查看 d.screenshot("current_view.png") # 启动实时调试服务器 d.server.start_debugger()
5.2 异常处理
try: d(text="不存在的按钮").click() except u2.exceptions.UiObjectNotFoundError: print("元素未找到,尝试其他定位方式") except Exception as e: print(f"测试失败:{str(e)}") d.screenshot("error.png") # 失败时自动截图
5.3 日志管理
import logging # 配置日志输出 logging.basicConfig( level=logging.DEBUG, format='%(asctime)s - %(levelname)s: %(message)s', handlers=[ logging.FileHandler("automation.log"), logging.StreamHandler() ] ) d.logger.setLevel(logging.DEBUG) # 设置设备操作日志级别
六、常见问题解决
6.1 设备连接失败
检查USB调试是否开启
尝试重启adb服务:
adb kill-server adb start-server
确认设备序列号正确
6.2 元素定位不稳定
使用XPath的contains函数:
d.xpath('//*[contains(@text,"部分文本")]')
启用智能等待:
d(resourceId="btn_submit").click(timeout=10) # 10秒内等待元素出现
6.3 性能优化建议
减少不必要的截图操作
使用XPath定位时避免绝对路径
关闭动画效果(开发者选项→动画缩放设为0.5x)
七、进阶方向
结合pytest框架构建测试体系
集成Allure生成可视化报告
开发分布式测试集群
实现图像识别辅助定位(结合OpenCV)
八、总结
uiautomator2作为轻量级Android自动化解决方案,在APP测试、性能监控、持续集成等领域有广泛应用。掌握其核心API和调试技巧,可大幅提升移动端测试效率。建议从简单场景入手,逐步构建自动化测试体系,同时关注框架更新日志以获取最新功能支持。
本文由@战地网 原创发布。
该文章观点仅代表作者本人,不代表本站立场。本站不承担相关法律责任。
如若转载,请注明出处:https://www.zhanid.com/biancheng/4542.html