Midscene.js - AI 驱动的UI自动化测试
最近字节跳动开源的全新的 midscene.js UI 自动化测试框架火爆了,midscene基于多模态AI推理能力使得UI的自动化测试变得更加便捷
读者应该都知道UI自动化测试为了模拟真实的用户操作,比如往期文章中讲的cypress,通常需要通过选择器如class、id
选择页面的元素后,然后做一些点击、输入类的操作。然而当页面元素变得极其庞大和复杂时,元素的选择将会变得越来越麻烦和不可控,维护也越来越麻烦
midscene.js借助AI推理能力开创UI测试新赛道,让这一切都变得更简单
核心功能
和其他的自动化测试框架类似,midscene也提供了和其他框架相似的api,其中最关键的为以下几种:
aiAction
:执行交互行为,这个方法允许你通过自然语言描述一系列 UI 操作步骤。Midscene 会自动规划这些步骤并执行。比如:在搜索框中输入 "DeepSeek",然后点击搜索按钮
aiQuery
:使用此方法,你可以直接从 UI 提取数据,并借助多模态 AI 的推理能力,实现智能提取。只需通过描述定义期望格式(如字符串、数字、JSON、数组等),Midscene 即返回相应结果aiAssert
:执行断言,使用此方法你可以通过自然语言描述一个断言条件,让 AI 判断该条件是否为真
除此之外还有很多其他的API,如:aiTap
点击某个元素、aiInput
输入文本等等,都是一些辅助性的API,丰富自动化测试的流程
从Chrome插件快速上手
为了能快速的体验midscene的能力,官方提供了Chrome插件快速上手,只需访问Midscene.js插件地址安装后打开即可
通过使用 Midscene.js Chrome 插件,你可以快速在任意网页上体验 Midscene 的主要功能,而无需编写任何代码
启动扩展,通过粘贴 Key=Value 格式配置插件环境:
OPENAI_API_KEY="sk-replace-by-your-own"
配置完成后,你可以立即开始使用 Midscene。它一共有三个关键操作 Tab:
- Action: 与网页进行交互,如 "在搜索框中输入 Midscene" 或 "点击登录按钮"
- Query: 从界面中提取 JSON 数据,如 "提取页面中的用户 ID,返回 { id: string }"
- Assert: 执行断言,如 "页面标题是 Midscene"
这里我是了下在搜索引擎中搜索hengshuai's blog
,然后让其点击第一条结果:
上图中可以看到全程没有任何具体的代码,仅仅通过自然语言就完成了一系列行为
使用YAML自动化配置
Midscene 提供了一种基于 .yaml 文件的自动化测试方法,这有助于你专注于脚本本身,任何团队内的成员都可以编写自动化脚本,而无需学习任何 API
target:
url: https://www.bing.com
tasks:
- name: 搜索天气
flow:
- ai: 搜索 "今日天气"
- sleep: 3000
- name: 检查结果
flow:
- aiAssert: 结果中展示了天气信息
2
3
4
5
6
7
8
9
10
11
12
配置环境变量:
OPENAI_API_KEY="sk-xxxxxxx"
# 其他...
2
安装@midscene/cli
npm install @midscene/cli -g
执行脚本:
npx midscene ./test.yaml
除此之外还有一些其他的脚本参数,读者可以参考YAML介绍文档
集成到 Puppeteer
使用Puppeteer的开发者应该都知道Puppeteer是一个Node.js的库,它允许你使用JavaScript控制浏览器,以编程方式执行网络请求,处理DOM,并捕获屏幕截图和PDF
midscene.js也提供了一种基于 Puppeteer 的集成方式,允许你使用 Puppeteer 的 API 来编写自动化测试脚本,并使用 Midscene 的 API 来执行自动化测试
安装依赖:
npm install @midscene/web puppeteer tsx --save-dev
同样的也要配置必要的环境变量:
# 更新为你自己的 Key
export OPENAI_API_KEY="sk-abcdefghijklmnopqrstuvwxyz"
# 其他...
2
3
编写Nodejs脚本:
import puppeteer from "puppeteer";
import { PuppeteerAgent } from "@midscene/web/puppeteer";
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
Promise.resolve(
(async () => {
const browser = await puppeteer.launch({
headless: false, // here we use headed mode to help debug
});
const page = await browser.newPage();
await page.setViewport({
width: 1280,
height: 800,
deviceScaleFactor: 1,
});
await page.goto("https://www.ebay.com");
await sleep(5000);
// 👀 初始化 Midscene agent
const agent = new PuppeteerAgent(page);
// 👀 执行搜索
// 注:尽管这是一个英文页面,你也可以用中文指令控制它
await agent.aiAction('在搜索框输入 "Headphones" ,敲回车');
await sleep(5000);
// 👀 理解页面,提取数据
const items = await agent.aiQuery(
'{itemTitle: string, price: Number}[], 找到列表里的商品标题和价格',
);
console.log("耳机商品信息", items);
// 👀 用 AI 断言
await agent.aiAssert("界面左侧有类目筛选功能");
await browser.close();
})()
);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
运行脚本:
npx tsx ./test.ts
集成到 Playwright
Playwright.js 是由微软开发的一个开源端到端自动化测试框架,主要用于对网络应用程序进行端到端测试(end-to-end test)和网页抓取
安装依赖:
npm install @midscene/web --save-dev
更新 playwright.config.ts:
export default defineConfig({
testDir: './e2e',
+ timeout: 90 * 1000,
+ reporter: [["list"], ["@midscene/web/playwright-report"]],
});
2
3
4
5
扩展 test 实例:
import { test as base } from '@playwright/test';
import type { PlayWrightAiFixtureType } from '@midscene/web/playwright';
import { PlaywrightAiFixture } from '@midscene/web/playwright';
export const test = base.extend<PlayWrightAiFixtureType>(PlaywrightAiFixture());
2
3
4
5
编写测试脚本:
import { expect } from "@playwright/test";
import { test } from "./fixture";
test.beforeEach(async ({ page }) => {
page.setViewportSize({ width: 400, height: 905 });
await page.goto("https://www.ebay.com");
await page.waitForLoadState("networkidle");
});
test("search headphone on ebay", async ({
ai,
aiQuery,
aiAssert,
aiInput,
aiTap,
aiScroll
}) => {
// 使用 aiInput 输入搜索关键词
await aiInput('Headphones', '搜索框');
// 使用 aiTap 点击搜索按钮
await aiTap('搜索按钮');
// 等待搜索结果加载
await aiWaitFor('搜索结果列表已加载', { timeoutMs: 5000 });
// 使用 aiScroll 滚动到页面底部
await aiScroll(
{
direction: 'down',
scrollType: 'untilBottom'
},
'搜索结果列表'
);
// 使用 aiQuery 获取商品信息
const items = await aiQuery<Array<{title: string, price: number}>>(
'获取搜索结果中的商品标题和价格'
);
console.log("headphones in stock", items);
expect(items?.length).toBeGreaterThan(0);
// 使用 aiAssert 验证筛选功能
await aiAssert("界面左侧有类目筛选功能");
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
运行测试脚本:
npx playwright test ./e2e/ebay-search.spec.ts
模型对比
GPT-4o:midscene默认使用GPT-4o为默认的推理模型,成本比较高。Midscene 需要将截图和 DOM 树一起发送给模型,这会导致 token 消耗较高。例如,在 1280x800 分辨率下,eBay 首页需要 6000 个 token 输入,搜索结果页面则需要 9000 个 token 输入。因此,它的成本会显著高于其他模型
千问 Qwen-2.5-VL 模型:Qwen-2.5-VL 支持视觉定位,不需要发送 DOM 树给模型。和 gpt-4o 相比,它可以节省 30% 到 50% 的 token 数量。在阿里云官方部署版本中,费用消耗可以下降 80% 以上;小图标识别能力较差:和 gpt-4o 一样,它可能无法准确定位小图标。断言能力一般:在某些情况下,Qwen-2.5-VL 的断言能力可能不如 gpt-4o
其他模型:
claude-3-opus-20240229
gemini-1.5-pro
doubao-vision-pro-32k(豆包)
Midscene测试意义
- 降低测试门槛与范式迁移
- 非技术人员(如产品经理)可通过自然语言参与测试设计,团队协作效率提升40%
- 可视化报告与调试Playground简化问题定位,减少50%的调试时间
- 重构测试团队角色,从“脚本工人”转向质量策略师与风险预测师
- 突破传统UI自动化测试的局限性
- 用户通过自然语言描述操作(如“点击登录按钮,输入用户名”),无需编写选择器代码,降低维护成本90%
- 结合视觉截图、DOM结构和语义分析,实现跨模态元素定位(准确率98.7%)