基于图像识别的跨平台 UI 自动化框架:Airtest 安装、Python API 与 CLI 实战指南
测试质量保障计算机视觉【免费下载链接】AirtestUI Automation Framework for Games and Apps项目地址https://gitcode.com/gh_mirrors/ai/Airtest点击查看免费下载Airtest 是网易开源的跨平台 UI 自动化框架专为游戏和 App 设计核心思路是用图像识别技术定位 UI 元素让测试脚本无需向被测程序注入任何代码即可完成点击、滑动、输入与断言。本文将围绕仓库根目录的 README.md 展开结合 airtest/core/api.py、airtest/core/cv.py 等源码实现带你从安装环境、编写第一个 Python 脚本到用命令行批量运行.air用例形成一套可落地的完整实践路径。Airtest 是什么项目定位与核心设计Airtest 的定位是Cross-Platform UI Automation Framework for Games and Apps跨平台的 UI 自动化框架适用于游戏和 App。它围绕三个核心设计理念构建Write Once, Run Anywhere一次编写随处运行提供跨平台的统一 API涵盖应用安装、模拟输入、断言等能力。由于 UI 定位完全依赖图像识别同一份脚本可以在 Android、iOS、Windows 等不同平台上运行无需为每个平台单独写代码。无需注入代码通过图像识别技术定位 UI 元素测试脚本与被测应用完全解耦这是它与基于控件树如 UIAutomator框架的根本区别。规模化可扩展提供命令行与 Python 接口可以轻松跑在大型设备集群上运行过程自动生成包含详细步骤和录屏的 HTML 报告帮助快速定位失败点。配套生态还包括两个重要组件AirtestIDE——开箱即用的 GUI 工具支持录制脚本 → 真机回放 → 生成报告的完整自动化工作流Poco——可以直接访问 UI 控件层级widget hierarchy的框架支持主流平台和游戏引擎通过 Python API 操作 UI 控件实现更高级的自动化控制。跨平台支持矩阵在动手之前先明确 Airtest 对各平台的支持边界。根据 docs/wiki/device/platforms.md 中的对照表平台AirtestPocoAndroid√√Android 模拟器√√iOS√配合 iOS-Tagent√配合 iOS-TagentWindows√暂不支持Cocos2dx-js / Cocos2dx-lua√√Unity3D√√Egret√√微信小程序 Webview√√网易系引擎√√其他引擎√√需接入 Poco SDK补充几点值得注意的边界Android兼容市面上绝大多数 Android 手机2.3 Android 11以及部分平板设备小米 MIUI 11 及以上版本建议使用cap_methodJAVACAP模式连接。Android 模拟器已验证夜神 Nox、网易 MuMu、逍遥、iTools、腾讯手游助手、BlueStacks 以及 AVD 等常见模拟器。iOS支持情况以 iOS-Tagent 为准仓库文档记录 Xcode 11.5、iOS 13.5 的组合。安装与环境准备Airtest 是一个标准的 Python 库通过 pip 即可安装pip install -U airtestMacOS/Linux 下的 adb 权限配置Airtest 在操作 Android 设备时需要调用 adb。仓库在 airtest/core/android/static/adb 目录下按平台内置了 adb 二进制linux/、linux_arm/、mac/、windows/。在 MacOS/Linux 上安装后需要手动授予 adb 可执行权限# mac 系统 cd {your_python_path}/site-packages/airtest/core/android/static/adb/mac # linux 系统 # cd {your_python_path}/site-packages/airtest/core/android/static/adb/linux chmod x adb如果需要图形化录制与调试可以从官网下载 AirtestIDE纯 Python 环境 命令行同样可以完成全部自动化工作。第一个自动化脚本Python API 三步走Airtest 希望提供平台无关的 API让自动化代码可以运行在不同平台的应用上。使用流程可以归纳为三步使用connect_device或init_device连接任意 Android 设备、iOS 设备或 Windows 窗口使用模拟输入 API 自动化你的游戏或 App不要忘记声明断言来验证结果。下面这个示例完整演示了从连接设备、安装启动、点击滑动到断言退出的全流程来自 README.mdfrom airtest.core.api import * # 通过 ADB 连接本地 Android 设备 init_device(Android) # 或者使用 connect_device 函数 # connect_device(Android:///) install(path/to/your/apk) start_app(package_name_of_your_apk) touch(Template(image_of_a_button.png)) swipe(Template(slide_start.png), Template(slide_end.png)) assert_exists(Template(success.png)) keyevent(BACK) home() uninstall(package_name_of_your_apk)连接设备init_device 与 connect_device连接 API 定义在 airtest/core/api.py 中init_device(platformAndroid, uuidNone, **kwargs)按平台类型初始化设备并设为当前设备。platform支持Android、IOS、Windowsuuid对应 Android 序列号、Windows 窗口句柄或 iOS 设备标识kwargs可传平台特有参数如cap_methodJAVACAP。connect_device(uri)更推荐的方式用一条 URI 字符串描述设备内部调用parse_device_uri解析后交给init_device。URI 格式为android://adbhost:adbport/serialno?paramvalueparam2value2。从源码 docstring 中可以提炼出常用的 URI 写法connect_device(Android:///) # 本机 ADB 默认参数 connect_device(Android:///SJE5T17B17?cap_methodjavacaptouch_methodadb) # 指定序列号与采集/触控方式 connect_device(Android://127.0.0.1:5037/10.254.60.1:5555) # 连接远程设备 connect_device(Windows:///) # 连接桌面 connect_device(Windows:///?title_re.*explorer.*) # 按窗口标题正则匹配 connect_device(iOS:///127.0.0.1:8100) # iOS 设备多设备场景下device()返回当前活跃设备set_current(idx)支持用序列号或索引切换当前设备见 api.py。图像识别核心Template 对象touch、swipe、wait、exists等 API 的参数v既可以是绝对坐标元组(x, y)也可以是Template对象。Template定义在 airtest/core/cv.py其核心构造参数包括filename模板图片文件名threshold匹配阈值默认取ST.THRESHOLD默认 0.7范围 [0, 1]target_pos模板上哪个点作为点击目标默认取中心点TargetPos.MIDrecord_pos/resolution录制时的相对位置与屏幕分辨率用于跨分辨率缩放预测rgb是否使用 RGB 三通道校验scale_max/scale_step多尺度模板匹配的最大范围与搜索步长。匹配策略由 airtest/core/settings.py 中的CVSTRATEGY控制默认值为[mstpl, tpl, sift, brisk]当 OpenCV 版本介于 3.4.2 与 4.4.0 之间时自动降级为[mstpl, tpl, brisk]因为 sift/surf/brief 依赖 opencv-contrib。Template.match_in会按策略依次尝试直到某个算法命中。这也解释了为什么 Airtest 对截图模糊、旋转、尺度变化有较好容忍度——它把多种匹配算法串成了可配置的策略链。模拟输入与常用操作touch、swipe、keyevent、text等模拟输入 API 都封装在 api.py 中几个典型用法touch(Template(rtpl1606730579419.png, target_pos5)) # 点击图片中心 touch((0.5, 0.5)) # 支持相对坐标屏幕比例 touch((100, 100), times2) # 双击Android/Windows 还支持 duration 参数 swipe((0.7, 0.5), (0.2, 0.5)) # 从屏幕右侧滑到左侧 swipe(Template(rtpl1606814865574.png), vector[-0.0316, -0.3311]) # 沿向量滑动 keyevent(HOME) # Android 等效 adb shell input keyevent text(test, enterTrue) # 输入文本默认回车 sleep(2) # 等待会记录进报告 wait(Template(rtpl1606821804906.png), timeout120, interval3) # 等待元素出现 pos exists(Template(rtpl1606822430589.png)) # 判断存在返回坐标注意touch click是别名二者完全等价。对于swipe传参有两种方式swipe(v1, v2Template(...))从 v1 滑向 v2或swipe(v1, vector(x, y))从 v1 出发沿向量滑动。断言验证期望结果断言 API 集中在 airtest/core/assertions.py常用的是assert_exists(Template(success.png), 登录成功) # 断言目标存在失败抛 AssertionError assert_not_exists(Template(ad.png), 无广告弹窗) # 断言目标不存在 assert_equal(actual, expected, msg) # 值相等断言assert_exists内部通过loop_find循环查找超时时间取ST.FIND_TIMEOUT默认 20 秒失败时抛出带自定义msg的AssertionError。在命令行运行模式下断言失败会让进程以特定退出码结束见下文 CLI 部分。脚本环境初始化auto_setup在独立 Python 脚本中运行非.air工程推荐先调用auto_setup完成运行环境初始化auto_setup(__file__) auto_setup(__file__, devices[Android://127.0.0.1:5037/SJE5T17B17], logdirTrue, project_rootrD:\\test\\logs, compress90)auto_setup会依次完成登记脚本所在目录basedir用于定位模板图片、设置日志目录logdir、按 URI 列表连接设备devices、设置项目根目录project_root、设置截图压缩率compress范围 [1, 99]。用命令行运行.air脚本使用 AirtestIDE 可以轻松录制自动化脚本并保存为.air目录结构而 Airtest 命令行则让你脱离 IDE在不同的宿主机器和被测设备上直接运行脚本。基础用法# 在本地 ADB 连接的安卓手机上运行脚本 airtest run path to your air dir --device Android:/// # 在 Windows 应用上运行脚本按窗口标题正则匹配 airtest run path to your air dir --device Windows:///?title_reUnity.* # 生成 HTML 报告 airtest report path to your air dir # 也可以用 python -m 的方式使用命令行 python -m airtest run path to your air dir --device Android:///CLI 子命令与参数详解从 airtest/cli/parser.py 的源码可以看到CLI 提供了四个子命令version显示版本号并退出run运行脚本核心命令info读取并打印脚本的作者/标题/描述信息实现见 airtest/cli/info.pyreport为脚本生成 HTML 报告。run子命令的完整参数来自runner_parser参数含义默认值script.air目录路径必填--device设备 URI 字符串如Android:///可多次追加以连接多台设备无不连接设备--log设置日志目录默认是脚本所在目录也可指定路径无不保存日志--compress截图质量整数 1-9910--recording运行过程中录屏可指定.mp4文件名无不录屏--no-image不保存截图无执行入口在 airtest/cli/main.pyrun动作会调用 airtest/cli/runner.py 中的run_script其内部通过unittest的TestSuite把脚本包装成测试用例执行。这也解释了 CLI 的退出码约定断言失败AssertionError时进程以20退出其他异常以-1退出方便在 CI 中判断结果。setup_by_argsrunner.py会完成运行前准备解析--device列表连接设备、根据脚本目录计算basedir用于查找模板图片、设置日志目录、把--compress写入ST.SNAPSHOT_QUALITY并默认把.air所在目录的上级目录推断为PROJECT_ROOT。录屏与报告当同时传入--log与--recording时AirtestCase.setUp会为每台设备启动录屏命名规则为单设备时用指定文件名如test.mp4多设备时自动加序列号前缀如SJE5T17B17_test.mp4未指定文件名时默认为recording_{设备序列号}.mp4见 runner.py。实战示例运行 test_blackjack 用例仓库自带一个完整的示例工程 playground/test_blackjack.air这是一个基于 Cocos2d 的 Blackjack 游戏自动化用例非常适合验证环境是否就绪。其核心脚本playground/test_blackjack.air/test_blackjack.py展示了几种关键写法from airtest.core.api import * import os auto_setup(__file__) PWD os.path.dirname(__file__) PKG org.cocos2d.blackjack APK os.path.join(PWD, blackjack-release-signed.apk) if PKG not in device().list_app(): install(APK) stop_app(PKG) wake() start_app(PKG) sleep(2) touch(Template(rtpl1499240443959.png, record_pos(0.22, -0.165), resolution(2560, 1536))) assert_exists(Template(rtpl1499240472304.png, record_pos(0.0, -0.094), resolution(2560, 1536)), 请下注) p wait(Template(rtpl1499240490986.png, record_pos(-0.443, -0.273), resolution(2560, 1536))) touch(p) swipe(Template(rtpl1523932626575.png, record_pos(-0.266, 0.105), resolution(1920, 1080)), vector[0.0005, -0.4023]) assert_exists(Template(rtpl1523933150565.png, record_pos(-0.213, 0.103), resolution(1920, 1080)), Swipe succeed)这个示例值得注意的实践要点record_posresolution组合录制时的相对位置与屏幕分辨率会参与跨分辨率适配配合_resize_image的逻辑cv.py同一套模板在不同分辨率设备上也能匹配这正是一次编写、随处运行的底层保障之一wait返回值复用wait()返回匹配到的坐标直接传给touch()避免二次图像搜索断言带业务语义assert_exists(..., 请下注)的msg会写入报告失败时便于定位。用命令行跑起来试试# 连接一台 Android 设备后 airtest run playground/test_blackjack.air --device Android:/// --log --recording airtest report playground/test_blackjack.air--log --recording会在脚本目录生成日志目录与录屏文件airtest report则将其渲染为带步骤、截图和录屏的 HTML 报告。小结本文以仓库 README 为主线完成了从框架定位到实战落地的全链路梳理Airtest 用图像识别取代控件注入换来跨平台与免代码嵌入的灵活性通过pip一行安装即可获得完整 Python API 与 CLIconnect_device的 URI 体系统一了 Android/iOS/Windows 的设备接入TemplateCVSTRATEGY多算法策略链保证了匹配的鲁棒性CLI 的run/report/info子命令与录屏、截图、退出码约定则为大规模设备集群和 CI 集成交出了工程化答案。后续深入学习可以继续阅读airtest/core/api.py全部核心 API 的签名与用法 docstringairtest/core/cv.pyTemplate与图像识别策略实现airtest/core/settings.pyST全局配置项阈值、超时、截图质量等docs/wiki/device/platforms.md平台支持与设备连接注意事项tests各模块的单元测试是理解行为细节的最佳参考。赞分享测试质量保障计算机视觉【免费下载链接】AirtestUI Automation Framework for Games and Apps项目地址https://gitcode.com/gh_mirrors/ai/Airtest点击查看免费下载相关推荐Airtest跨平台UI自动化测试框架全面解析Airtest跨平台UI自动化测试框架全面解析 什么是Airtest Airtest是一款强大的跨平台UI自动化测试框架专为游戏和应用测试而设计。它采用创新的测试质量保障计算机视觉告别像素级定位RPA-Python图像识别技术实现跨平台UI自动化告别像素级定位RPA Python图像识别技术实现跨平台UI自动化 你是否还在为不同分辨率下UI元素定位失效而烦恼是否因应用界面频繁更新导致脚本维护成本激增RPA浏览器控制GUI 自动化工作流自动化【亲测免费】探索Airtest高效智能的跨平台UI自动化测试框架【亲测免费】探索Airtest高效智能的跨平台UI自动化测试框架 Airtest是一款高效智能的跨平台UI自动化测试框架专为游戏和应用程序设计。它提供了简单测试质量保障计算机视觉上一篇使用 PHP-CS-Fixer 的 PHP8x3Migration 规则集将代码迁移到 PHP 8.3 兼容下一篇rust-raspberrypi-OS-tutorials 教程 14MMIO 重映射——从整体恒等映射到按需虚拟内存映射创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Docker之镜像、容器、数据卷关系

Docker之镜像、容器、数据卷关系

Docker之镜像、容器、数据卷关系一个 Image(镜像)可以创建多个 Container(容器);Container 挂载 Volume(数据卷)后,数据可以在删除旧容器、创建新容器后继续使用。概念含义类比Image…

2026/9/24 15:57:07 阅读更多 →
LX Music 桌面版免费多源音乐搜索下载完整指南

LX Music 桌面版免费多源音乐搜索下载完整指南

LX Music 桌面版免费多源音乐搜索下载完整指南 【免费下载链接】lx-music-desktop 一个基于 Electron 的音乐软件 项目地址: https://gitcode.com/GitHub_Trending/lx/lx-music-desktop 凌晨一点,想找一首歌的完整版,你翻遍了三个音乐 App&#x…

2026/9/24 15:57:07 阅读更多 →
Humanizer ByteSizeExtensions 完全指南:.NET 字节与位单位转换、人性化格式化与速率计算的扩展方法全景

Humanizer ByteSizeExtensions 完全指南:.NET 字节与位单位转换、人性化格式化与速率计算的扩展方法全景

开发工具 【免费下载链接】Humanizer Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities 项目地址: https://gitcode.com/gh_mirrors/hu/Humanizer 点击查看 免费下载 本篇技…

2026/9/24 15:57:07 阅读更多 →

最新新闻

fq 解码 AVI:样本索引优先级、流信息提取与解码加速实战指南

fq 解码 AVI:样本索引优先级、流信息提取与解码加速实战指南

fq 解码 AVI:样本索引优先级、流信息提取与解码加速实战指南 【免费下载链接】fq fq - jq for binary formats. Tool, language and decoders for working with binary formats. 项目地址: https://gitcode.com/gh_mirrors/fq/fq fq 是面向二进制格式的 jq 工…

2026/9/24 16:38:45 阅读更多 →
基于 CentOS7 搭建 5 节点三层高可用 Web 集群功能实现

基于 CentOS7 搭建 5 节点三层高可用 Web 集群功能实现

1.编写 Shell 批量运维脚本,替代重复手动命令,提升部署效率;通过 免密 SSH 批量循环脚本 健壮性判断 日志输出,实现: 一键启停全集群服务、一键巡检所有节点状态、自动化运维替代人工免密 SSH 原理:管理…

2026/9/24 16:38:45 阅读更多 →
Keystone 6 测试实战:用 getContext + node:test 为 GraphQL API 编写集成测试

Keystone 6 测试实战:用 getContext + node:test 为 GraphQL API 编写集成测试

后端 【免费下载链接】keystone The superpowered headless CMS for Node.js — built with GraphQL and React 项目地址: https://gitcode.com/gh_mirrors/key/keystone 点击查看 免费下载 导读 本指南以仓库中的 examples/testing 示例项目为主线,讲…

2026/9/24 16:38:45 阅读更多 →
Dart 分析服务器代码补全(Code Completion)实现指南:从请求处理到候选排序的完整链路

Dart 分析服务器代码补全(Code Completion)实现指南:从请求处理到候选排序的完整链路

Dart 分析服务器代码补全(Code Completion)实现指南:从请求处理到候选排序的完整链路 【免费下载链接】sdk The Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more. 项目地址: https://gitcode.com/…

2026/9/24 16:38:45 阅读更多 →
Whisper Windows 移植版:基于 DirectCompute 的高性能 GPGPU 推理指南

Whisper Windows 移植版:基于 DirectCompute 的高性能 GPGPU 推理指南

人工智能语音音频本地部署桌面应用 【免费下载链接】Whisper High-performance GPGPU inference of OpenAIs Whisper automatic speech recognition (ASR) model 项目地址: https://gitcode.com/gh_mirrors/wh/Whisper 点击查看 免费下载 本指南以仓库根目录 Readm…

2026/9/24 16:38:44 阅读更多 →
AWS SDK for C++ 跨服务示例全解析:从 Aurora Serverless 任务追踪器到 SNS/SQS 发布订阅

AWS SDK for C++ 跨服务示例全解析:从 Aurora Serverless 任务追踪器到 SNS/SQS 发布订阅

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地…

2026/9/24 16:37:44 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →