Maestro:用 YAML 脚本驱动 Android、iOS 与 Web 的跨平台 UI 自动化
Maestro用 YAML 脚本驱动 Android、iOS 与 Web 的跨平台 UI 自动化【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro同一个 App安卓和 iOS 各维护一套 UI 测试脚本改一次按钮文案要同步改两份Web 端还得再写一套 Selenium 用例。Maestro 用一份 YAML 脚本统一描述测试流程在 Android 模拟器、iOS 模拟器和浏览器上执行同一套操作与断言把三套脚本的维护成本压成一套。它是什么为什么选它一句话定位Maestro 是一个开源的 UI 与端到端测试框架你用人类可读的 YAML 编写测试流程它解释执行这些命令覆盖 Android、iOS 和 Web含 React Native、Flutter、混合应用三大平台跑在模拟器、真机或浏览器上均可。三个值得注意的特性特性说明跨平台同脚本同一份 flow 文件可在安卓、iOS、Web 上直接复用无需为每个平台重写定位逻辑智能等待引擎会自动等待目标元素就绪不需要手工插入 sleep从机制上减少点击没生效类偶发失败解释执行flow 是 YAML 文本而非编译产物改一行立刻能重跑调试迭代快相比 Appium、Espresso、XCTest、Selenium 这类各占一个生态的成熟工具Maestro 的定位是把写跨端 E2E 脚本这件事的门槛降到最低语法统一为几类命令动词学习成本以小时计。它建立在上述前者的实践经验之上官方 README 中明确列出了这一背景。五分钟搭好环境前置要求只有三项Java 17 或更高版本java -version确认macOS、Linux 或 WindowsWSL一个可用的模拟器、真机或浏览器安装命令只有一条bashcurl -fsSL https://get.maestro.mobile.dev | bash执行后确认maestro命令可用即可例如查看maestro --version输出的版本号。各平台的差异集中在安装渠道平台安装方式macOS / Linux上面的curl \| bash脚本Windows (WSL)在 WSL 内执行同一条脚本原生 Windows按官方文档的独立安装方式处理脚本不支持核心语法从拉起应用到断言校验按一个用例的生命周期看Maestro 的语法就四类命令。拉起应用与环境准备appId: org.wikipedia --- - launchApp: clearState: trueappId声明被测应用---之后是流程体。clearState: true会清掉应用既有状态再启动让每次执行从干净环境开始——这是避免上一条用例的登录态污染这一条最便宜的手段。Web 应用则用url代替appId仓库示例可参考 e2e/workspaces/web/simple.yaml。与界面元素交互- tapOn: First Name - inputText: John - tapOn: Last Name - inputText: Snow - tapOn: Save点击、输入都以屏幕上看得见的文本作为定位依据这比写id或 CSS 选择器直观也更抗 UI 重构。除tapOn、inputText外还有一组常用动词swipe/swipeDirection滑动、scrollUntilVisible滚动查找、back返回、pressKey模拟按键。条件分支与数据构造- if: visible: 验证码 then: - inputText: 123456 else: - tapOn: 跳过if/then/else让脚本能跟上应用的多分支走向而不是把一定走到哪个页面写死。配合launchApp: { clearState: true }固定起点再用分支消化不可控的弹层如隐私弹窗比在流程外做环境约定更稳。断言与结果校验- assertVisible: Products - assertNotVisible: Nothing typed yetassertVisible确认关键元素出现assertNotVisible确认不该出现的元素消失了两者配对使用能覆盖页面跳转成功这类完整语义。断言同样走智能等待元素没出现会等而不是立刻判死。一个完整用例的拆解以下两条用例测的是经典演示站点 saucedemo 的登录流程正向用例预期输入正确账号密码后进入商品列表页异常用例预期错误账号登录后停留在登录页并出现报错提示。仓库中正向脚本的完整版本见 e2e/workspaces/web/simple.yaml。正向流程url: https://www.saucedemo.com/ tags: [login, positive] --- - launchApp - tapOn: Username - inputText: standard_user - tapOn: Password - inputText: secret_sauce - tapOn: Login - assertVisible: Products - assertVisible: Sauce Labs Backpack异常流程url: https://www.saucedemo.com/ tags: [login, negative] --- - launchApp - tapOn: Username - inputText: locked_out_user - tapOn: Password - inputText: secret_sauce - tapOn: Login - assertVisible: E两条用例的关键断言都在最后一行正向看Products是否出现异常看锁号提示是否出现。前面所有操作都是铺垫断言行才是用例真正的验收标准——用例名和断言行对得上失败时看一眼输出就知道断在哪里。脚本跑不稳先查这三处元素找不到定位策略的优先级定位写法有优先级可读文本 →id→ 坐标类兜底。文本丢失或不可见时改用框架级id定位例如 e2e/workspaces/wikipedia/subflows/onboarding-android.yaml 中用org.wikipedia:id/fragment_onboarding_forward_button这类稳定资源 id。对于可能出现也可能不出现的元素如首次启动引导用optional: true让它找不到时不报错- tapOn: text: Non existent view optional: true断言偶发失败超时怎么定assertVisible支持显式timeout参数慢页面把默认等待拉长而不是加 sleep例如 e2e/workspaces/simple_web_view/webview.yaml 中给登录断言设了timeout: 90000应对 WebView 冷启动。判断标准先观察该步骤在慢设备上的实际耗时取 2 倍余量如果两次运行耗时波动大问题多半在上游步骤没断言住而不是这里该再加超时。- assertVisible: text: Login timeout: 90000环境残留状态清理与隔离用例间最常见的串扰是登录态、购物车这类持久状态。做法是在launchApp时清状态流程中途也可用独立的clearState命令复位再重新拉起应用验证已回到初始界面参考 e2e/workspaces/web/clear_state.yaml- launchApp: clearState: true # ...执行登录... - clearState - launchApp - assertNotVisible: ProductsassertNotVisible: Products反向确认清理真的生效了这一步别省。它适合什么、不适合什么Maestro 适合做端到端的 UI 层验证核心链路冒烟、发版前回归、跨平台一致性比对尤其适合团队里不全是自动化背景的成员补测试。它不适合做纯接口压测也不擅长高频性能采样——它每次执行都是真实拉起应用单次耗时在秒级以上用例数量上去后需要按设备矩阵或并行执行来分摊。UI 深层组件级测试如 Espresso 级别的视图状态验证仍建议留给各平台原生框架Maestro 承担跨端主线即可。结语回到开头那个场景同一套登录流程现在是一份 YAML 在三个平台上跑改文案只改一处。脚本跑通之前先把 README.md 里的示例 flow 跑一遍。【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考