使用 YAML 格式的自动化脚本
在大多数情况下,开发者编写自动化脚本只是为了执行一些简单流程,比如检查某些内容是否出现,或者验证某个关键用户路径是否可用。此时维护一个大型测试项目会显得毫无必要。
Midscene 提供了一种基于 .yaml 文件的自动化测试方法,这有助于你专注于编写流程,而不是测试框架。
这里有一个示例,通过阅读它的内容,你应该已经理解了它的工作原理。
web:
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 工作流,请查看 命令行工具,了解安装、.env 支持以及 midscene 命令的用法。
脚本文件结构
脚本文件使用 YAML 格式来描述自动化任务。它定义了要操作的目标(如网页或安卓应用)以及一系列要执行的步骤。
一个标准的 .yaml 脚本文件包含 web、android、ios 或 computer 部分配置环境,可选的 agent 部分配置 AI Agent 行为,以及一个 tasks 部分来定义自动化任务。
web:
url: https://www.bing.com
# tasks 部分定义了要执行的一系列步骤
tasks:
- name: 搜索天气
flow:
- ai: 搜索 "今日天气"
- sleep: 3000
- aiAssert: 结果显示天气信息
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 部分
web:
# 访问的 URL,必填。如果提供了 `serve` 参数,则提供相对路径
url: <url>
# 在本地路径下启动一个静态服务,可选
serve: <root-directory>
# 浏览器 UA,可选
userAgent: <ua>
# 浏览器视口宽度,可选,默认 1280
viewportWidth: <width>
# 浏览器视口高度,可选,默认 960
viewportHeight: <height>
# 浏览器设备像素比,可选,默认跟随系统
deviceScaleFactor: <scale>
# JSON 格式的浏览器 Cookie 文件路径,可选
cookie: <path-to-cookie-file>
# 等待网络空闲的策略,可选
waitForNetworkIdle:
# 等待超时时间,可选,默认 2000ms
timeout: <ms>
# 是否在等待超时后继续,可选,默认 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
forceSameTabNavigation: <boolean>
# 桥接模式,可选,默认 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,
# screenshotResizeScale, alwaysRefreshScreenInfo 等
# 完整配置项请参考 AndroidDevice 的构造函数文档
Android 平台特定动作
Android 平台提供了一些特定的动作,可以在 YAML 脚本的 flow 中使用:
runAdbShell - 执行 ADB Shell 命令
在 Android 设备上执行 ADB shell 命令。
android:
deviceId: 'test-device'
tasks:
- name: 清除应用数据
flow:
- runAdbShell: 'pm clear com.example.app'
- name: 获取电池信息
flow:
- runAdbShell: 'dumpsys battery'
常用 ADB Shell 命令:
pm clear <package> - 清除应用数据
dumpsys battery - 获取电池信息
dumpsys window - 获取窗口信息
settings get secure android_id - 获取设备 ID
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
ios 部分
ios:
# WebDriverAgent 端口,可选,默认 8100
wdaPort: <port>
# WebDriverAgent 主机地址,可选,默认 localhost
wdaHost: <host>
# 是否自动关闭键盘,可选,默认 false
autoDismissKeyboard: <boolean>
# 启动 URL 或应用包名,可选,默认使用设备当前页面
launch: <url-or-bundle-id>
# 输出 aiQuery/aiAssert 结果的 JSON 文件路径,可选
output: <path-to-output-file>
# 是否保存日志内容到 JSON 文件,可选,默认 `false`。如果为 true,保存到 `unstableLogContent.json` 文件中。如果为字符串,则保存到该字符串指定的路径中。日志内容的结构可能会在未来发生变化。
unstableLogContent: <boolean | path-to-unstable-log-file>
# 其他 IOSDevice 构造函数支持的所有选项
# 完整配置项请参考 IOSDevice 的构造函数文档
iOS 平台特定动作
iOS 平台提供了一些特定的动作,可以在 YAML 脚本的 flow 中使用:
runWdaRequest - 执行 WebDriverAgent API 请求
在 iOS 设备上直接执行 WebDriverAgent API 请求。
ios:
launch: 'com.apple.mobilesafari'
tasks:
- name: 通过 WDA 按下主屏幕按钮
flow:
- runWdaRequest:
method: POST
endpoint: /session/test/wda/pressButton
data:
name: home
- name: 获取设备信息
flow:
- runWdaRequest:
method: GET
endpoint: /wda/device/info