Maestro 从零到实战:用 YAML 测试流搞定移动端 UI 自动化
2026/9/11 5:56:57 网站建设 项目流程

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

环境检查和安装合并成四步走完:

  1. 确认本地 Java 是 17 或更高版本(这是硬依赖):
    java -version
  2. 版本达标后,运行官方安装脚本(macOS、Linux、Windows WSL 通用):
    curl -fsSL "https://get.maestro.mobile.dev" | bash

    脚本会自动检查javaunzipcurl是否齐全,缺哪个会明确提示;随后下载最新版压缩包、校验完整性、解压到~/.maestro

  3. 如果提示 homebrew 版本冲突,用brew upgrade maestro更新,或先brew uninstall maestro再重跑脚本。
  4. 打开新终端(或手动执行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",也支持结构化写法,可以按textid定位,用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 抽风"。三条实用建议,都来自仓库里真实测试流的写法:

  1. 给偶现元素挂optional: true。onboarding 引导页的"跳过"按钮不是每次都会出现,写成可选点击后,流程就不会因为它缺失而整体失败。
  2. 调整步骤顺序,替代 sleep。优先把"先断言上一个状态、再操作下一个元素"的顺序写对——assertVisible本身带等待,它通过就意味着 UI 就绪了,多数场景根本不需要手动延时。
  3. 用 Maestro Studio 看现场。流在 CI 上失败时,与其猜,不如在 Studio 里逐帧查看元素树和截图,定位到底是元素变了还是时序问题,再把结论固化回 YAML。

上手自检清单

  • java -version输出 17 及以上,maestro命令能打印帮助信息
  • 至少一台 Android 模拟器(或真机)处于已连接状态
  • 独立跑通过maestro test,测试报告显示 passed
  • 自己的第一份 YAML 里写入了tags,知道它的筛选用途
  • 能区分tapOn的字符串简写和text/id/index结构化写法
  • 理解optional: trueclearState: true分别解决什么问题

【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询