Maestro 从零到实战:用 YAML 测试流搞定移动端 UI 自动化
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
你有没有过这种时刻:UI 改完一行布局,手动把 App 点一遍;十个页面改完,就得重复十遍。更烦的是,今天能点的按钮,明天换个分辨率又对不上了。Maestro 就是为这类重复劳动而生的移动端 UI 自动化测试框架——把验证过程写成一份 YAML 文件,一条命令反复跑。
先认识一下 Maestro
Maestro 的定位一句话:用人类可读的 YAML 描述 UI 操作,在 Android、iOS 和 Web 上解释执行。它不需要你写 Java 或 Swift 测试代码,也不需要编译,改完 YAML 直接重跑即可,对前端开发、QA、甚至不写代码的产品同学都很友好。
几个决定体验的特性,先看这张表:
| 特性 | 说明 |
|---|---|
| 跨平台一套语法 | Android、iOS、Web 共用同一套 YAML 指令,只换目标应用 |
| 解释型执行 | 测试流无需编译,改完即跑,迭代成本极低 |
| 内置智能等待 | 找元素时自动重试等待,不需要手动 sleep 兜底 |
| 单脚本安装 | 一条 curl 命令装好,默认落在~/.maestro |
| 可视化辅助 | Maestro Studio 提供流构建器和元素检查,边看边写 |
一条命令装好 Maestro
环境检查和安装合并成四步走完:
- 确认本地 Java 是 17 或更高版本(这是硬依赖):
java -version - 版本达标后,运行官方安装脚本(macOS、Linux、Windows WSL 通用):
curl -fsSL "https://get.maestro.mobile.dev" | bash脚本会自动检查
java、unzip、curl是否齐全,缺哪个会明确提示;随后下载最新版压缩包、校验完整性、解压到~/.maestro。 - 如果提示 homebrew 版本冲突,用
brew upgrade maestro更新,或先brew uninstall maestro再重跑脚本。 - 打开新终端(或手动执行
export PATH="$PATH:$HOME/.maestro/bin"),运行maestro,看到帮助信息即安装成功。
核心指令速查
跑流之前,先认识下面这几条最常用的指令:
| 指令 | 作用 | 一行 YAML 示例 |
|---|---|---|
launchApp | 启动目标应用 | - launchApp |
tapOn | 点击元素(支持文本/ID 定位) | - tapOn: "Login" |
inputText | 在已聚焦的输入框打字 | - inputText: "maestro" |
assertVisible | 断言元素可见 | - assertVisible: "Credentials are correct" |
scroll | 滚动页面 | - scroll |
runFlow | 复用另一份 YAML 子流程 | - runFlow: subflows/onboarding-android.yaml |
两个值得多花一分钟的指令:
- tapOn:既支持字符串简写
- tapOn: "Login",也支持结构化写法,可以按text、id定位,用index: 1区分同文本的多个元素,加optional: true则元素缺失时不报错。仓库里 e2e/workspaces/wikipedia 的android-advanced-flow.yaml就是典型的组合用法。 - launchApp:应用侧用
appId指定包名,Web 侧换成url指定地址,其余语法完全一致。加clearState: true可以清空应用状态,保证每次从干净页面开始。
跑通你的第一个测试流
新建一个wikipedia_test.yaml,内容极简:
appId: org.wikipedia tags: - android - passing --- - launchApp文件头部是元信息(appId指向被测应用,tags用于分类筛选),---之后逐行写测试步骤。然后执行:
maestro test wikipedia_test.yaml应用被拉起、流程跑完且无报错,这条测试就通过了。仓库内置的 e2e/ 目录下有更多现成样例,可以照着改。
再上一个稍完整的例子:模拟一次登录表单填写。Web 项目把appId换成url即可,指令本身零改动:
url: https://www.saucedemo.com/ tags: - passing - web --- - launchApp: clearState: true # 每次从干净状态启动 - tapOn: Username - inputText: standard_user - tapOn: Password - inputText: secret_sauce - tapOn: text: Login index: 1 # 同文本多个元素时取第二个 - assertVisible: text: Products optional: true # CI 上偶发加载慢,缺失不致命tags给用例打了分类标签,之后可以按标签批量筛选执行;clearState保证每次运行互不干扰;optional给偶发不稳的断言留了余地。
让 flaky 用例变稳
UI 自动化最容易头疼的就是"本地能过、CI 抽风"。三条实用建议,都来自仓库里真实测试流的写法:
- 给偶现元素挂
optional: true。onboarding 引导页的"跳过"按钮不是每次都会出现,写成可选点击后,流程就不会因为它缺失而整体失败。 - 调整步骤顺序,替代 sleep。优先把"先断言上一个状态、再操作下一个元素"的顺序写对——
assertVisible本身带等待,它通过就意味着 UI 就绪了,多数场景根本不需要手动延时。 - 用 Maestro Studio 看现场。流在 CI 上失败时,与其猜,不如在 Studio 里逐帧查看元素树和截图,定位到底是元素变了还是时序问题,再把结论固化回 YAML。
上手自检清单
java -version输出 17 及以上,maestro命令能打印帮助信息- 至少一台 Android 模拟器(或真机)处于已连接状态
- 独立跑通过
maestro test,测试报告显示 passed - 自己的第一份 YAML 里写入了
tags,知道它的筛选用途 - 能区分
tapOn的字符串简写和text/id/index结构化写法 - 理解
optional: true和clearState: true分别解决什么问题
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考