使用 YAML 格式的自动化脚本
兼容保留,建议迁移到 Midscene Test
“旧版 YAML”,特指由 @midscene/cli 提供的 YAML 自动化协议:工作流顶层使用 tasks,每个 task 使用 flow,平台和 Agent 等运行配置通常也写在 YAML 中,并通过 midscene 命令或包含 files、setup、concurrent 等字段的 YAML 批配置运行。
旧链路已进入维护状态:继续保证现有项目兼容,并处理必要的问题,但不再新增语法、能力、配置项或 CLI 参数。已有用例、批配置、目录结构和 midscene 命令可以保持不变;升级后会通过共享执行内核运行,并生成新的 Test 报告页面。新项目、新增用例和后续能力建设推荐直接使用 Midscene Test。
旧文件和 YAML 批配置使用 midscene,原生 cases/steps 文件和 TypeScript 项目配置使用 midscene-test。两种格式可以放在同一个仓库的不同目录中,但不能在同一个文件或同一次命令中混用。先阅读 Midscene Test 概览,再按照迁移到 Midscene Test转换字段并切换命令。
在大多数情况下,开发者编写自动化脚本只是为了执行一些简单流程,比如检查某些内容是否出现,或者验证某个关键用户路径是否可用。此时维护一个大型测试项目会显得毫无必要。
Midscene 提供了一种基于 .yaml 文件的自动化测试方法,这有助于你专注于编写流程,而不是测试框架。
这里有一个示例,通过阅读它的内容,你应该已经理解了它的工作原理。
page:
url: https://www.bing.com
tasks:
- name: 搜索天气
flow:
- ai: 搜索 "今日天气"
- sleep: 3000
- name: 检查结果
flow:
- aiAssert: 结果中展示了天气信息
样例项目
你可以在这里找到使用 YAML 脚本做自动化的样例项目
配置 AI 模型服务
下面以豆包 Seed 2.1 Turbo 为例:
export MIDSCENE_MODEL_BASE_URL="https://ark.cn-beijing.volces.com/api/v3"
export MIDSCENE_MODEL_API_KEY="your-api-key"
export MIDSCENE_MODEL_NAME="doubao-seed-2-1-turbo-260628"
export MIDSCENE_MODEL_FAMILY="doubao-seed"
将 your-api-key 替换为你的 API Key。
如需使用千问(Qwen)、GLM、Gemini 或 GPT-5 等其他模型,请参考使用模型 API Key。
全部配置项请参考模型配置。
如果需要通过命令行执行 YAML 工作流,请查看 YAML 脚本运行器,了解安装、.env 支持以及 midscene 命令的用法。
脚本文件结构
脚本文件使用 YAML 格式来描述自动化任务。它定义了要操作的目标(如网页或安卓应用)以及一系列要执行的步骤。
一个标准的 .yaml 脚本文件包含 page、browser、web、android、ios、harmony 或 computer 部分配置环境,可选的 agent 部分配置 AI Agent 行为,以及一个 tasks 部分来定义自动化任务。
page:
url: https://www.bing.com
# tasks 部分定义了要执行的一系列步骤
tasks:
- name: 搜索天气
flow:
- ai: 搜索 "今日天气"
- sleep: 3000
- aiAssert: 结果显示天气信息
使用 page: 表示 page-level Agent。使用 browser: 表示一个 Agent 管理 browser 和它的 active page。web: 仍作为兼容入口保留;web.mode: browser 会映射到 BrowserAgent,普通 web: 会映射到 PageAgent。不要在同一份脚本里同时使用 page、browser、web 或已废弃的 target。
agent 部分
agent 部分用于配置 AI Agent 的行为和测试报告相关选项。所有字段都是可选的。
# AI agent 配置
agent:
# 测试标识符,用于报告和缓存识别,可选
testId: <string>
# 报告组名称,可选
groupName: <string>
# 报告组描述,可选
groupDescription: <string>
# 是否生成测试报告,可选,默认 true
generateReport: <boolean>
# 是否自动打印报告消息,可选,默认 true
autoPrintReportMsg: <boolean>
# 自定义报告文件名,可选
reportFileName: <string>
# AI 最大重规划循环次数,可选,默认 20(UI-TARS 模型为 40)
replanningCycleLimit: <number>
# 提供给 AI 的补充信息,可选;default 是共享的缺省回退值
aiContexts:
default: <string>
aiAct: <string>
aiQuery: <string>
# 缓存配置,可选
cache:
# 缓存策略,可选,可选值:'read-only' | 'read-write' | 'write-only'
strategy: <string>
# 缓存 ID,必填
id: <string>
Agent 配置说明
- 适用环境:Web、iOS 和 Android 环境都支持
agent 配置
- testId 优先级:CLI 参数 > YAML agent.testId > 文件名
- aiContexts:提供给 AI 的补充信息,例如业务事实、规则、约束或输出要求。如果配置了
default,仅当本次调用和对应 API 都没有自己的 context 时才使用它。单次调用的 context 覆盖 API 级值,API 级值覆盖 default,这些值不会自动合并;空字符串会显式清空继承的用户 context。关于上下文知识的编写和传入方式,参见为 GUI Agent 补充应用知识。
- aiActContext / aiActionContext:
aiContexts.aiAct 的已废弃兼容字段,均仍受支持。解析规则为 aiContexts.aiAct ?? aiActContext ?? aiActionContext;空字符串也会覆盖低优先级的兼容字段。新 YAML 脚本请使用 aiContexts.aiAct。
- 缓存配置:详细用法请参考 缓存功能文档
使用示例
# agent 配置,适用于所有环境
agent:
testId: "checkout-test"
groupName: "E2E 测试套件"
groupDescription: "完整的购物流程测试"
generateReport: true
autoPrintReportMsg: false
reportFileName: "checkout-report"
replanningCycleLimit: 30
aiContexts:
default: "页面中的价格单位是美元。"
aiAct: "如果出现弹窗,点击同意。如果出现登录页面,跳过它。"
cache:
id: "checkout-cache"
strategy: "read-write"
# iOS 环境配置
ios:
launch: https://www.bing.com
wdaPort: 8100
# 或 Android 环境配置
android:
deviceId: s4ey59
launch: https://www.bing.com
tasks:
- name: 搜索天气
flow:
- ai: 搜索 "今日天气"
- aiAssert: 结果显示天气信息
Web target 部分
推荐的 page-level target:
page:
url: https://example.com
推荐的 browser-level target:
browser:
url: https://example.com
autoFollowNewPage: true
兼容写法:
web:
mode: browser
url: https://example.com
autoFollowNewPage: true
共享配置:
page:
# 访问的 URL,必填。如果提供了 `serve` 参数,则提供相对路径
url: <url>
# 在本地路径下启动一个静态服务,可选
serve: <root-directory>
# 浏览器 UA,可选
userAgent: <ua>
# 浏览器视口宽度,可选,默认 1440
viewportWidth: <width>
# 浏览器视口高度,可选,默认 800
viewportHeight: <height>
# 浏览器设备像素比,可选,默认跟随系统
deviceScaleFactor: <scale>
# JSON 格式的浏览器 Cookie 文件路径,可选
cookie: <path-to-cookie-file>
# Chrome 下载目录(仅 Puppeteer 模式),可选
# 相对路径会基于当前工作目录解析
# bridgeMode 不支持该选项
downloadPath: <path-to-download-directory>
# 随每个请求发送的额外 HTTP 请求头(仅 Puppeteer 模式),可选
# 适用于服务器会校验自定义请求头的场景
# 值必须是字符串;像 true、false、纯数字这 类会被 YAML 解析为非字符串的值需加引号,如 "true"
extraHTTPHeaders:
X-Custom-Token: my-token
Accept-Language: en-US
# Puppeteer 模式下等待网络空闲的策略,可选
# `timeout` 会作用于初始打开 YAML 中的 `web.url`,以及后续 `aiTap`、`aiInput` 等操作后的等待
# `continueOnNetworkIdleError` 只作用于初始打开 YAML 中的 `web.url`
waitForNetworkIdle:
# 每次网络空闲等待的超时时间,可选,默认 2000ms
timeout: <ms>
# 初始打开 YAML 中的 `web.url` 时,如果网络空闲等待超时,是否继续执行,可选,默认 true
# 后续脚本执行中 的等待即使超时也总是继续执行
continueOnNetworkIdleError: <boolean>
# 输出 aiQuery/aiAssert 结果的 JSON 文件路径,可选
output: <path-to-output-file>
# 是否保存日志内容到 JSON 文件,可选,默认 `false`。如果为 true,保存到 `unstableLogContent.json` 文件中。如果为字符串,则保存到该字符串指定的路径中。日志内容的结构可能会在未来发生变化。
unstableLogContent: <boolean | path-to-unstable-log-file>
# 是否限制页面在当前 tab 打开,可选,默认 true
# 仅 page mode 可用,不要与 `browser:` 或 `web.mode: browser` 同时使用
forceSameTabNavigation: <boolean>
# BrowserAgent 是否自动继续 在新打开的页面中执行,可选,默认 false
# 仅 browser mode 可用。请使用 `browser:` 或 `web.mode: browser`
autoFollowNewPage: <boolean>
# CDP 连接端点,可选。设置后通过 CDP 连接到已有浏览器实例,而非启动新浏览器。
# 与 bridgeMode 互斥,不可同时使用。
cdpEndpoint: ws://localhost:9222/devtools/browser
# 桥接模式,可选,默认 false,可以为 'newTabWithUrl' 或 'currentTab'。更多详情请参阅后文
bridgeMode: false | 'newTabWithUrl' | 'currentTab'
# 是否在桥接断开时关闭新创建的标签页,可选,默认 false
closeNewTabsAfterDisconnect: <boolean>
# 是否忽略 HTTPS 证书错误,可选,默认 false
acceptInsecureCerts: <boolean>
# 自定义 Chrome 启动参数(仅 Puppeteer 模式,不支持桥接模式),可选
# 用于自定义 Chrome 浏览器行为,例如禁用第三方 Cookie 阻止
# ⚠️ 安全警告:某些参数(如 --no-sandbox、--disable-web-security)可能降低浏览器安全性
# 仅在受控的测试环境中使用
chromeArgs:
- '--disable-features=ThirdPartyCookiePhaseout'
- '--disable-features=SameSiteByDefaultCookies'
- '--window-size=1920,1080'
Chrome Bridge
先完成 Chrome Bridge 环境配置。在 web 中设置 bridgeMode:
web:
url: https://example.com
bridgeMode: newTabWithUrl
closeNewTabsAfterDisconnect: true
tasks:
- name: Check the page
flow:
- aiAssert: The page shows Example Domain
使用 YAML 脚本运行器运行,首次连接时在插件中确认授权。closeNewTabsAfterDisconnect 默认 false;设为 true 时清理桥接创建的新标签页,不关闭连接前已有的标签页。
Bridge 模式与 cdpEndpoint、web.mode: browser 互斥。它复用桌面浏览器配置,以下字段会被忽略:
userAgent
viewportWidth / viewportHeight
deviceScaleFactor
waitForNetworkIdle
cookie
extraHTTPHeaders
downloadPath
chromeArgs
android 部分
android:
# 设备 ID,可选,默认使用第一个连接的设备
deviceId: <device-id>
# 启动 URL,可选,默认使用设备当前页面
launch: <url>
# 输出 aiQuery/aiAssert 结果的 JSON 文件路径,可选
output: <path-to-output-file>
# 其他 AndroidDevice 构造函数支持的所有选项
# 例如:androidAdbPath, remoteAdbHost, remoteAdbPort,
# imeStrategy, displayId, autoDismissKeyboard, keyboardDismissStrategy,
# keyboardTypeDelay, minScreenshotBufferSize, alwaysRefreshScreenInfo 等
# 完整配置项请参考 AndroidDevice 的构造函数文档
Android 平台特定动作
Android 平台提供了一些特定的动作,可以在 YAML 脚本的 flow 中使用:
runAdbShell - 执行 ADB Shell 命令
在 Android 设备上执行 ADB shell 命令。传入的内容只需要包含 shell 命令本身,不要包含 adb shell 前缀。如需设置命令超时,请将 timeout 作为 runAdbShell 的同级字段。
android:
deviceId: 'test-device'
tasks:
- name: 清除应用数据
flow:
- runAdbShell: 'pm clear com.example.app'
- name: 获取电池信息
flow:
- runAdbShell: 'dumpsys battery'
- name: 点击屏幕坐标
flow:
- runAdbShell: 'input tap 100 200'
- name: 执行带超时的命令
flow:
- runAdbShell: 'dumpsys activity services'
timeout: 60000
常用 ADB Shell 命令:
pm clear <package> - 清除应用数据
dumpsys battery - 获取电池信息
dumpsys window - 获取窗口信息
settings get secure android_id - 获取设备 ID
input tap <x> <y> - 点击屏幕坐标
input keyevent <keycode> - 发送按键事件
launch - 启动应用或 URL
启动 Android 应用或打开 URL。
android:
deviceId: 'test-device'
tasks:
- name: 启动设置应用
flow:
- launch: com.android.settings
- name: 打开网页
flow:
- launch: https://www.example.com