news 2026/9/12 12:41:14

Midscene.js:视觉驱动的 GUI Agent 端到端测试框架|2026实战解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Midscene.js:视觉驱动的 GUI Agent 端到端测试框架|2026实战解析

Midscene.js:视觉驱动的 GUI Agent 端到端测试框架|2026实战解析

【免费下载链接】midsceneGUI Agent for E2E Testing项目地址: https://gitcode.com/GitHub_Trending/mid/midscene

Midscene.js 是一个基于视觉的 GUI Agent 端到端测试框架:你用自然语言描述操作目标,它像人一样看截图、找元素、点按输入,并在 Web、Android、iOS 等平台上复用同一套 Agent API,运行结束后自动生成可回放的 HTML 报告。如果你正在维护 E2E 自动化脚本、被选择器维护问题拖累,这篇实战解析会从安装配置讲到跨端场景与成本优化。

🎬 按钮挪了个位置,你的 E2E 脚本还能跑吗

上周,电商项目的 QA 同事跑回归时发现:商品卡的"加入购物车"按钮换了配色,列表顶部还多了一个活动弹窗,12 条脚本里 7 条因为 XPath 失效直接报错。他花了一整天核对元素位置才把用例修完。Midscene.js 解决的就是这类问题:它把"看屏幕—做操作—验证结果"这套人的使用方式建模给多模态模型,你写的是"在搜索框输入 Headphones 并回车",而不是第 3 层 div 下第 2 个 span。

🧩 Midscene.js 能替你完成哪些事

用自然语言做交互和断言

  • aiAct:接收一个目标,自主规划步骤、定位元素并执行,直到目标达成。你省下的是逐步拆解流程的代码和整条定位链路。
  • aiTap/aiInput/aiScroll等即时交互 API:一次调用只做一个动作,适合路径固定、只需替换个别步骤的场景。
  • aiAssert:用一句话描述期望界面,条件不成立就抛错并附带模型判断原因。你省下的是大量page.textContent式的断言代码。
  • aiQuery:从界面提取结构化数据,提示词里写明结构即可拿到数组或对象,不需要手动解析 DOM。

一套 Agent API 覆盖 Web 与移动端

同一个agent.aiAct(...)调用,在浏览器和手机上跑的是相同的规划逻辑,你只需要换掉底层连接方式:

平台集成包前置条件
Web@midscene/web(Playwright / Puppeteer)一个已打开的页面实例
Android@midscene/android设备通过 adb 连接
iOS@midscene/ios已部署 WebDriverAgent

官方还提供 Playground(Chrome 扩展或各平台 Playground 窗口),让你在不写代码的情况下先验证一句指令的效果,再把它搬进脚本。

⏱️ 从零跑通:5 分钟看到第一份可视化报告

第一步:配置模型

Midscene 通过 4 个环境变量找到你的多模态模型,在项目目录建一个.env即可:

# .env:dotenv 约定,不加 export MIDSCENE_MODEL_BASE_URL="https://你的模型服务地址/v1" MIDSCENE_MODEL_API_KEY="你的APIKey" MIDSCENE_MODEL_NAME="你的模型名称" MIDSCENE_MODEL_FAMILY="你的模型系列"

支持的模型(Qwen、Doubao-Seed、GLM、Gemini、UI-TARS 等)与完整配置见仓库文档 model-common-config。

第二步:写一个最小脚本

需要浏览源码或示例时,clone 一份仓库即可:git clone https://gitcode.com/GitHub_Trending/mid/midscene。否则直接装依赖并保存demo.ts

import { chromium } from 'playwright'; import { PlaywrightAgent } from '@midscene/web/playwright'; import 'dotenv/config'; const browser = await chromium.launch({ headless: true }); const page = await (await browser.newContext()).newPage(); await page.goto('https://www.ebay.com'); const agent = new PlaywrightAgent(page); await agent.aiAct('在搜索框输入 Headphones 并回车'); const items = await agent.aiQuery( '{itemTitle: string, price: number}[], 找出商品及对应价格', ); console.log(items); await agent.aiAssert('页面左侧有分类筛选栏'); await browser.close();

这一行new PlaywrightAgent(page)替你把截图采集、元素定位和动作执行全部挂到了现有 Playwright 页面上,其余代码就是自然语言。

第三步:运行并查看报告

npx tsx demo.ts

控制台打印结构化商品列表,并输出Midscene - report file updated: .../xxx.html,浏览器打开该文件就能看到每一步的截图、AI 决策过程和断言结果:

📱 场景深潜:从单页操作到 Android 真机

场景一:竞品页面的批量价格提取

业务目标是每晚抓取竞品耳机列表并入库。核心调用就是上面脚本里的aiQuery,再把结果写文件即可。两个容易踩的坑:

价格默认可能带货币符号返回。把"金额只返回数字"这类输出要求放进提示词,或在创建 Agent 时设置aiContexts.default,让所有模型调用共享这份业务规则。

页面状态不确定时(比如广告位轮换),在aiQuery前加await agent.aiWaitFor('列表已加载完成'),用视觉等待替代固定 sleep。

场景二:同一套流程跑在 Android 设备上

目标是验证 Web 侧跑通的商品搜索流程在 App 侧的表现。只需把 Playwright 连接换成 adb 设备:

import { AndroidAgent, AndroidDevice, getConnectedDevices } from '@midscene/android'; const device = new AndroidDevice((await getConnectedDevices())[0].udid); const agent = new AndroidAgent(device); await device.connect(); await agent.aiAct('打开浏览器进入 ebay.com,搜索 Headphones 并回车'); const items = await agent.aiQuery( '{itemTitle: string, price: number}[], 找出商品及对应价格', ); console.log(items);

同样的aiAct/aiQuery签名,你换的只是第一行的设备连接。

运行前确认adb devices -l能列出设备且设备已信任电脑;部分机型需要在开发者选项里同时开启"USB 调试(安全设置)",否则注入点击事件会直接报权限错误。

部分 WebView 输入框会监听 ESC 事件,Midscene 输入后默认发 ESC 收起键盘,可能把刚输入的内容清空。遇到这种输入框,参考文档切换键盘收起方式。

⚡ 效率杠杆:把模型调用成本和耗时压下来

  • 启用规划与定位缓存new PuppeteerAgent(page, { cache: { id: 'my-script' } }),缓存aiAct的规划步骤和元素 XPath,命中时省去重复模型调用。官方文档中有一个案例把执行耗时从 51 秒降到 28 秒,缓存文件落在./midscene_run/cache
  • 生产环境用只读策略cache: { strategy: 'read-only', id: '...' }加手动await agent.flushCache(),避免运行时意外污染已验证的缓存。
  • 小目标加deepLocate: true:图标按钮、视觉特征不明显的元素多一轮模型调用,定位更稳。
  • 固定流程少用aiAct:路径确定的操作拆成aiTap/aiInput/aiQuery组合,aiAct每步都基于最新界面重新规划,时间和 token 都更高。
  • 失败先看报告:HTML 报告里有每一步的截图和模型推理,排查断言失败不用再靠猜。

🧭 延伸路径:接下来你可以继续读

  • 想把 Midscene 嵌进现有 Playwright 测试用例(而不是独立脚本),看 集成到 Playwright,里面有playwright.config.ts的完整改法。
  • 想让流程用 YAML 描述、工程步骤用 TypeScript Node 编写,看 Midscene Test 概览,它提供生命周期钩子、重试和并发隔离。
  • 想搞懂缓存的失效与回退机制,再回头看 缓存 AI 规划和定位。

下一步建议:先用 Chrome 扩展 Playground 把你最常维护的三条用例改写成自然语言指令,验证通过后再逐条迁到脚本里。

【免费下载链接】midsceneGUI Agent for E2E Testing项目地址: https://gitcode.com/GitHub_Trending/mid/midscene

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 12:40:47

CYW240128驱动调试实战:ESP32与FPGA联调完整指南

CYW240128 这块屏,玩工控和仪器仪表的老工程师应该不陌生——240x128 图形点阵、黄绿底或蓝底白字、内部集成 RA8806P4N 控制器,属于那种“看起来平平无奇、但项目里离不开”的经典模块。最近不少朋友问我同一个问题:厂商提供的驱动例程里&am…

作者头像 李华
网站建设 2026/9/12 12:38:59

Open-Sora 训练如何用梯度检查点与 CPU 卸载节省显存?

Open-Sora 训练如何用梯度检查点与 CPU 卸载节省显存? 【免费下载链接】Open-Sora Open-Sora: Democratizing Efficient Video Production for All 项目地址: https://gitcode.com/GitHub_Trending/op/Open-Sora 当你用 Open-Sora 的 configs/diffusion/trai…

作者头像 李华
网站建设 2026/9/12 12:36:14

ARM交叉编译实战:解决Exec format error与Qt/OpenSSL部署

“cannot execute binary file: Exec format error”,这行报错我见过太多次了。上个月还有同事把在x86笔记本上编译好的程序拷到ARM开发板上,兴致勃勃准备演示,结果屏幕上就砸了这么一句。旁边的老工程师只问了一句:“你交叉编译了…

作者头像 李华
网站建设 2026/9/12 12:34:16

在 AIRI 中接入 n1n:OpenAI 兼容聊天模型服务的配置指南

在 AIRI 中接入 n1n:OpenAI 兼容聊天模型服务的配置指南 【免费下载链接】airi 💖🧸 Self hosted, you-owned Grok Companion, a container of souls of waifu, cyber livings to bring them into our worlds, wishing to achieve Neuro-sama…

作者头像 李华
网站建设 2026/9/12 12:32:57

Power BI自定义地图开发:高德API与Leaflet.js实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华