使用 YAML 格式的自动化脚本
在大多数情况下,开发者编写自动化脚本只是为了执行一些简单流程,比如检查某些内容是否出现,或者验证某个关键用户路径是否可用。此时维护一个大型测试项目会显得毫无必要。
Midscene 提供了一种基于 .yaml 文件的自动化测试方法,这有助于你专注于编写流程,而不是测试框架。
这里有一个示例,通过阅读它的内容,你应该已经理解了它的工作原理。
page :
url : https://www.bing.com
tasks :
- name : 搜索天气
flow :
- ai : 搜索 "今日天气"
- sleep : 3000
- name : 检查结果
flow :
- aiAssert : 结果中展示了天气信息
样例项目
你可以在这里找到使用 YAML 脚本做自动化的样例项目
配置 AI 模型服务
通过环境变量设置模型。选择模型时,请参考模型策略 。
export MIDSCENE_MODEL_BASE_URL = "https://替换为你的模型服务地址/v1"
export MIDSCENE_MODEL_API_KEY = "替换为你的 API Key"
export MIDSCENE_MODEL_NAME = "替换为你的模型名称"
export MIDSCENE_MODEL_FAMILY = "替换为你的模型系列"
全部配置项请参考模型配置 。
如果需要通过命令行执行 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>
# 在调用 aiAct 时发送给 AI 模型的背景知识,可选
aiActContext : <string>
# 兼容的旧字段(aiActionContext)仍可使用,但不推荐
# 缓存配置,可选
cache :
# 缓存策略,可选,可选值:'read-only' | 'read-write' | 'write-only'
strategy : <string>
# 缓存 ID,必填
id : <string>
Agent 配置说明
适用环境 :Web、iOS 和 Android 环境都支持 agent 配置
testId 优先级 :CLI 参数 > YAML agent.testId > 文件名
aiActContext :为 AI 模型提供背景知识,例如处理弹窗、业务介绍等常见场景。兼容旧字段(见注释),但不建议新脚本继续使用。
缓存配置 :详细用法请参考 缓存功能文档
使用示例
# agent 配置,适用于所有环境
agent :
testId : "checkout-test"
groupName : "E2E 测试套件"
groupDescription : "完整的购物流程测试"
generateReport : true
autoPrintReportMsg : false
reportFileName : "checkout-report"
replanningCycleLimit : 30
aiActContext : "如果出现弹窗,点击同意。如果出现登录页面,跳过它。"
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'
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