Maestro 移动 UI 自动化测试入门教程
Maestro 移动 UI 自动化测试入门教程本文带你从零开始掌握 Maestro —— 一款开源的跨平台移动 UI 自动化测试框架。涵盖安装配置、YAML 测试流编写、核心命令、选择器、高级用法及实战案例让你 10 分钟写出第一条自动化测试。一、Maestro 是什么Maestro 是一款开源的端到端移动 UI 自动化测试框架支持Android、iOS 和 Web应用包括 React Native、Flutter 和混合应用。它的核心理念是拥抱不稳定性通过人类可读的 YAML 语法和解释型执行引擎让测试编写变得简单高效。与传统自动化框架如 Appium、XCUITest相比Maestro 最大的优势在于极低的上手门槛—— 你不需要编写复杂的代码只需用 YAML 描述用户操作即可。核心特性特性说明跨平台一套 YAML 语法同时测试 Android、iOS 和 Web 应用人类可读的 YAML用launchApp、tapOn、assertVisible等命令表达交互内置抗抖动自动等待 UI 稳定无需手动写sleep()解释型执行无需编译修改即运行快速迭代智能元素定位默认使用 Accessibility Tree模拟真实用户视角JavaScript 集成在 YAML 中内嵌 JS 处理复杂逻辑、调用外部 API测试录制自动将执行过程录制成 MP4 视频Maestro Studio可视化测试构建器支持录制交互、检查元素为什么选择 Maestro学习曲线低5 分钟写出第一条测试无需编程经验维护成本低YAML 语法直观测试即文档稳定性高内置智能等待机制减少 flaky tests生态完善支持本地测试、CI/CD 集成、云端测试二、环境准备与安装2.1 前置条件安装 Maestro 前请确保系统已安装Java 17 或更高版本。验证 Java 版本java-version如果未安装 Java推荐使用 Temurin JDK 或 Oracle JDK 安装。确保JAVA_HOME环境变量指向 Java 17 的安装路径。2.2 安装 Maestro CLImacOS 安装方式一使用 curl 脚本安装curl-fsSLhttps://get.maestro.mobile.dev|bash方式二使用 Homebrew 安装brew tap mobile-dev-inc/tap brew trust--formulamobile-dev-inc/tap/maestro brewinstallmobile-dev-inc/tap/maestromacOS 用户还需安装最新版 Xcode 和 Xcode Command Line Tools用于 iOS 模拟器测试。Windows 安装前往 Maestro GitHub Releases 下载最新的maestro.zip解压到稳定目录如C:\maestro将 Maestro 的bin目录添加到系统 PATHsetx PATH%PATH%;C:\maestro\bin重启终端使配置生效Linux 安装curl-fsSLhttps://get.maestro.mobile.dev|bash安装完成后默认安装路径为$HOME/.maestro/bin。如果maestro命令不可用手动添加 PATHexportPATH$PATH:$HOME/.maestro/bin2.3 验证安装运行以下命令若显示帮助信息则安装成功maestro--help2.4 准备测试设备Maestro 需要一个正在运行的设备或模拟器来执行测试。Android 测试打开 Android Studio进入 Virtual Device Manager启动一个虚拟设备如 Pixel 8等待设备启动到主屏幕iOS 测试打开 Xcode启动 iOS 模拟器如 iPhone 15确保模拟器处于运行状态三、第一个测试10 分钟快速上手3.1 创建测试文件创建一个新目录并新建contacts.yaml文件appId:com.google.android.contacts----launchApp:clearState:true-tapOn:Allow-tapOn:Create contact-tapOn:First name-inputText:John-tapOn:Last name-inputText:Doe-tapOn:Company-inputText:Maestro-tapOn:1-inputText:111-111-1111-tapOn:Save-back3.2 运行测试确保模拟器正在运行然后执行maestrotestcontacts.yamlMaestro 会连接到模拟器按顺序执行每个步骤。终端会显示实时进度报告你可以在模拟器上看到自动化操作的过程。3.3 测试录像在 Flow 中加入录像命令执行后会在当前目录生成recording.mp4appId:com.google.android.contacts----launchApp:clearState:true-startRecording:recording# 开始录像-tapOn:Create contact-tapOn:First name-inputText:John-tapOn:Last name-inputText:Doe-tapOn:Save-stopRecording# 停止录像生成 recording.mp4四、Flow 结构详解Maestro 的测试文件称为Flow使用 YAML 格式编写。一个标准的 Flow 由两部分组成用---分隔# 配置区 appId:com.example.app# 必填被测应用的包名/Bundle IDname:登录测试# 选填Flow 的自定义名称tags:# 选填标签用于筛选测试-smoke-test-loginenv:# 选填环境变量USERNAME:userexample.comPASSWORD:123456---# 命令区 -launchApp# 启动应用-tapOn:Username# 点击用户名输入框-inputText:${USERNAME}# 输入环境变量-tapOn:Password-inputText:${PASSWORD}-tapOn:Login# 点击登录-assertVisible:Welcome# 断言欢迎信息可见配置区字段说明字段必填说明appId是被测应用的包名Android或 Bundle IDiOSname否Flow 的显示名称会出现在测试报告中tags否标签列表配合--include-tags/--exclude-tags使用env否环境变量映射在命令区通过${变量名}引用五、核心命令速查5.1 常用命令一览命令说明示例launchApp启动应用- launchAppkillApp强制关闭应用- killApptapOn点击元素- tapOn: 登录doubleTapOn双击元素- doubleTapOn: 头像longPressOn长按元素- longPressOn: 消息inputText输入文本- inputText: helloeraseText删除文本- eraseText: 10swipe滑动操作- swipe: { direction: UP }scroll滚动- scrollscrollUntilVisible滚动直到元素可见- scrollUntilVisible: { element: 加载更多 }back返回Android- backpressKey按键- pressKey: EnterhideKeyboard隐藏键盘- hideKeyboardassertVisible断言元素可见- assertVisible: 欢迎assertNotVisible断言元素不可见- assertNotVisible: 错误takeScreenshot截图- takeScreenshot: resultwaitForAnimationToEnd等待动画结束- waitForAnimationToEndopenLink打开链接- openLink: https://example.com5.2 命令详细用法launchApp —— 启动应用# 基本启动-launchApp# 启动并清除应用状态重新开始-launchApp:clearState:true# 启动并清除权限设置-launchApp:clearState:trueclearKeychain:truetapOn —— 点击元素# 通过文本点击-tapOn:登录# 通过 ID 点击-tapOn:id:login_button# 通过文本点击指定第几个匹配项-tapOn:text:删除index:2# 多条件组合定位-tapOn:text:提交enabled:truebelow:个人信息inputText —— 输入文本# 直接输入-inputText:hello world# 输入环境变量-inputText:${USERNAME}# 输入数字-inputText:13800138000swipe —— 滑动操作# 方向滑动-swipe:direction:UP# 指定百分比区域滑动-swipe:start:50%,80%end:50%,20%# 元素间滑动-swipe:from:id:item_1to:id:item_5assertVisible —— 断言元素可见# 简单断言-assertVisible:登录成功# 带超时的断言-extendedWaitUntil:visible:欢迎页面timeout:10000# 可选断言不通过也不会失败-assertVisible:text:弹窗广告optional:true六、选择器Selectors选择器是 Maestro 定位 UI 元素的核心机制。Maestro 默认使用Accessibility Tree无障碍树从用户视角来识别界面元素。6.1 选择器类型文本选择器最常用# 简写形式-tapOn:Login# 完整形式-tapOn:text:Logintext默认支持正则表达式可用于匹配动态文本。ID 选择器最稳定-tapOn:id:submit_buttonID 是 Accessibility Identifier不受语言切换影响适合多语言应用。索引选择器当有多个匹配元素时用index指定第几个从 0 开始-tapOn:text:删除index:1# 点击第 2 个删除按钮坐标选择器-tapOn:point:50%,50%6.2 关系选择器当元素本身没有唯一标识时可以用相对位置来定位# 点击密码下方的元素-tapOn:below:密码# 点击标题上方的元素-tapOn:above:标题# 点击某个父容器内的元素-tapOn:text:删除childOf:id:list_item6.3 状态选择器# 只在元素可点击时操作-tapOn:text:提交enabled:true# 检查勾选状态-assertVisible:text:记住密码checked:true# 检查焦点状态-assertVisible:text:搜索框focused:true6.4 选择器最佳实践场景推荐策略有固定文本的按钮/标签使用text选择器直观且自文档化图标、图片等无文字元素使用idAccessibility Identifier跨语言稳定动态文本或无唯一标识用关系选择器above/below锚定位置文本部分变化使用正则text: 订单.*成功等待异步加载完成在选择器中加enabled: true自动等待可交互状态七、高级用法7.1 子 FlowSubflows将通用操作抽取为子 Flow实现复用。例如创建login.yaml# login.yamlappId:com.example.app----tapOn:用户名-inputText:${USERNAME}-tapOn:密码-inputText:${PASSWORD}-tapOn:登录-assertVisible:首页在其他 Flow 中调用# main_flow.yamlappId:com.example.app----launchApp-runFlow:login.yaml# 调用子 Flow-tapOn:我的订单-assertVisible:订单列表7.2 条件执行使用runFlow配合when条件来控制执行逻辑-runFlow:when:visible:升级提示commands:-tapOn:稍后7.3 循环-repeat:times:3commands:-tapOn:下一个-assertVisible:图片7.4 JavaScript 集成在 YAML 中直接执行 JavaScript处理复杂逻辑appId:com.example.app----evalScript:${output.date new Date().toISOString()}-tapOn:日期-inputText:${output.date}发起 HTTP 请求-evalScript:${output.response http.get(https://api.example.com/test-data)}-inputText:${output.response.body.id}7.5 重试机制对不稳定操作使用retry-retry:maxRetries:3commands:-tapOn:刷新-assertVisible:数据加载完成八、CLI 命令参考8.1 常用命令命令说明maestro test flow.yaml执行测试maestro test -c flow.yaml连续模式文件变更自动重跑maestro test --include-tagssmoke .只运行带smoke标签的 Flowmaestro test --formatJUNIT .生成 JUnit 格式报告maestro start-device --platformandroid启动 Android 模拟器maestro list-devices列出本地可用设备maestro record flow.yaml录制测试执行过程maestro download-samples下载官方示例maestro hierarchy打印当前应用的视图层级8.2 test 命令常用选项选项说明-c, --continuous连续模式监控文件变化自动重跑-e, --envKEYVALUE设置环境变量--include-tagstags只运行包含指定标签的 Flow--exclude-tagstags排除包含指定标签的 Flow--formatFORMAT报告格式JUNIT、HTML、NOOP--outputPATH指定报告输出路径--deviceUDID指定运行的设备 ID--platformPLATFORM指定平台android、ios、web-s, --shardsCOUNT并行分片执行8.3 实用示例# 运行单个 Flowmaestrotestlogin.yaml# 运行目录下所有 Flowmaestrotest./flows/# 只运行冒烟测试maestrotest--include-tagssmoke ./flows/# 连续开发模式maestrotest-clogin.yaml# 生成 HTML 报告maestrotest--formatHTML--outputreport.html ./flows/# 传入环境变量maestrotest-eUSERNAMEtesttest.com-ePASSWORD123456login.yaml# 在指定设备上运行maestro--deviceemulator-5554testlogin.yaml# 启动设备maestro start-device--platformandroid --device-osandroid-34九、实战案例登录功能测试下面通过一个完整的登录测试场景综合运用前面学到的知识。9.1 测试场景启动应用处理首次启动的权限弹窗输入用户名和密码点击登录验证登录成功退出登录9.2 测试文件# login_test.yamlappId:com.example.myappname:登录功能测试tags:-smoke-loginenv:USERNAME:testuserexample.comPASSWORD:Test1234---# 启动应用清除状态-launchApp:clearState:true# 处理可能出现的权限弹窗-runFlow:when:visible:允许commands:-tapOn:允许# 进入登录页面-tapOn:登录# 输入用户名-tapOn:id:username_input-inputText:${USERNAME}# 输入密码-tapOn:id:password_input-inputText:${PASSWORD}# 点击登录按钮-tapOn:text:登录index:1enabled:true# 验证登录成功-assertVisible:首页-takeScreenshot:login_success# 退出登录-tapOn:我的-scroll-tapOn:退出登录-tapOn:确认-assertVisible:登录9.3 运行测试# 基本运行maestrotestlogin_test.yaml# 生成 JUnit 报告用于 CI/CDmaestrotest--formatJUNIT--outputreport.xml login_test.yaml# 连续模式开发调试maestrotest-clogin_test.yaml十、Maestro Studio 可视化工具Maestro Studio 是一个轻量级的可视化测试构建工具帮助你快速编写测试。启动 Maestro Studiomaestro studio核心功能功能说明视觉流构建器点击界面元素自动生成对应命令元素检查器查看元素的 ID、文本、层级等属性实时预览在模拟器上操作实时生成 YAMLAI 辅助用自然语言描述操作AI 生成命令对于初学者推荐先用 Maestro Studio 录制操作生成基础 Flow再手动优化 YAML。十一、测试优化与最佳实践11.1 减少测试 flaky善用enabled: true在点击按钮前确保它可交互使用optional: true对可能出现的弹窗做可选断言避免硬等待用assertVisible代替sleep合理使用retry对网络相关操作加重试# 处理可能出现的弹窗-runFlow:when:visible:更新提示commands:-tapOn:稍后提醒# 等待元素可点击再操作-tapOn:text:提交enabled:true11.2 测试组织结构推荐的目录结构project/ ├── config.yaml # 全局配置 ├── flows/ │ ├── login/ # 按功能模块分组 │ │ ├── login_success.yaml │ │ └── login_failure.yaml │ ├── search/ │ │ └── search_flow.yaml │ └── checkout/ │ └── checkout_flow.yaml ├── subflows/ # 可复用的子 Flow │ ├── login.yaml │ └── navigate_home.yaml └── reports/ # 测试报告输出11.3 使用 config.yaml 统一配置在项目根目录创建config.yaml设置全局行为# config.yamlappId:com.example.myapp# 测试执行配置flowOrder:-subflows/login.yaml-flows/# 全局环境变量env:API_BASE_URL:https://test-api.example.com运行时指定配置文件maestrotest--configconfig.yaml ./flows/11.4 CI/CD 集成在 GitHub Actions 中集成 Maestro# .github/workflows/test.ymlname:Maestro Testson:[push,pull_request]jobs:test:runs-on:macOS-lateststeps:-uses:actions/checkoutv4-uses:reactivecircus/android-emulator-runnerv2with:api-level:34script:|curl -fsSL https://get.maestro.mobile.dev | bash export PATH$PATH:$HOME/.maestro/bin maestro test --formatJUNIT --outputreport.xml ./flows/-uses:actions/upload-artifactv4with:name:test-reportpath:report.xml十二、常见问题Q1元素找不到怎么办使用maestro hierarchy命令查看当前界面的视图层级用 Maestro Studio 的元素检查器查看元素属性尝试使用不同的选择器text、id、关系选择器检查元素是否在 WebView 或 Flutter 渲染层中Q2测试运行超时设置启动超时环境变量exportMAESTRO_DRIVER_STARTUP_TIMEOUT180000Q3如何测试 Flutter 应用Maestro 原生支持 Flutter。确保 Flutter 应用启用了语义信息Semantics然后在 Flow 中正常使用选择器即可。Q4如何处理系统弹窗使用runFlow条件执行来处理-runFlow:when:visible:Allowcommands:-tapOn:AllowQ5如何在多台设备上并行测试使用--shards选项maestrotest--shards3./flows/总结Maestro 以其简洁的 YAML 语法、内置的抗抖动机制和跨平台支持大幅降低了移动 UI 自动化测试的门槛。本文涵盖了从安装到实战的完整流程安装配置一行命令完成安装Java 17 即可运行快速上手YAML 描述操作maestro test一键执行核心命令launchApp、tapOn、inputText、assertVisible等选择器文本、ID、关系、状态等多维定位策略高级用法子 Flow 复用、条件执行、循环、JS 集成工程化标签筛选、报告生成、CI/CD 集成对于想要快速建立移动 UI 自动化测试体系的团队Maestro 是一个非常值得尝试的选择。建议从简单的冒烟测试开始逐步扩展到完整的回归测试套件。官方资源官方文档https://docs.maestro.devGitHub 仓库https://github.com/mobile-dev-inc/Maestro社区 Slackhttps://slack.maestro.dev

相关新闻

智能降维在量化交易中的应用:解决高维数据过拟合问题

智能降维在量化交易中的应用:解决高维数据过拟合问题

在金融科技和人工智能的交汇点上,量化投资正经历一场深刻的变革。很多人以为量化交易就是写几个策略、跑回测、然后自动化执行,但真正的挑战往往隐藏在数据维度爆炸和模型过拟合的陷阱里。Alex Wang作为业内资深专家,近期提出的“智能降维”理…

2026/7/23 2:37:15 阅读更多 →
TI EMAC/MDIO中断管理实战:从寄存器到驱动避坑指南

TI EMAC/MDIO中断管理实战:从寄存器到驱动避坑指南

1. 从寄存器手册到实战:理解EMAC/MDIO中断管理的核心逻辑搞嵌入式网络驱动,尤其是像TI这种大厂的复杂外设,最头疼的往往不是写数据收发流程,而是把那一大本寄存器手册里的中断机制给整明白。手册里每个比特位都给你列得清清楚楚&a…

2026/7/23 2:37:15 阅读更多 →
不会写代码的人,终于迎来了属于自己的开发时代

不会写代码的人,终于迎来了属于自己的开发时代

每次参加各种科技大会,我都会留意会场里的一个特殊区域:那里没有炫目的舞台,没有重量级嘉宾,也没有热闹的抽奖,却总能吸引很多人的目光。这就是黑客松(Hackathon)现场。这些年,无论是…

2026/7/23 2:36:15 阅读更多 →

最新新闻

CDN性能优化与缓存策略实战指南

CDN性能优化与缓存策略实战指南

1. CDN性能问题深度解析与实战应对CDN作为现代互联网架构的核心组件,其性能直接影响着全球用户的访问体验。在实际运维中,我们常遇到以下几种典型性能问题:全球覆盖不均问题:某跨国电商平台曾反馈,其东南亚用户访问速度…

2026/7/23 3:12:29 阅读更多 →
X 平台设备登录告警类钓鱼攻击链路与加密货币衍生诈骗防御技术研究

X 平台设备登录告警类钓鱼攻击链路与加密货币衍生诈骗防御技术研究

摘要 以英国《卫报》2026 年 7 月曝光的 X 平台仿新设备登录通知钓鱼诈骗事件为核心样本,完整拆解该类高仿真社交网络钓鱼攻击的传播链路、页面伪造技术、账号劫持后的加密货币黑产变现流程。现有防御手段多单一依赖域名黑名单、基础关键词过滤,难以应对…

2026/7/23 3:12:29 阅读更多 →
LCGA注意力机制在YOLO26目标检测中的创新实践

LCGA注意力机制在YOLO26目标检测中的创新实践

1. 项目概述:LCGA注意力机制在YOLO26中的创新应用这个改进方案的核心在于将LCGA(局部曲率引导注意力)机制引入YOLO26目标检测框架。LCGA是一种基于图像局部几何特性的新型注意力机制,它通过计算特征图的曲率信息来动态调整注意力权…

2026/7/23 3:12:29 阅读更多 →
Fable 5 实战指南:可视化业务逻辑编排与自动化流程处理

Fable 5 实战指南:可视化业务逻辑编排与自动化流程处理

1. 先搞清楚 Fable 5 到底在解决什么“疑难问题”看到“疑难问题处理”这个说法,很多人的第一反应可能是代码报错、环境配置、性能调优这类技术问题。但 Fable 5 的定位更偏向于复杂业务逻辑的可视化编排和自动化流程处理,尤其是在那些规则多变、依赖外部…

2026/7/23 3:12:29 阅读更多 →
失窃账号驱动下校园 Duo 多因素钓鱼攻击机理与全域闭环防御研究

失窃账号驱动下校园 Duo 多因素钓鱼攻击机理与全域闭环防御研究

摘要 高校统一身份认证体系普遍部署 Duo 多因素认证(MFA)以抵御账号窃取风险,但攻击者逐步演化出失窃校内账号批量分发钓鱼邮件、仿冒 IT 官方话术诱导提交 BlazerID 密码、索要 Duo 动态验证码、滥用 Google 表单构建虚假核验页面的新型复合…

2026/7/23 3:12:29 阅读更多 →
如果关注瑞德克斯安全核验,靠谱吗?

如果关注瑞德克斯安全核验,靠谱吗?

比较实际地说,看瑞德克斯时,很多人会先关心账户安全、资料办理路径和规则边界是否讲得细。围绕资料流程观察,平台把重要信息放在更容易确认的位置,减少了使用中的猜测。这些细节拼在一起,才构成瑞德克斯比较自然、也比…

2026/7/23 3:11:29 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻