在移动应用测试领域,自动化测试框架能够显著提升测试效率和覆盖度。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




















