ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

AirTestIDE v1.2.9 Windows 稳定入门指南:适配雷电模拟器的实操闭环

AirTestIDE v1.2.9 Windows 稳定入门指南:适配雷电模拟器的实操闭环

简介:本资源是一份面向UI自动化测试初学者的AirTestIDE系统入门指南,专为测试工程师、开发人员及零基础想快速上手移动端自动化测试的学习者设计。内容覆盖AirTestIDE安装配置、Android模拟器连接、.air脚本创建与运行、Poco UI树解析、断言验证等核心实操环节,结构清晰、步骤详实,配套PDF文档含完整目录与代码示例,便于边学边练。资源为单文件PDF格式,共1个文件,大小6.98MB,轻量易读,适合作为桌面常备参考手册。目前已有1074人学习下载,涵盖从环境搭建到脚本调试、Poco Inspector使用、冻结模式操作及测试报告查看等全流程要点,特别适合需要快速掌握AirTest+Poco双框架协同工作的实战新手。

1. AirTestIDE 新手入门:装对版本比写对脚本更难,v1.2.9 是当前 Windows 下最稳的“不翻车”起点

刚接手模拟项目X 的 UI 自动化测试时,我让 A 同学用最新版 AirTestIDE(v1.3.0+)连雷电模拟器——结果卡在「设备列表空白」整整两小时。最后发现是 v1.3.x 默认启用了新版 ADB 服务,而雷电 v4.0.80 内置的 adb server 版本太老,握手失败却不报错,只在后台静默退出。换回官网明确标注「Windows64-win-1.2.9」的包,解压即用,5 分钟连上设备。这不是玄学,是血泪经验:AirTestIDE 不是越新越好,而是版本必须和你的模拟器/真机系统、ADB 环境、Python 运行时三者咬合严丝合缝。本文全程基于 v1.2.9 + 雷电模拟器 v4.0(Windows 平台),覆盖从零下载、设备直连、脚本录制到断言验证的完整链路。适合两类人:一是刚接触 UI 自动化、想绕过 Python 编程门槛直接上手截图写脚本的测试新人;二是需要快速验证某 App 页面跳转逻辑、又不想搭整套 pytest + allure 环境的开发同学。所有操作均在无额外依赖、不改系统环境变量的前提下完成,装完就能跑通「启动 App → 点搜索框 → 输入文本 → 断言按钮存在」这一闭环。


2. 安装与设备直连:解压即用,但 ADB 路径和模拟器设置是隐形关卡

2.1 下载与解压:只认官网 v1.2.9 的 Windows64 包

AirTestIDE 是个绿色免安装工具,但「绿色」不等于「随便下」。官网 changelog 页面明确列出 v1.2.9 的 Windows64 包名为AirtestIDE-win64-win-1.2.9.zip(注意后缀含-win,不是-py38或-py39)。其他渠道(如某些镜像站或第三方打包)可能混入非标 Python 运行时,导致 Poco 辅助窗无法加载。务必从 airtest.netease.com/changelog.html 页面找到该链接下载:

# 下载后校验文件大小(官方发布页标注为 287 MB 左右) ls -lh AirtestIDE-win64-win-1.2.9.zip # 正常应输出类似:-rw-r--r-- 1 user staff 287M 3 2 15:22 AirtestIDE-win64-win-1.2.9.zip

提示:不要解压到中文路径或带空格的目录(如D:\我的测试工具\AirtestIDE\),v1.2.9 的内置 Python 解释器在解析路径含空格时会触发UnicodeDecodeError。推荐解压到C:\AirtestIDE\或D:\airtest\这类纯英文短路径。

解压后双击AirtestIDE.exe即可启动。首次运行会弹出初始化窗口,全部点「跳过」——此时它会自动捆绑一个精简版 Python 3.8.10(位于AirtestIDE\pyscripts\python\),足够支撑基础 Airtest + Poco 功能,无需另行安装 Python。

2.2 雷电模拟器配置:开启 USB 调试 + 关闭「增强模式」

AirTestIDE 依赖 ADB 与设备通信,而雷电模拟器 v4.0 默认启用「增强模式」(即 Hyper-V 加速),这会导致 ADB 服务端口被占用或权限冲突。必须手动关闭:

  1. 启动雷电模拟器 → 右上角「设置」图标 → 「高级设置」
  2. 找到「性能设置」→ 将「启用增强模式」开关设为关闭
  3. 重启模拟器(关键!仅设置不重启无效)

接着开启 USB 调试:
模拟器内进入「设置」→「关于平板电脑」→ 连续点击「版本号」7 次 → 返回上一级出现「开发者选项」→ 进入并开启「USB 调试」

验证 ADB 是否就绪:
打开 Windows 命令提示符(CMD),输入:

adb devices

正常应返回:

List of devices attached emulator-5554 device

若显示offline或空白,说明 ADB 未正确识别。此时不要急着重装,先执行:

adb kill-server && adb start-server

再运行adb devices。如果仍无设备,检查雷电模拟器是否真的运行中(任务管理器看dnplayer.exe进程),以及 Windows 是否已安装雷电官方驱动(官网下载「雷电安卓模拟器驱动」独立安装包,非 Windows Update 自动推送的通用驱动)。

2.3 AirTestIDE 设备连接:三步确认法,拒绝「设备列表为空」

启动 AirTestIDE 后,界面右侧默认显示「移动设备连接」面板。此时需按顺序确认三件事:

  1. 确认 ADB 路径绑定:
    菜单栏 →「设置」→「Android 设置」→ 查看「ADB 目录」路径。v1.2.9 默认指向其内置 ADB(AirtestIDE\android_sdk\platform-tools\adb.exe),切勿手动改成系统全局 ADB 路径。因为内置 ADB 已针对此版本 IDE 做过兼容性 patch,外挂 ADB 极易引发device unauthorized弹窗。

  2. 强制刷新设备列表:
    在「移动设备连接」面板底部,点击「刷新 ADB」按钮(图标为两个循环箭头)。等待 3 秒,观察设备序列号是否出现。若仍为空,点击右侧「ADB 调试」按钮,查看底部控制台输出是否有error: device offline类报错。

  3. 双击设备触发同步:
    一旦看到emulator-5554或真机序列号,必须双击该行。这是关键动作:双击后 IDE 会自动向模拟器推送Yosemite.apk(AirTest 的专用输入法),并在设备窗实时同步屏幕画面。若跳过此步,后续所有 touch / wait 操作都将因「无画面反馈」而超时失败。

注意:Yosemite.apk 安装后会接管系统输入法。测试结束后,需手动进入模拟器「设置」→「系统管理」→「语言与输入法」→ 切回「雷电输入法」,否则键盘无法唤起。


3. 脚本创建与录制:.air项目是核心载体,截图即代码,但模板路径有陷阱

3.1 新建.air项目:不是新建.py文件,而是结构化工程

AirTestIDE 的.air项目本质是一个文件夹,内部包含script.py(主脚本)、tpl/(截图模板目录)、log/(日志)等子目录。新建时务必走标准流程:

菜单栏 →「文件」→「新建」→「Airtest 项目」→ 输入项目名(如netease_course_test)→ 选择保存路径(再次强调:纯英文路径,如D:\airtest\projects\netease_course_test)→ 点击「创建」

此时 IDE 会自动生成以下结构:

netease_course_test/ ├── script.py # 主脚本入口 ├── tpl/ # 截图模板存放目录(所有 .png 模板必须放这里!) │ └── tpl1607324047907.png └── .air # 隐藏配置文件,记录设备信息、Poco 设置等

提示:.air项目与普通 Python 脚本的核心区别在于——所有Template()调用的图片路径,IDE 会自动解析为相对于tpl/目录的相对路径。例如touch(Template("tpl1607324047907.png"))实际读取的是netease_course_test/tpl/tpl1607324047907.png。若手动新建.py文件并写同样代码,路径会解析失败。

3.2 录制启动 App 脚本:从「点图标」到「输文本」的四步闭环

以「网易云课程」App 为例(包名com.netease.educloud),按顺序操作:

  1. 确保设备窗已同步:双击设备列表后,右侧设备窗应实时显示模拟器桌面。若黑屏或卡顿,点击设备窗右上角「刷新」按钮。

  2. 截图 App 图标:
    点击顶部工具栏「Airtest 辅助窗」→ 在设备窗中用鼠标左键拖拽圈选「网易云课程」图标 → 松开后自动弹出截图编辑框 → 点「确认」,图片将存入tpl/目录,并在script.py中插入一行:

    touch(Template(r"tpl/tpl1607324047907.png", record_pos=(0.32, -0.25), resolution=(1080, 1920)))

    参数说明:record_pos是图标在屏幕中的归一化坐标(x, y),resolution是设备分辨率。这两项由 IDE 自动计算,切勿手动修改,否则截图匹配率暴跌。

  3. 等待并截图搜索按钮:
    等待 App 启动完成(可肉眼观察),点击「Airtest 辅助窗」→ 圈选搜索框右端的放大镜图标 → 确认。此时script.py新增:

    wait(Template(r"tpl/tpl1607324055123.png", record_pos=(0.85, 0.12), resolution=(1080, 1920)), timeout=10)
  4. 点击搜索框并输入文本:
    先圈选搜索框本身(输入区域),生成touch(...);再点击编辑区,在touch()下一行手动添加:

    text("上海悠悠")

    text()函数会调用 Yosemite 输入法,将字符串逐字发送。注意:text()前必须确保光标已在输入框内(即上一步touch()已成功点击搜索框)。

最终script.py关键片段如下:

# -*- encoding=utf8 -*- __author__ = "tester" from airtest.core.api import * auto_setup(__file__) # 1. 启动 App touch(Template(r"tpl/tpl1607324047907.png", record_pos=(0.32, -0.25), resolution=(1080, 1920))) # 2. 等待搜索按钮出现(超时 10 秒) wait(Template(r"tpl/tpl1607324055123.png", record_pos=(0.85, 0.12), resolution=(1080, 1920)), timeout=10) # 3. 点击搜索框 touch(Template(r"tpl/tpl1607324062345.png", record_pos=(0.5, 0.15), resolution=(1080, 1920))) # 4. 输入文本 text("上海悠悠")

3.3 执行部分代码:调试利器,但需警惕「上下文隔离」陷阱

AirTestIDE 支持选中任意代码段(如只选第 3、4 行)→ 右键 →「运行选中代码」(或 Ctrl+R)。这极大提升调试效率,但新手常踩坑:

  • 现象:选中text("上海悠悠")单独运行,报错NameError: name 'text' is not defined
  • 原因:text()函数需from airtest.core.api import *导入,而该语句在文件头部。选中执行时,IDE 仅执行所选代码,不自动补全导入语句。
  • 解决:要么选中时包含from airtest.core.api import *行;要么在「设置」→「运行设置」中勾选「运行选中代码时自动包含导入语句」(v1.2.9 默认未勾选,需手动开启)。

另一个陷阱是「设备上下文丢失」:若先运行了touch(...)启动 App,再单独运行wait(...),IDE 可能因设备状态缓存未更新而误判超时。最佳实践是:每次调试前,先点击设备窗右上角「刷新」按钮,强制同步最新画面。


4. Poco 辅助窗与 UI 树:当截图失效时,它是救命稻草,但 Android 模式要手动选

4.1 启用 Poco 辅助窗:不是点开就生效,必须指定平台并启动服务

AirTestIDE 的 Poco 辅助窗(UI 渲染树)与 Airtest 截图是两套独立引擎。启用前需确认:

  1. 设备已连接且双击激活(同 2.3 节)
  2. 左侧工具栏点击「Poco 辅助窗」(图标为< >)
  3. 在 Poco 辅助窗顶部下拉菜单中,手动选择「Android」(即使你连的是雷电模拟器,也选 Android,而非「Auto」或「Unity」)

此时若 UI 树为空白,说明 Poco 服务未在设备端启动。点击 Poco 辅助窗内的「Poco Inspector」按钮(图标为十字准星),IDE 会自动向设备推送pocoservice.jar并启动服务。首次启动需 5~10 秒,期间设备窗右上角会显示「正在启动 Poco 服务...」提示。

提示:Poco 服务依赖设备端的无障碍服务(Accessibility Service)。雷电模拟器 v4.0 默认已开启,但真机需手动进入「设置」→「辅助功能」→ 开启「AirTestPocoService」。若启动失败,控制台会报java.lang.SecurityException: AccessibilityService not enabled,此时需去设备设置中授权。

4.2 冻结模式:精准定位控件的必备操作

Poco Inspector 默认为「实时模式」:鼠标悬停在设备窗元素上,UI 树高亮对应节点;点击元素,UI 树展开并选中。但问题来了——很多 App 点击后页面跳转,你根本来不及看清控件属性。

解决方案是启用「冻结模式」:
点击 Poco 辅助窗右上角「冻结」按钮(图标为锁形)→ 此时设备窗画面定格,UI 树保持当前状态 → 你可从容点击任意位置,UI 树会高亮其父级控件 → 查看左侧属性面板中的name、type、text等字段。

例如,点击搜索框后,UI 树可能显示:

android.widget.EditText ├── name: "android:id/search_src_text" ├── text: "" └── enabled: True

此时即可在脚本中用 Poco 语法精准操作:

from poco.drivers.android.uiautomation import AndroidUiautomationPoco poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False) # 点击搜索框(用 name 定位,比截图稳定) poco("android:id/search_src_text").click() # 输入文本(Poco 模式下 text() 仍可用,但推荐用 set_text 更可靠) poco("android:id/search_src_text").set_text("上海悠悠")

4.3 Poco 与 Airtest 的协同策略:什么情况该切模式?

场景推荐方案原因
静态图标(App 图标、固定按钮)Airtest 截图快速直观,无需启动 Poco 服务
输入框、列表项、动态 ID 控件Poco 定位text="登录"比截图容忍度高,适配不同分辨率
WebView 内 H5 元素Poco + WebView 模式需在 Poco 辅助窗切换为「WebView」,并确保 App 内webview已启用调试
游戏 Unity 界面Poco + Unity 模式需 App 集成 Poco-SDK,v1.2.9 对 Unity 支持较成熟

注意:同一脚本中可混用两种方式,但需注意初始化。Airtest 脚本默认已from airtest.core.api import *,若要用 Poco,需额外from poco.drivers.android.uiautomation import AndroidUiautomationPoco并实例化poco对象。不要在.air项目中混用poco(...)和touch(Template(...))而不加注释,后期维护极易混乱。


5. 断言与报告:assert_exists 是第一道防线,但超时时间必须亲手调

5.1 四类断言的实战用法:从「存在」到「相等」的渐进验证

AirTestIDE 内置四种断言函数,全部位于airtest.core.api模块,无需额外导入。它们是自动化脚本的「质量守门员」:

  • assert_exists(v, msg=""):断言屏幕上存在某张截图(v 为 Template 对象)
  • assert_not_exists(v, msg=""):断言屏幕上不存在某张截图
  • assert_equal(first, second, msg=""):断言两个值相等(常用于poco(...).attr("text")返回值比对)
  • assert_not_equal(first, second, msg=""):断言两个值不相等

典型用例:验证「我的」页面是否成功登录

# 截图「我的」页面顶部的「登录/注册」按钮(未登录态) login_btn = Template(r"tpl/tpl1621832250338.png") # 断言该按钮存在(即未登录) assert_exists(login_btn, "我的页面存在登录/注册按钮") # 点击登录后,再次截图「我的」页面顶部的用户名(已登录态) username_txt = Template(r"tpl/tpl1621832261444.png") # 断言用户名存在(即已登录) assert_exists(username_txt, "我的页面存在用户名") # 进一步断言用户名文本为「上海悠悠」 actual_name = poco("com.netease.educloud:id/tv_username").get_text() assert_equal(actual_name, "上海悠悠", "用户名应为上海悠悠")

提示:assert_equal的first和second参数类型需严格一致。若poco(...).get_text()返回None,直接与字符串比较会抛TypeError。安全写法是先用assert_not_equal(actual_name, None),再比对内容。

5.2 断言失败的真相:不是脚本错了,而是超时参数没调对

新手最常问:「明明截图就在屏幕上,为什么assert_exists总报does not exist in screen?」答案十有八九是超时时间(timeout)太短。

assert_exists()默认 timeout 为 3 秒,但实际场景中:

  • 模拟器冷启动 App 需 5~8 秒
  • 网络请求加载头像需 2~3 秒
  • 动画过渡帧延迟导致截图匹配失败

必须显式传入 timeout:

# 错误:依赖默认 3 秒,大概率失败 assert_exists(Template("tpl/login_btn.png")) # 正确:根据场景设为 10 秒,给足加载时间 assert_exists(Template("tpl/login_btn.png"), timeout=10)

更精细的做法是结合wait()预热:

# 先等待元素出现(最长 15 秒),再断言(此时几乎必成功) wait(Template("tpl/login_btn.png"), timeout=15) assert_exists(Template("tpl/login_btn.png"), msg="登录按钮必须存在")

5.3 报告生成与快照:HTML 报告不是终点,而是调试起点

每次点击「运行」按钮,AirTestIDE 会在项目根目录下生成log/文件夹,内含:

  • log.txt:纯文本日志(含每步耗时、ADB 命令)
  • report/:HTML 报告目录(含index.html)
  • snapshot/:每步操作的截图(命名含时间戳)

查看报告的正确姿势:
运行结束后,按Ctrl+L(或菜单栏「查看」→「查看报告」),IDE 会自动用默认浏览器打开log/report/index.html。报告亮点在于:

  • 每行代码旁嵌入对应操作的截图(如touch(...)行旁是点击前的屏幕快照)
  • 红色高亮失败步骤,并显示AssertionError堆栈
  • 底部「Log」标签页可查看原始 ADB 输出,定位INSTALL_FAILED_UPDATE_INCOMPATIBLE类错误

提示:若报告中截图显示「黑屏」或「模糊」,说明设备窗未同步成功。此时需检查「移动设备连接」面板中设备状态是否为device,以及是否双击过设备序列号。黑屏报告毫无调试价值,务必先解决设备连接问题。


6. 命令行运行与环境定制:脱离 IDE 不是梦,但 Python 路径必须亲手指定

6.1 命令行运行.air脚本:用airtest run替代 IDE 点击

当需要集成到 CI/CD 流水线,或批量运行多个脚本时,必须脱离 IDE。v1.2.9 自带命令行工具airtest,位于AirtestIDE\pyscripts\目录下。

基础命令格式:

# 进入 AirtestIDE 安装目录 cd C:\AirtestIDE\ # 运行指定 .air 项目(注意:路径用正斜杠 / 或双反斜杠 \\) pyscripts\airtest run D:/airtest/projects/netease_course_test --device Android://127.0.0.1:5037/emulator-5554 --log D:/airtest/projects/netease_course_test/log

参数说明:

  • --device:指定设备 URI,格式为Android://<host>:<port>/<serial>。127.0.0.1:5037是 ADB 默认地址,emulator-5554是设备序列号(adb devices查看)
  • --log:指定日志输出目录,必须存在且可写
  • --recording:添加此参数可同时录制操作视频(需设备支持screenrecord)

生成 HTML 报告:
命令行运行后,log/目录已生成原始日志,但 HTML 报告需额外命令生成:

pyscripts\airtest report D:/airtest/projects/netease_course_test/log --output_root D:/airtest/projects/netease_course_test/report --static_root pyscripts/static/

注意:--static_root必须指向pyscripts/static/,这是 v1.2.9 内置的报告模板资源目录。若指向错误,报告页面将无样式、无 JS 交互。

6.2 自定义 Python.exe 路径:当内置 Python 不够用时

v1.2.9 内置 Python 3.8.10 足够跑通 Airtest + Poco,但若需:

  • 使用requests等第三方库发 HTTP 请求
  • 集成pytest做参数化测试
  • 调用cv2做图像预处理

则必须替换为完整 Python 环境。操作路径:
菜单栏 →「设置」→「Airtest 设置」→「自定义 Python.exe 路径」→ 点击「浏览」选择你本地安装的python.exe(如C:\Python39\python.exe)

关键验证步骤:

  1. 替换后重启 AirTestIDE
  2. 新建一个.py脚本(非.air),写:
    import sys print(sys.executable) # 应输出你指定的路径 print(sys.version) # 应输出对应版本号
  3. 运行该脚本,确认输出无误

注意:自定义 Python 后,.air项目仍使用内置 Python,只有.py脚本才走自定义路径。若想让.air也用自定义 Python,需手动修改项目.air配置文件(不推荐,易破坏 IDE 兼容性)。

6.3 常见问题排查:三类高频翻车现场与后悔药

现象 1:命令行运行报错ModuleNotFoundError: No module named 'airtest'
  • 原因:airtest命令未在 PATH 中,或当前 shell 未激活 AirTestIDE 的 Python 环境
  • 解决:绝对不要用pip install airtest。直接使用AirtestIDE\pyscripts\airtest.bat(Windows)或airtest.sh(Mac/Linux),它会自动注入内置 Python 路径。或者 cd 到pyscripts/目录下执行:
    cd C:\AirtestIDE\pyscripts\ airtest run D:/project --device Android://...
现象 2:Poco 辅助窗显示Connection refused
  • 原因:设备端 Poco 服务崩溃,或 ADB 端口被占用
  • 解决:
    1. 在设备上进入「设置」→「应用管理」→ 找到「PocoService」→ 强制停止
    2. CMD 中执行adb shell am force-stop com.netease.open.pocoservice
    3. 重启 AirTestIDE,重新点击「Poco Inspector」
现象 3:text()输入中文乱码或不显示
  • 原因:Yosemite 输入法未设为默认,或模拟器输入法切换异常
  • 解决:
    1. 模拟器内「设置」→「语言与输入法」→ 确保「Yosemite」排在第一位
    2. 若仍无效,卸载设备上的Yosemite.apk(adb uninstall com.netease.open.yosemite),重启 IDE 后重连设备,自动重装

从那以后我每次新装 AirTestIDE,都强制走一遍「下载 v1.2.9 → 解压到英文路径 → 启动后跳过初始化 → 连雷电模拟器 → 双击设备 → 截图录第一行 touch」这个最小闭环。只要这五步通,后面所有功能都是水到渠成。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表