十分钟让一份 UI 用例在 Android、iOS、Web 三端变绿:Maestro 完整指南
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
想象一个画面:你提交一个 YAML 文件,CI 里 Android、iOS、Web 三条流水线同时变绿。而现实里常见的另一面,是首页改版一次,三套定位符要挨个重改。Maestro 是一个跨平台 UI 自动化测试框架,用 YAML 描述步骤、按文本和语义找元素,并且内置智能等待,不写 sleep。这篇指南带你完成安装验证、跑通第一个登录用例,再把它调到稳定。
卖点速览
传统方案里,Android 用 Espresso、iOS 用 XCTest、Web 再拉一套工具,三种写法各维护一份断言。Maestro 把这些压成一份描述:
| 对比维度 | 传统多框架方案 | Maestro |
|---|---|---|
| 平台数 | 每端各写各的,三套维护 | 一份 YAML 三端复用 |
| 定位方式 | 精确选择器路径,改 UI 就断 | 文本与语义定位,抗变更 |
| 等待策略 | 手写 sleep,短了挂、长了慢 | 智能等待,自动等元素出现 |
| 是否编译 | 需要构建编译 | 解释执行,改完即跑 |
[!TIP] 脚本读起来像一份测试用例描述,而不是一段代码。这份"可读性"就是它最直接的体验差异。
从零到跑通 🛠️
前置条件只有一个:Java 17 及以上,用java -version确认。macOS、Linux、Windows(WSL)均可。
curl -fsSL "https://get.maestro.mobile.dev" | bash export PATH="$PATH:$HOME/.maestro/bin" maestro --version自检标准只有一条:命令打印出版本号,环境即就绪。
接下来写最小登录用例。一个 Flow 就是一个 YAML 文件:头部声明appId(移动端包名)与tags,---之后的行按顺序执行。
appId: com.example.ecommerce tags: - login - positive --- - launchApp: clearState: true - tapOn: "我的账户" - inputText: "standard_user" - inputText: "secret_sauce" - tapOn: "登录" - assertVisible: "我的订单"| 命令 | 作用 |
|---|---|
launchApp | 启动应用;clearState: true清空状态,环境干净 |
tapOn | 点击匹配到的元素 |
inputText | 向焦点元素输入文本 |
assertVisible | 断言元素可见,找不到则判失败 |
跑完看到步骤逐条变绿,第一步就算完成。负向用例不需要新结构:换一组锁定账号数据、末尾断言错误提示即可。需要分支时用if/then/else表达,比如仅当"验证码"可见才输入,否则点"跳过"。
偶发失败怎么办
先说默认行为:Maestro 会在点击、断言前自动等待元素就绪,多数"页面没加载完"的抖动不需要处理。当某条断言仍偶尔变红,有两种写法:
- retry: maxAttempts: 3 interval: 1000 command: assertVisible: "加载完成"把容易失手的步骤包一层重试,最多试 3 次、每次间隔 1 秒。另一种是拉长单条断言的等待上限:
- assertVisible: text: "支付成功" timeout: 10000注意边界:这两种手段都是"等更久",不是"一直等"。超时之后依然失败,问题就不在等待,回去查用例和数据。
定位三问 🔎
Element not found大多不是元素不存在,而是定位条件给得太死。按排查成本从低到高,问三个问题:
- 应用状态对不对:页面可能没翻到正确位置,或上次运行污染了状态。给
launchApp加clearState: true冷启动复现一次; - 能不能模糊匹配:文本里带单号、时间这类动态内容时,用
contains只匹配稳定片段; - 同名元素怎么区分:两个"提交"并存时,用
parent把范围锁进目标容器。
- tapOn: text: contains: "订单号" - tapOn: text: "提交" parent: text: "表单"先跑冷启动复现,再逐步放宽定位,别一上来就改选择器。
跨端执行
移动端与 Web 端只差头部一个字段:移动端写appId指定包名,Web 端用url指向页面地址,后面的步骤完全同构。仓库自带示例 e2e/workspaces/web/simple.yaml:url开头,输入用户名、密码、点登录,命令与移动端写法一致。逻辑只写一遍,元素在各端找得到就行。
要反复造随机数据时,inputRandomEmail、inputRandomNumber可以在运行时现生成邮箱或指定范围的数字,不必把测试数据写死。
交给 CI 前的验收
三件事做完,这份用例就够格进 CI:
| 验收项 | 判定标准 |
|---|---|
| 负向分支 | 锁定账号输入后,错误提示断言变绿 |
| Web 版 | 同一条流程换url后跑通 |
| 稳定性加固 | 偶发失败点套上retry或timeout,连续多轮不再翻红 |
到这一步,真正的收尾不是继续堆用例数量,而是确认这几条在 Android、iOS、Web 三端都稳定变绿。
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考