Maestro 移动UI自动化教程:一份 YAML 跑通 Android 与 iOS 的跨平台测试
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
很多团队的移动UI自动化用例是这样的:同一段登录逻辑,Android 得用 Espresso 写一遍、iOS 用 XCTest 再写一遍,还得防着界面动画没加载完就断言、一跑就飘。Maestro 就是冲着这个痛点来的——它是一款开源的移动UI自动化测试框架,让你用一份 YAML 写测试流程,同一份用例即可在 Android、iOS 和 Web 上统一跑,靠解释式执行引擎自动等待,省掉大量手写 sleep 和平台分支代码。
🚀 三行命令跑通首个 Maestro 测试
先确认系统里有 Java 17 及以上(java -version),再用一条命令装好 CLI:
# 安装(macOS / Linux / Windows WSL) curl -fsSL "https://get.maestro.mobile.dev" | bash # 运行某个流程 maestro test flow.yaml建一个最小流程flow.yaml,跑起来看效果:
appId: com.android.contacts --- - launchApp - tapOn: "Create new contact" - inputText: "John" - assertVisible: "John"maestro test flow.yaml执行后,CLI 会连上设备、装好应用、按顺序执行每一步,最后给出通过或失败。流程无需编译,改完 YAML 直接重跑——这是它和 Appium 那套"先构建再跑"最大的差别。
Maestro 常用命令速查表
先认识最常用的几个,其余用到再翻官方文档:
| 命令 | 作用 | 最小示例 |
|---|---|---|
launchApp | 启动目标应用 | - launchApp |
tapOn | 点击元素或坐标 | - tapOn: "Save" |
inputText | 向焦点输入文本 | - inputText: "John" |
assertVisible | 断言元素出现 | - assertVisible: "Done" |
assertNotVisible | 断言元素消失 | - assertNotVisible: "Loading" |
scroll | 滚动到目标出现 | - scroll |
runFlow | 复用另一个 YAML | - runFlow: login.yaml |
🔍 逐行拆解一个仓库里的真实流程
命令认识了,看个真实例子更直观。仓库里 e2e/workspaces/wikipedia/subflows/onboarding-android.yaml 是处理 Wikipedia 首次启动引导页的流程,很短,但每一步都值得讲:
appId: org.wikipedia --- - launchApp: clearState: true - tapOn: id: "org.wikipedia:id/fragment_onboarding_forward_button" - tapOn: id: "org.wikipedia:id/fragment_onboarding_forward_button" - tapOn: id: "org.wikipedia:id/fragment_onboarding_done_button"clearState: true:每次启动都清空应用状态,保证一定停在引导页。最容易踩的坑就是不加它——上次已过了引导,这次直接进首页,后面所有点击全部扑空。- 用
id而不是文案定位:引导页"下一页"按钮在不同语言、不同版本里文案会变,靠text匹配迟早挂;id是开发写死的资源名,稳定得多。 - 连点三次
forward_button:引导是固定的三页,写死次数比"循环直到消失"更可控;页数将来会变,再换回按文案或条件判断。 - 收尾点
done_button:末页按钮 id 不同,别偷懒复用前一个,这里最易看错 id 点空。
让用例不 flaky 的三招
飘来飘去的用例,八成出在这三处:
# 1) 定位:优先 id / 稳定文案,别依赖 index - tapOn: id: "com.example:id/save" # 2) 等待与断言:用 assertVisible 顶替固定 sleep - assertVisible: "登录成功" - assertNotVisible: "Loading" # 3) 参数化:env 注入,同一文件跑多组数据 - inputText: "${USERNAME}"- 定位:能用
id就用id,退一步用长期不变的文案,尽量避开index——列表一插入元素,索引就错位。 - 等待与断言:Maestro 每步都会自动等待元素就绪,把"等待"表达成
assertVisible/assertNotVisible,别写sleep猜时长,猜短了飘、猜长了慢。 - 参数化:把账号、地址这类变量用
${VAR}引用,配合env注入,同一份流程就能跑多组数据,不用一组账号复制一份 YAML。仓库里 android-advanced-flow.yaml 用runScript加${output.result}就是动态取值的写法。
📈 什么时候该从 CLI 升级到 Studio 和 Cloud
CLI 覆盖单机日常回归已经够用。当你开始手工排查元素(Studio 提供可视化录制与元素检查,不用反复跑 CLI 猜选择器)或用例多到本地跑一轮要等很久(Cloud 在分布式设备上并行执行、环境确定、带完整报告)时,再考虑往上走。两者都围绕同一套 YAML,切换成本很低,不必一开始就上。
把 Maestro 接入 GitHub Actions
把回归挂到 CI 上,push 即跑,最小配置长这样:
name: Maestro on: [push] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - run: curl -fsSL "https://get.maestro.mobile.dev" | bash - run: maestro test ./flows/移动端还得在 CI 里起模拟器/仿真器,这一步比配置本身更花时间,但一旦跑通,每次提交都能自动拦一道 UI 回归。
收益很实在:一份 YAML 通吃 Android、iOS 与 Web,用例不再因等待和定位写得随意而飘。接下来三件事就能落地:把最常被复测的三条主路径(登录、下单、支付)先搬成 YAML 跑起来;用runFlow把公共步骤抽成子流程;再挑一个流程接入 CI,让每次 push 自动回归。
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考