资讯动态

UI自动化-Airtest框架落地实战

发布时间:2026/10/17 8:25:34 来源:尧图企业网站定制
本UI自动化测试框架采用Page Object设计模式结合Airtest图像识别和PocoUI自动化技术实现稳定可靠的自动化测试。️ 技术栈Airtest- 跨平台UI自动化测试框架图像识别Poco- UI自动化引擎控件识别Pytest- Python测试框架Allure- 测试报告生成工具Python 3.12- 编程语言Airtest框架官方文档https://airtest.doc.io.netease.com/tutorial/0_automated_testing/一、环境安装1、安装本地airtest Python环境pip install pytest pip install airtest1.4.3 pip install --no-compile pocoui1.0.94 pip install allure-pytest2.16.0同时安装Airtest IDE软件方便元素定位与图片截取2、安装Allure Commandline目的把 allure-pytest 收集到的测试结果渲染成可视化的 HTML 测试报告并支持本地预览、CI 归档和分享Windows (使用Scoop):# 先安装 Scoop如果尚未安装 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser irm get.scoop.sh | iex scoop install allure二、搭建测试框架这里以一个核心功能为快速扫描病毒的安卓TV应用项目为例来搭建UI自动化测试框架1、框架结构UI/ ├── config/ # 配置模块 │ ├── app_config.py # 应用配置包名、超时时间等 │ └── device_config.py # 设备配置 ├── actions/ # 基础操作层 │ ├── base_action.py # Page基类通用操作方法 │ └── tv_remote.py # TV遥控器操作封装 ├── pages/ # 页面对象层 │ ├── home_page.py # 首页页面对象 │ └── problem_area_page.py # 问题区域页面对象 ├── testcases/ # 测试用例层 │ └── test_quick_scan.py # 快速扫描测试用例 ├── utils/ # 工具类模块 │ ├── assert_utils.py # 断言工具集成Allure截图 │ ├── device_utils.py # 设备连接工具 │ ├── poco_elements.py # Poco元素定位器常量 │ └── poco_manager.py # Poco单例管理器 ├── resources/images/ # 图片资源截图模板 ├── screenshots/failures/ # 断言失败截图 ├── reports/ # 测试报告目录Git忽略 ├── conftest.py # Pytest配置文件Fixture定义 ├── pytest.ini # Pytest配置 ├── run.py # 测试运行脚本 └── view_report.py # 报告查看脚本2、 核心特性1. Page Object模式pages/- 封装页面元素和操作actions/base_action.py- 提供通用操作方法提高代码复用性和可维护性2. Poco单例管理utils/poco_manager.py- 单例模式管理Poco实例避免重复创建提高性能自动处理设备重连3. 智能断言utils/assert_utils.py- 统一断言入口支持Poco文本断言和图片断言失败自动截图4. TV遥控器封装actions/tv_remote.py- Android TV遥控器操作支持方向键、确认键、返回键等提供便捷的导航方法可与Poco混合使用5. Allure报告集成详细的测试步骤展示测试分类和严重程度标记美观的HTML报告界面3、 常用命令# 安装依赖pipinstall-rrequirements.txt# 运行所有测试python run.py# 运行指定测试文件pytest testcases/test_quick_scan.py-v# 运行带标记的测试pytest-msmoke# 冒烟测试pytest-mcritical# 关键测试# 生成Allure报告allure generate reports/allure_results-oreports/allure_report--clean# 查看报告allureopenreports/allure_report# 清理缓存pytest --cache-clear4、测试报告Allure报告包含✅ 测试执行概览✅ 测试步骤详情✅ 失败用例分析✅ 测试趋势图表✅ 环境信息三、测试用例实例1、两套核心断言技术Airtest vs Poco这是整个框架最关键的区分。理解了它们的差异就知道什么场景用什么。维度Airtest图像识别PocoUI 控件树原理OpenCV 模板匹配在屏幕截图中找图读取 Android UI 层级树按属性定位元素定位方式图片模板Template(img)text / resourceId / textMatches稳定性受分辨率、主题、动画影响只要控件属性不变就稳定速度慢需截屏模板匹配快直接查控件树能断言什么图片是否存在图标、logo文本、按钮、列表项等有属性的控件统一断言入口assert_element封装三种断言方法poco_selector最推荐 text img兜底defassert_element(imgNone,textNone,poco_selectorNone,timeout10,interval1,msg元素不存在,snapshot_on_failTrue,test_nameNone):统一断言入口_log(f开始断言: text{text}, img{img}, selector{poco_selector})# 优先使用Poco断言iftextorpoco_selector:pocoPocoManager.get_instance()starttime.time()whiletime.time()-starttimeout:try:iftextandpoco(texttext).exists():_log(Poco断言成功)returnTrue# poco_selector 为字典选择器如 {text: xx, name: yy}# 必须用 ** 解包为关键字参数整体作为位置参数传入会抛异常并被下方 except 静默吞掉ifpoco_selectorandpoco(**poco_selector).exists():_log(Poco断言成功)returnTrueexceptException:passtime.sleep(interval)_log(Poco未命中)# fallback到图片断言ifimg:try:# 等待图片出现poswait(Template(img),timeouttimeout)ifpos:_log(图片断言成功)returnposexceptException:_log(图片断言未命中)# 失败处理ifsnapshot_on_fail:file_screenshot(assert_fail,test_name)_log(f截图:{file})raiseAssertionError(f{msg}| text{text}| img{img})2、三种用法及适用场景① Poco 选择器断言poco_selector— 最推荐适用于动态文本、需要多条件组合定位的元素。# 实例1威胁数量文案动态变化 — There are currently 1 threats# 数量会变精确匹配不到用正则匹配前缀assert_element(poco_selector{textMatches:PocoElements.THREAT_COUNT_TEXT_REGEX},timeoutAppConfig.TIMEOUT_MEDIUM,msg威胁数量文本未显示)# 实例2多属性组合定位如有必要assert_element(poco_selector{text:Scan Center,name:nav_item},timeoutAppConfig.TIMEOUT_LONG,msg导航项不存在)② 文本断言text— 静态文案适用于文案固定不变的按钮、标题、状态描述。# 实例扫描成功后的固定状态描述assert_element(textPocoElements.SUCCESS_DESCRIPTION,# There are no threats at the momenttimeoutAppConfig.TIMEOUT_SCAN,msg扫描成功描述未显示)③ 图片断言img— 无文字/无 ID 的图标适用于只有图片、没有文字和 ID 的场景如盾牌对勾图标、警告图标。# 实例扫描结果页的盾牌对勾图标assert_element(imgresources/images/threat.png,timeoutAppConfig.TIMEOUT_VERY_LONG,msg未检测到威胁警告图标)3、写一条用例的完整流程以快速扫描成功为例从零到一。步骤 1准备图像模板仅当需要 img 断言时把要断言的图标截图放到resources/images/命名语义化resources/images/├── threat.png # 威胁页警告图标├── home_quick_scan_btn.png└── quick_scan_sucess.png步骤 2在 PocoElements 定义文案常量utils/poco_elements.pyclassPocoElements:SUCCESS_DESCRIPTIONThere are no threats at the momentUNINSTALL_BUTTON_TEXTUninstall# 动态文案用正则THREAT_COUNT_TEXT_REGEXThere are currently.*步骤 3在 Page 类封装操作pages/home_page.pyclassHomePage(BaseAction):defclick_quick_scan(self):self.go_to_scan_center()self.click_by_text(PocoElements.SCAN_CENTER_QUICK_SCAN_TEXT,timeoutAppConfig.TIMEOUT_LONG)步骤 4写测试用例testcases/test_quick_scan_with_data.pyallure.title(快速扫描成功)deftest_quick_scan_success(self):# 1. 数据准备TestDataUtils.clean_virus_from_scan()# 2. 执行操作self.home_page.click_quick_scan()# 3. 断言固定文案 → textassert_element(textPocoElements.SUCCESS_DESCRIPTION,timeoutAppConfig.TIMEOUT_SCAN,msg扫描结果未显示安全状态)四、快速运行1、配置Android设备启用开发者选项和USB调试连接设备到电脑验证连接adb devices2、 运行测试使用run.py推荐python run.py此命令会✅ 执行所有测试用例✅ 生成Allure测试结果数据✅ 自动生成Allure HTML报告3、查看报告使用view_report.pypython view_report.py会自动打开最新的Allure报告。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑