Maestro 移动端 UI 自动化测试:用 YAML 在 5 分钟跑通第一个跨平台 Flow
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
发版前 48 小时,测试同学还在三台设备上手动点开同一个页面、同一组弹窗,一遍遍点。回归测试的价值本该在于"拦住问题",而不是消耗人力去重复点击。Maestro 是一款开源的移动 UI 与端到端自动化测试框架,用一套 YAML 就能覆盖 Android、iOS 和 Web 三端,在模拟器、真机或浏览器上都能跑,写第一个测试通常不超过五分钟。它的核心思路是把界面操作写成launchApp、tapOn、assertVisible这类可读命令,再由解释引擎直接执行,省掉了编译环节。
能做什么
YAML 流程:一套语法覆盖三端
把一次交互写成一行命令,多个命令串起来就是一个可重复执行的 Flow。它不需要编译,改完即跑,跨平台时只需换掉appId和个别选择器。
appId: com.android.contacts --- - launchApp - tapOn: "Create new contact" - inputText: "John" - assertVisible: "Save"多设备并行:把回归时间压下去
maestro test支持用--shard-split把一组 Flow 均分给 N 台已连接设备,或用--shard-all让每台设备都跑全量。设备数量不足时它会直接报错,而不是静默降级。命令定义在 TestCommand.kt。
maestro test flows/ --shard-split 3录制视频:把过程变成可分享的证据
maestro record会把一个 Flow 的执行过程渲染成带注释的视频,适合放进缺陷单或演示。本地渲染可输出 1920x1080 的 MP4,实现见 RecordCommand.kt。
maestro record flows/login.yaml --local跟着做
先确认环境满足前置条件:Maestro 需要 Java 17 及以上,用java -version检查。接着用官方脚本安装,它会自动下载二进制、写入 PATH:
curl -fsSL "https://get.maestro.mobile.dev" | bash maestro --version这里有个容易踩的坑:网上不少教程让你用./gradlew :maestro-studio:web:serve启动可视化界面,但当前仓库里并没有maestro-studio模块。Studio 是一个独立的免费桌面应用,不随 CLI 打包,也不在这个开源仓库中;CLI 里的maestro studio命令只负责打印一个下载提示(见 StudioCommand.kt)。所以别在这个仓库里找 Studio 的源码,直接去官网下载桌面端即可。
装好 CLI 后,用maestro download-samples拉一套现成的示例流程和配套 App,不必先写自己的用例。打开一个示例 Flow 看它长什么样,理解launchApp、tapOn、inputText、assertVisible的对应关系,再改成自己的包名。
maestro download-samples maestro test samples/flows/跑完一次后,如果某一步失败,Maestro 会在控制台打印调试产物目录(日志与截图),按提示定位卡在哪一步。想快速排查"到底能不能找到这个元素",可以用maestro print-hierarchy把当前界面的元素树打出来,确认id、text是否对得上,再回到 Flow 里改选择器。
一个完整走查
以一个"登录 → 搜索 → 加购 → 结算"的电商流程为例。下面把它拆进叙述里,而不是一份命令清单。
先登录。用户名和密码是敏感字段,用--env注入而不是写死在 YAML 里:
maestro test flows/shop.yaml -e username=alice -e password='x'- launchApp: com.example.shop - tapOn: "搜索" - inputText: ${username} - tapOn: "登录" - assertVisible: "首页推荐"搜索后进入列表。这里容易卡住:结果页往往还在异步加载,直接assertVisible会偶发失败。Maestro 的断言默认带自动等待,不需要手动sleep;但如果列表是懒加载,记得先scroll再断言目标元素,避免"元素其实在屏幕外"导致的误判。
- scroll: direction: DOWN - assertVisible: "加入购物车"最后加购并进入结算。如果某一步是弹出来的可选提示(比如"登录即代表同意协议"),给它加optional: true,让流程在提示不存在时也能继续,而不是一遇到差异就中断。
- tapOn: "加入购物车" - tapOn: text: "同意" optional: true - assertVisible: "结算"避坑与进阶
元素定位不准怎么办
自动识别的可见文本一旦改了文案就会断。更稳的做法是用稳定的id选择器(Android 的resource-id、iOS 的identifier),或组合条件缩小范围。真不确定时,用maestro print-hierarchy把当前界面元素树导出,抄真实属性比猜快得多。
- tapOn: id: "org.wikipedia:id/search_container"动态内容和偶发弹窗怎么处理
弹窗、引导页这类"可能出现的分支",用条件块只在满足条件时执行,而不是写死一条路。when: visible:让流程自己判断,避免每次都要清状态。仓库里的 Wikipedia 示例 就是这种写法:只在"Year in Review"弹窗可见时才去点掉它。
- runFlow: when: visible: "You have been logged out" commands: - tapOn: "Continue without logging in"多设备并行怎么配
设备少、Flow 多时用--shard-split N均分;需要每台设备都跑全量(比如跨分辨率覆盖)用--shard-all N。两者互斥,同时给会直接抛错。设备数量少于 N 时也会提前报错,省得跑到一半才发现"缺设备"。规模化后如果本地设备不够,maestro cloud可以把 Flow 丢到云端虚拟设备并行执行,命令形如maestro cloud app_file flows_folder/。
收尾
如果你是想让测试、开发甚至产品都能写用例的跨端回归团队,Maestro 值得一试:YAML 门槛低、三端通用、自带等待与并行。下一步,先用maestro download-samples跑通一个示例,再把包名换成你自己的 App 改三五行;若你关心的是发版前的多机型覆盖,直接上--shard-split把设备拉满。
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考