AI视觉驱动自动化测试之Midscene教程
传统的UI自动化测试,通常分为元素定位、图像识别两大方向,脚本里需要去编写、维护大量的元素定位信息、图片信息。
而随着AI时代的到来,在研发们已经抛弃古法编程,全员Vibe Coding的情况下,如果测试人员依然需要手搓代码脚本,进行传统的自动化测试, 就如同在蒸汽机时代,还依然在使用马车来驱动!
AI时代理想中的UI自动化,应该是像和AI对话一样,不用写任何代码,我们只输出自然语言的描述。
比如脚本里面只需要自然语言描述:打开百度首页,输入关键字"AI测试",执行搜索。然后AI就自动去执行相关的操作,并生成测试报告。
而字节开源的Midscene.js,就是一款能通过纯自然语言交互,来实现AI大模型驱动自动化测试的工具,并且Web端、移动端、桌面端都支持,能轻松驾驭端到端全流程测试。
一个常见的电商主流程测试示例:在移动端APP完成下单-》在Web端做订单数据流转-》回到移动端APP查看订单状态变化:
- 如果使用传统的自动化测试,通常一个端就需要维护一套自动化测试框架,需要编写大量的自动化脚本代码。
- 而如果使用Midscene来编写,只需要一套自动化测试框架,通过自然语言的步骤描述,就能完成整个端到端主流程的测试。
一、什么是Midscene
Midscene(又称 Midscene.js)是字节跳动Web Infra团队开源的、纯视觉驱动的AI UI自动化工具,核心是用自然语言操控界面,不靠 XPath/CSS 选择器,跨 Web / 移动端 / 桌面全平台。
传统 UI 自动化(如 Playwright、Appium):
- 依赖 DOM 结构 / 选择器(XPath、CSS)
- 页面微调就导致脚本失效,维护成本高
- 非技术人员难上手
- Canvas、游戏画面、桌面应用难以自动化
Midscene:
- 纯视觉,不依赖 DOM:只靠图像+ 视觉模型理解界面
- 自然语言驱动:一句话完成点击、输入、验证
- 界面变化不崩:元素位置 / 样式微调不影响脚本
- 全平台统一:Web、Android、iOS、Windows/macOS/Linux 桌面应用都支持
优缺点
- 优点:低代码 / 无代码、跨平台、抗界面变更、易上手
- 缺点:依赖图像与大模型、执行速度略慢、有一定模型调用成本
二、Web AI自动化测试
2.1 安装Midscene Chrome插件
通过使用Midscene.js Chrome插件,你可以快速在任意网页上体验Midscene的主要功能,无需编写任何代码。
如果你可以直接访问Chrome扩展商店,那么可以直接安装Midscene扩展:
https://chromewebstore.google.com/detail/midscenejs/gbldofcpkknbggpkmbdaefngejllnief

如果访问不了,那么国内网络可以百度搜索:midscene chrome插件下载,下载crx文件,然后通过chrome扩展程序安装:

安装好之后,打开插件,浏览器右侧会有midscene.js的Playground界面出来:

点击Playground的右上角齿轮设置按钮,粘贴你的 API Key 配置,配置LLM:
MIDSCENE_MODEL_BASE_URL="https://ark.cn-beijing.volces.com/api/coding/v3"
MIDSCENE_MODEL_API_KEY="your api key"
MIDSCENE_MODEL_NAME="Doubao-Seed-2.0-pro"
MIDSCENE_MODEL_FAMILY="doubao-seed"
我上面用的是字节火山方舟的大模型,如果你用的是其他的大模型,那么不同模型如何配置,可以参看官网文档,有详细的说明:https://midscenejs.com/zh/model-common-config.html
以上,配置就完成了,主要就是:下载插件+配置LLM。
2.2 Chrome插件自动化测试
接下来,就可以直接在插件聊天框里面,自然语言描述你要测试的内容,来测试AI自动化了。
比如你先打开百度首页,然后打开Midscene Chrome插件,插件对话框里输入:
搜索框输入:AI测试,点击“百度一下”按钮执行搜索
然后发送,就会看到Midscene会自动开始调用大模型,解析自然语言的测试内容,自动操控当前的浏览器tab页,执行测试,效果如下图:

执行完最后还会看到有一个执行过程的录像回放,可以快速查看整个执行的过程,非常方便。
2.3 如何脚本运行自动化测试
使用Chrome插件完成Playground测试,更多的是用于一次性的测试调试使用。如果想要将整个测试场景可复用,就创建对应的JavaScript脚本,以后每次运行脚本来达到可重复测试的目的。
下面我们以Windows电脑为例,选用集成到Playwright的方式,一步步来完成脚本文件的创建、运行:
2.3.1 安装依赖
我们可以在电脑D盘下新建一个目录:midscript,打开Windows的cmd窗口,到这个目录下,使用以下命令安装依赖:
npm install @midscene/web playwright @playwright/test tsx --save-dev
npm是Node.js自带的包管理工具,如果你发现上面的命令不可用,需要先在你的电脑上安装Node.js,可以去中文官网安装:https://nodejs.org/zh-cn/

依赖安装完毕后,再分别使用下面的命令,安装Chrome浏览器驱动:
# 使用淘宝镜像,避免国内网络下载超时
set PLAYWRIGHT_DOWNLOAD_HOST=https://npmmirror.com/mirrors/playwright
# 安装Chrome浏览器驱动
npx playwright install chromium
2.3.2 创建脚本文件
依赖和驱动安装完毕后,下一步是在midscript目录下,创建.env文件,作为大模型调用的配置文件,文件里面填写大模型的配置项,比如:
MIDSCENE_MODEL_BASE_URL="https://ark.cn-beijing.volces.com/api/v3"
MIDSCENE_MODEL_API_KEY="your api key"
MIDSCENE_MODEL_NAME="Doubao-Seed-2.0-pro"
MIDSCENE_MODEL_FAMILY="doubao-seed"
接下来就是写脚本文件的内容了,比如新建一个名称为:baidu-search.ts 的文件,在文件里编写脚本代码,示例如下:
import { chromium } from 'playwright';
import { PlaywrightAgent } from '@midscene/web/playwright';
import 'dotenv/config';
// 休眠函数
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
Promise.resolve(
(async () => {
// 启动浏览器(可视化窗口,方便你看效果)
const browser = await chromium.launch({
headless: false,
args: ['--no-sandbox'],
});
// 新建页面
const page = await browser.newPage();
await page.setViewportSize({ width: 1280, height: 720 });
// 打开百度
await page.goto('https://www.baidu.com');
await sleep(2000);
// 初始化官方标准 Agent
const agent = new PlaywrightAgent(page);
// ===================== 核心操作 =====================
// 点击搜索框,输入AI测试
await agent.aiTap('点击页面中的搜索框');
await agent.aiInput('搜索框',{value:'AI测试'})
await agent.aiTap('点击搜索按钮')
// 等待结果
await agent.aiWaitFor('页面显示搜索结果');
// 验证成功
await agent.aiAssert('搜索结果包含关键字"AI测试"');
// 提取页面信息
const resultTitle = await agent.aiQuery(
'提取搜索结果中的标题名称:[{title: string}]',
);
console.log('搜索到的结果标题名称:', resultTitle);
// 找到第一条数据点进去
await agent.aiAct('搜索结果中点击第一条数据,查看详细信息');
console.log('🎉 百度搜索执行成功!');
// 关闭浏览器
await browser.close();
})(),
);
2.3.3 运行脚本文件
使用下面的命令运行这个脚本:
npx tsx baidu-search.ts
脚本执行结果:

执行完毕后,在D盘midscript目录下,midscene_run目录下,可以查看运行的log文件和report文件:

report报告内容如下图:

三、Android AI自动化测试
和Web AI自动化测试一样,我们依然是先安装Playground,先图形化操作验证一遍,然后再通过脚本的方式来运行。
3.1 安装Android Playground
CMD命令行,执行以下命令安装依赖:
npx --yes @midscene/android-playground

安装完毕后系统会自动打开Playground窗口页面:http://localhost:5800,点击 Playground 窗口中的齿轮设置按钮:

同样需要先粘贴你的 API Key 配置,配置LLM:
MIDSCENE_MODEL_BASE_URL="https://ark.cn-beijing.volces.com/api/v3"
MIDSCENE_MODEL_API_KEY="your api key"
MIDSCENE_MODEL_NAME="Doubao-Seed-2.0-pro"
MIDSCENE_MODEL_FAMILY="doubao-seed"
试用playground: 打开QQ音乐,搜索歌曲:孤勇者:

AI操作过程录屏效果:

3.2 Android 脚本运行
同样,Playground跑通了之后,下一步就是做成可复用的JavaScript脚本。
3.2.1 安装依赖
D盘midscript目录,cmd到这个目录下,然后使用下面的命令安装依赖:
npm install @midscene/android dotenv --save-dev

3.2.2 创建脚本文件
import 'dotenv/config';
import {
AndroidAgent,
AndroidDevice,
getConnectedDevices,
} from '@midscene/android';
// 休眠函数
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
Promise.resolve(
(async () => {
// 获取连接的PAD设备
const devices = await getConnectedDevices();
const device = new AndroidDevice(devices[0].udid);
// AI上下文:中文配置,自动处理弹窗(权限、协议、登录页直接关闭/同意)
const agent = new AndroidAgent(device, {
aiActionContext: `
如果出现权限申请、用户协议、位置授权、广告弹窗,直接点击允许/同意/关闭
如果出现登录页面,直接关闭
`,
});
// 连接PAD
await device.connect();
console.log('✅ 已成功连接安卓平板');
// ===================== 全中文指令,极简易懂 =====================
// 1. 打开QQ音乐
await agent.aiAct('打开QQ音乐应用');
await sleep(3000);
// 2. 点击搜索框,输入孤勇者,执行搜索(核心指令,中文最稳)
await agent.aiAct('点击搜索框,输入“孤勇者”,然后点击搜索');
await sleep(3000);
// 3. 等待搜索结果加载完成
await agent.aiWaitFor('屏幕上显示出孤勇者的搜索结果');
// 4. 查询歌曲信息(中文结构化输出)
const songList = await agent.aiQuery(
'提取页面上的歌曲名和歌手名,返回数组格式:[{songName: string, singer: string}]',
);
console.log('🎵 搜索到的歌曲:', songList);
// 5. 验证结果存在
await agent.aiAssert('页面上存在孤勇者相关的歌曲结果');
console.log('🎉 脚本执行完毕!');
})(),
);
3.2.3 运行脚本
使用下面的命令运行这个脚本:
npx tsx demo.ts
运行日志效果如下:

report报告效果如下:

四、常用API说明
在 Midscene 中,你可以选择使用自动规划(Auto Planning)或即时操作(Instant Action)两种方式来执行:
- agent.ai() 是自动规划(Auto Planning):Midscene 会自动规划操作步骤并执行。它更智能,更像流行的 AI Agent 风格,但可能较慢,且效果依赖于 AI 模型的质量。
- agent.aiTap(), agent.aiHover(), agent.aiInput()等是即时操作(Instant Action):Midscene 会直接执行指定的操作,而 AI 模型只负责底层任务,如定位元素等。这种接口形式更快、更可靠。当你完全确定自己想要执行的操作时,推荐使用这种接口形式。
两者也可以混合使用,比如我们上面的脚本里,对于打开QQ音乐APP的操作:有时候打开过程中会有广告加载,有时候没有广告加载,由于有没有广告是动态非固定的,这种时候让AI自主规划就比我们指定写死动作会更好,比如:
agent.aiAct('打开QQ音乐应用')
而对于像百度页面搜索文本框输入关键字搜索,这是一套固定的操作,不会有动态变化的地方,这种时候我们就用即时操作方式会更适合,比如:
agent.aiTap('点击页面中的搜索框')
4.1 API归类
4.1.1 执行操作类(让 AI 完成界面交互)

4.1.2 状态验证类(确保界面符合预期)

4.1.3 数据提取类(从界面获取信息)

4.1.4 辅助工具类(提升自动化效率)

4.2 常用API使用示例
4.2.1 aiAct:AI 自动规划多步任务(最核心)
作用:让 AI 理解自然语言描述的目标,自动规划并执行一系列操作,无需手动分步写点击 / 输入等细节。
写法与示例:
// 简单用法
await agent.aiAct('打开QQ音乐,搜索孤勇者并播放第一首歌');
// 带上下文的复杂用法(指定处理弹窗策略)
const agent = new AndroidAgent(device, {
aiActionContext: `
如果出现权限弹窗,点击允许
如果出现登录页面,直接关闭
优先选择免费歌曲播放
`
});
await agent.aiAct('打开QQ音乐,搜索孤勇者并播放第一首免费歌曲');
4.2.2 aiWaitFor:智能等待(解决异步加载)
作用:持续检查界面状态,直到条件满足或超时,避免硬编码 sleep 导致的不稳定。
写法与示例:
// 基本用法
await agent.aiWaitFor('搜索结果页面已完全加载');
// 自定义超时和检查间隔
await agent.aiWaitFor(
'购物车显示至少3件商品',
{ timeoutMs: 15000, checkIntervalMs: 2000 } // 15秒超时,每2秒检查一次
);
// 结合图片提示(复杂界面识别)
await agent.aiWaitFor({
text: '支付成功页面已显示',
image: './expected-success-screen.png' // 参考图片路径
});
4.2.3 aiQuery:结构化数据提取(测试数据收集)
作用:从界面提取符合指定结构的数据,支持数组、对象等复杂类型,AI 自动识别对应元素。
写法与示例:
// 提取商品列表(带类型定义)
const headphones = await agent.aiQuery(`
{
itemTitle: string, // 商品标题
price: Number, // 价格(数字类型)
rating: Number // 评分(可选)
}[], 请找出页面上所有耳机产品及对应价格和评分
`);
console.log('耳机产品列表:', headphones);
// 提取单个对象
const userProfile = await agent.aiQuery(`
{
name: string,
email: string,
membershipLevel: string
}, 获取当前用户的个人资料信息
`);
4.2.4.aiAssert:断言验证(测试核心)
作用:验证界面状态是否符合预期,不满足时抛出错误,中断测试流程,确保测试结果可预期。
写法与示例:
// 基本断言
await agent.aiAssert('页面顶部显示"搜索结果"标题');
// 带自定义错误信息
await agent.aiAssert(
'购物车总金额为99.99元',
'购物车金额计算错误' // 断言失败时显示的错误信息
);
// 数值比较断言
await agent.aiAssert('商品价格低于500元');
// 否定断言(检查不存在的元素)
await agent.aiAssert('页面没有显示错误提示框');
以上就是本文的全部内容,如果对你有帮助,麻烦点赞+收藏+关注,一键三连,你的支持就是作者更新最大的动力!欢迎关注下方我的公众号:程序员杨叔,各类文章都会第一时间在上面发布,持续分享各类测试开发知识干货!
更多推荐



所有评论(0)