Midscene.js - AI驱动,轻松实现UI自动化
UI自动化测试一直是软件测试中的一项重要任务,而随着AI技术的快速发展,自动化测试的能力也在不断提升。如何让UI自动化更智能、精准、灵活?Midscene.js作为一款AI驱动的UI自动化测试工具,正逐步改变着传统自动化测试的面貌。你是不是也在寻找一款能够轻松实现UI自动化测试的工具呢?那就不妨来了解一下这款神器!
UI自动化测试常常因界面变化多、操作繁琐、元素识别困难等问题让测试人员头疼。Midscene.js作为一款AI驱动的自动化工具,它是如何突破这些难题,并且实现精准高效的UI自动化测试呢?本文将为你深度解析Midscene.js的强大功能,帮助你实现更智能的自动化测试。
随着AI技术的不断发展,AI驱动的自动化工具逐渐成为开发和测试人员的新宠。传统的UI自动化测试往往依赖元素定位和脚本编写,维护难度大且容易出现误差,而AI自动化的兴起,尤其是在UI测试领域,打破了这些局限,让软件测试变得更加智能和高效。

1、前言
截至目前,自然语言驱动的UI自动化测试技术已实现效率、协作与适应性三重突破:
-
技术层面:多模态AI模型(视觉+语义)与边缘计算结合,精准解析动态交互(如AR/VR手势、全球化多语言布局),实现复杂场景覆盖。
-
行业价值:在金融合规、医疗审计等领域自动化验证高危流程,误报率降低60%,测试用例生成效率提升12倍。
-
协作模式:非技术人员可通过自然语言直接编写脚本,跨职能团队共享“业务语言”降低沟通成本,AI自愈机制使脚本维护成本减少70%。
该技术正从“辅助工具”进化为质量保障核心决策中枢,推动软件交付从“人适应工具”到“工具理解意图”的范式重构。
本篇将介绍一款,也是只需用自然语言描述就可实现完成自动化测试操作的工具 - Midscene.js。
2、简介
Midscene.js让人工智能成为你的浏览器操作助手,只需用自然语言描述你想做的事情,它就会帮助你操作网页、验证内容以及提取数据。无论你是想快速体验一下,还是进行深度开发,都能轻松上手。
功能特点:
-
自然语言交互:只需描述你的目标和步骤,Midscene就会为你规划并操作用户界面。
-
Chrome扩展程序体验:通过Chrome扩展程序即可立即开始体验,无需编写代码。
-
Puppeteer/Playwright集成:支持集成Puppeteer和Playwright,让你能够将人工智能功能与这些强大的自动化工具相结合,轻松实现自动化操作。
-
支持开源模型:支持对UI-TARS和Qwen2.5-VL进行私有化部署,在用户界面自动化场景中,它们的表现优于GPT-4o和Claude等闭源模型,同时能更好地保护数据安全。
-
支持通用模型:支持GPT-4o和Claude等通用大模型,适应各种场景需求。
-
用于调试的可视化报告:通过我们的测试报告和演练场,你可以轻松理解、重放和调试整个过程。
-
支持缓存:首次通过人工智能执行任务时,任务会被缓存,后续执行相同任务时,执行效率将大幅提高。
-
完全开源:体验全新的自动化开发感受,尽情享受吧!
-
理解用户界面、JSON格式响应:你可以指定数据格式要求,并接收JSON格式的响应内容。
-
直观的断言:用自然语言表达你的断言,人工智能会理解并处理这些断言。
-
与Javascript集成:你可以永远相信Javascript。
模型选择:
Midscene.js推荐使用的三种模型是GPT-4o,Qwen2.5-VL(千问)和UI-TARS。它们的的主要特性是:
-
GPT-4o:表现比较平衡,需要使用较多token。
-
千问Qwen-2.5-VL:开源的VL模型,几乎与GPT-4o表现相同,使用阿里云部署的版本时成本很低。
-
UI-TARS:开源的端到端GUI代理模型,擅长执行目标驱动的任务,有错误纠正能力。
你也可以使用其他模型。
Midscene提供了三种关键方法:
交互(.ai, .aiAction)、提取(.aiQuery)、断言(.aiAssert)。
-
交互:用 .ai 方法描述步骤并执行交互。
-
提取:用 .aiQuery 从UI中“理解”并提取数据,返回值是JSON格式,你可以尽情描述想要的数据结构。
-
断言:用 .aiAssert 来执行断言。
官网地址:https://midscenejs.com/
3、快速上手
一、通过Chrome插件快速体验
通过使用Midscene.js的Chrome插件,你可以快速在任意网页上体验Midscene的主要功能,而无需编写任何代码。
1、安装:
前往Chrome扩展商店安装Midscene.js插件:
https://chromewebstore.google.com/detail/midscene/gbldofcpkknbggpkmbdaefngejllnief
或者联系作者,获取离线Midscene.js插件。
2、配置:
安装Midscene.js插件后,需要设置环境变量(接入的模型和API KEY)。
本文示例作者使用火山云的豆包doubao-vision-pro-32k模型。
调用前需要配置推理点:
https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint
在推理点界面中,寻找一个如 ep-202... 形式的接入点ID 作为模型名称。

配置环境变量完成。
配置信息:
export OPENAI_BASE_URL="https://ark.cn-beijing.volces.com/api/v3"export OPENAI_API_KEY="..."export MIDSCENE_MODEL_NAME="ep-202....."
3、开始体验:
打开一个购物网站。

输入执行步骤“将书包和$49.99的衣服添加到购物车里,并进入到购物车里进行查看”。

根据想提取的信息,来获取JSON格式的返回值。

获取断言格式。

实际网页已经跳转到购物车里。

回放操作和下载报告文件。

打开可视化报告。



二、使用YAML格式的自动化脚本
使用官方的示例项目
https://github.com/web-infra-dev/midscene-example/tree/main/yaml-scripts-demo

1、安装:
确保已安装Node.js,全局安装@midscene/cli。
npm i -g @midscene/cli
2、配置:
配置OpenAI API KEY。
# 更新为你自己的Key
export OPENAI_API_KEY="sk-abcdefghijklmnopqrstuvwxyz"
或使用.env文件存储配置,Midscene命令行工具在运行yaml脚本时会自动加载它。
OPENAI_API_KEY="sk-abcdefghijklmnopqrstuvwxyz"
本例作者继续使用火山云的豆包doubao-vision-pro-32k模型。

3、.yaml文件结构:
在.yaml文件中,有两个部分:target和tasks。
target部分定义了任务的基本信息。
target:# 访问的 URL,必填。如果提供了 `serve` 参数,则提供相对路径url: <url># 在本地路径下启动一个静态服务,可选serve: <root-directory># 浏览器 UA,可选userAgent: <ua># 浏览器视口宽度,可选,默认 1280viewportWidth: <width># 浏览器视口高度,可选,默认 960viewportHeight: <height># 浏览器设备像素比,可选,默认 1deviceScaleFactor: <scale># JSON 格式的浏览器 Cookie 文件路径,可选cookie: <path-to-cookie-file># 等待网络空闲的策略,可选waitForNetworkIdle:# 等待超时时间,可选,默认 10000mstimeout: <ms># 是否在等待超时后继续,可选,默认 truecontinueOnNetworkIdleError: <boolean># 输出 aiQuery 结果的 JSON 文件路径,可选output: <path-to-output-file># 是否限制页面在当前 tab 打开,可选,默认 trueforceSameTabNavigation: <boolean># 桥接模式,可选,默认 false,可以为 'newTabWithUrl' 或 'currentTab'。更多详情请参阅后文bridgeMode: false | 'newTabWithUrl' | 'currentTab'
tasks部分是一个数组,定义了脚本执行的步骤。记得在每个步骤前添加 - 符号。
tasks:- name: <name>continueOnError: <boolean> # 可选,错误时是否继续执行下一个任务,默认 falseflow:# 执行一个交互,`ai` 是 `aiAction` 的简写方式- ai: <prompt># 执行一个交互- aiAction: <prompt># 执行一个断言- aiAssert: <prompt># 执行一个查询,返回一个 JSON 对象- aiQuery: <prompt> # 记得在提示词中描述输出结果的格式name: <name> # 查询结果在 JSON 输出中的 key# 等待某个条件满足,并设置超时时间(ms,可选,默认 30000)- aiWaitFor: <prompt>timeout: <ms># 等待一定时间- sleep: <ms>- name: <name>flow:# ...
4、示例脚本:
示例项目总共有4个脚本。

extract-github-status.yaml,从github状态页面提取状态信息。

local-static-server.yml,将public文件夹用作静态服务器,并测试index.html文件。

sauce-demo.yaml,登录到sauce demo,将项目信息提取到json文件中,并断言“sauce Labs Fleece夹克”的价格。

search-headphone-on-ebay.yaml,模拟移动设备,在ebay上搜索耳机,将商品信息提取到json文件中,并断言购物车图标。

5、运行脚本:
# 运行所有脚本:
midscene ./midscene-scripts/# 运行单个脚本:
midscene ./midscene-scripts/sauce-demo.yaml# 运行在有界面模式下,使用 --headed 选项:
midscene ./midscene-scripts/sauce-demo.yaml --headed# 运行在有界面模式下,并在结束后保持浏览器窗口打开,使用 --keep-window 选项:
midscene ./midscene-scripts/sauce-demo.yaml --keep-window
6、可视化报告:
extract-github-status脚本报告。

local-static-server脚本报告。

sauce-demo脚本报告。

search-headphone-on-ebay脚本报告。


总结
如果你正在寻找一款高效、智能的UI自动化测试工具,不妨试试Midscene.js。它的AI驱动特性,能够为你的测试团队带来革命性的提升。无论是减少人工干预、提高测试准确性,还是降低维护成本,Midscene.js都能为你提供强有力的支持。快来了解更多信息,提升测试效率吧!
AI驱动的自动化测试工具正在迅速改变测试领域的格局。Midscene.js凭借其创新的智能识别和高效的测试脚本生成,成为UI自动化测试中的佼佼者。随着AI技术的不断进步,我们可以期待在不久的将来,UI自动化测试将变得更加智能、灵活,进一步提升软件的质量和开发效率。
"让AI驱动的UI自动化测试为你的开发团队插上腾飞的翅膀,快速、高效、精准,超越传统测试的极限!"
相关文章:
Midscene.js - AI驱动,轻松实现UI自动化
UI自动化测试一直是软件测试中的一项重要任务,而随着AI技术的快速发展,自动化测试的能力也在不断提升。如何让UI自动化更智能、精准、灵活?Midscene.js作为一款AI驱动的UI自动化测试工具,正逐步改变着传统自动化测试的面貌。你是不…...
(九)Mapbox GL JS 中 Marker 图层的使用详解
什么是 Marker? 在 Mapbox GL JS 中,Marker(标记) 是一个可视化元素,用于在地图上标记特定的地理位置。它可以是一个默认的图标、自定义的图像,或者任何 HTML 元素。Marker 不仅能显示位置,还能…...
2k1000LA 使能 nand.
背景 : 默认的 发货的镜像 确实 是识别不了 nand 的。 ------------------------------------------------------------------------------------------ 但是 我之前 已经写好了文档,因此 拷贝到线上。 1 首先我要使能这几个。 在menuconfig 中使能一下。...
Junit+Mock
base project <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.11</version><relativePath/></parent><dependencies><!--添加mysql依…...
maven编译出错,javac: ��Ч��Ŀ�귢�а�: 17
1、异常信息 javac: ��Ч��Ŀ�귢�а�: 17 ��: javac <options> <source files> -help �����г&a…...
Vue使用Three.js加载glb (gltf) 文件模型及实现简单的选中高亮、测距、测面积
安装: # three.jsnpm install --save three 附中文网: 5. gltf不同文件形式(.glb) | Three.js中文网 附官网: 安装 – three.js docs 完整代码(简易demo): <template><div class"siteInspe…...
<el-table>右侧有空白列解决办法
问题如图: 解决办法:.box 为本页面最外层的class名,保证各个页面样式不会互相污染。 .box::v-deep .el-table th.gutter {display: none;width: 0}.box ::v-deep.el-table colgroup col[namegutter] {display: none;width: 0;}.box::v-deep …...
Linux网络 网络层
IP 协议 协议头格式 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4. 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 4 字节,4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节. 8 位服务类型(Type Of Service):…...
系统讨论Qt的并发编程——逻辑上下文的分类
目录 前言 首先,讨论Qt里常见的三种上下文 同一线程的串行执行 同一线程的异步执行 多线程的执行 moveToThread办法 前言 笔者最近看了一个具备一定启发性质的Qt教程,在这里,笔者打算整理一下自己的笔记。分享在这里. 首先,…...
《Linux Shell 脚本深度探索:原理与高效编程》
1. 基本结构 Shebang 行 #!/bin/bash # Shebang 行指定了脚本使用的解释器。 /bin/bash 表示使用 Bash 解释器执行脚本。 注释 # 这是注释,不会被执行 2. 变量 定义变量 variable_namevalue # 不需要加 $ 来定义变量。 # 变量名不能包含空格或特殊字符。 访…...
深入剖析:基于红黑树实现自定义 map 和 set 容器
🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 在 C 标准模板库(STL)的大家庭里,map和set可是超级重要的关联容器成员呢😎&#x…...
在大数据项目中如何设计和优化数据模型
在大数据项目中,设计和优化数据模型是一个涉及多个步骤和维度的复杂过程。以下是我通常采取的方法: 一、数据模型设计 明确业务需求: 深入了解项目的业务场景和目标,明确数据模型需要解决的具体问题。与业务团队紧密合作…...
JavaScript querySelector()、querySelectorAll() CSS选择器解析(DOM元素选择)
文章目录 基于querySelector系列方法的CSS选择器深度解析一、方法概述二、基础选择器类型1. 类型选择器2. ID选择器3. 类选择器4. 属性选择器 三、组合选择器1. 后代组合器2. 子元素组合器3. 相邻兄弟组合器4. 通用兄弟组合器 四、伪类与伪元素1. 结构伪类2. 状态伪类3. 内容伪…...
Linux系统中处理子进程的终止问题
1. 理解子进程终止的机制 在Unix/Linux系统中,当子进程终止时,会向父进程发送一个SIGCHLD信号。父进程需要捕捉这个信号,并通过调用wait()或waitpid()等函数来回收子进程的资源。这一过程被称为“回收僵尸进程”。 如果父进程没有及时调用w…...
Docker 不再难懂:快速掌握容器命令与架构原理
1. Docker 是容器技术的一种 容器(Container)概述 容器(Container)是一种轻量级的虚拟化技术,它将应用程序及其所有依赖环境打包在一个独立的、可移植的运行时环境中。容器通过操作系统级的虚拟化提供隔离࿰…...
取消票证会把指定的票证从数据库中删除,同时也会把票证和航班 等相关表中的关联关系一起删除。但在删除之前,它会先检查当前用户是否拥有这张票
在做航班智能客服问答系统时会遇到取消票证的场景,这里涉及数据库的操作时会把指定的票证从数据库中删除,同时也会把票证和航班等相关表中的关联关系一起删除。但在删除之前,需要先检查当前用户是否拥有这张票,只有票主才有权限取…...
力扣-贪心-763 划分字母区间
思路 先统计字符串中每一个字母出现的最后下标,然后从end初始化为第一个字母出现的最后下标,在i<end时,不断更新end,因为一旦囊括新的字母就最起码要遍历到新字母出现的最后下标,在i>end时,说明遍历…...
【Redis 原理】网络模型
文章目录 用户空间 && 内核空间阻塞IO非阻塞IO信号驱动IO异步IOIO多路复用selectpollepoll Web服务流程Redis 网络模型Redis单线程网络模型的整个流程Redis多线程网络模型的整个流程 用户空间 && 内核空间 为了避免用户应用导致冲突甚至内核崩溃,用…...
cpp中的继承
一、继承概念 在cpp中,封装、继承、多态是面向对象的三大特性。这里的继承就是允许已经存在的类(也就是基类)的基础上创建新类(派生类或者子类),从而实现代码的复用。 如上图所示,Person是基类&…...
DeepSeek全栈接入指南:从零到生产环境的深度实践
第一章:DeepSeek技术体系全景解析 1.1 认知DeepSeek技术生态 DeepSeek作为新一代人工智能技术平台,构建了覆盖算法开发、模型训练、服务部署的全链路技术栈。其核心能力体现在: 1.1.1 多模态智能引擎 自然语言处理:支持文本生成(NLG)、语义理解(NLU)、情感分析等计算…...
Spring Boot 条件装配入门:一文搞懂 @ConditionalOnClass(附实战)
tips: Spring Boot 核心机制之 Conditional:从原理到实战(一次讲透) 一、前言 在使用 Spring Boot 的过程中,你可能会看到这样的注解: ConditionalOnClass 很多人第一次看到它,会有几个疑问&am…...
Paper 深读 | LLM驱动的多智能体分层决策新范式
**🔑 关键词:**分层决策、LLM规划、Bandit探索、多智能体导航 **🔥 一句话标签:**首创"LLMBandit分布式RL"三层自治体系,显著提升多智能体复杂任务的规划、探索与协作效率 02 一句话核心思想 针对多智能体…...
别再凭感觉画板了!PCB布局布线这10个坑,新手工程师最容易踩
PCB设计避坑指南:新手工程师必须掌握的10个布局布线技巧 刚接触PCB设计的新手工程师常常会陷入一个误区——认为只要电路原理正确,板子画出来就能正常工作。这种想法往往会导致后期调试时遇到各种"玄学"问题:信号不稳定、EMI超标、…...
golang如何实现错误预算Error Budget计算_golang错误预算Error Budget计算实现实战
错误预算是SLO允许的失败请求占比上限,需绑定固定时间窗口、用累计值而非rate计算、避免float64实时减法,推荐Prometheus聚合异步校准。什么是错误预算,Go 里为什么不能直接用 float64 算错误预算是 SLO(Service Level Objective&…...
SpringBoot多模块开发,启动类扫描不到SDK的Bean?试试这3种注入方式(含实战避坑)
SpringBoot多模块开发中Bean注入难题的3种实战解决方案 最近在重构一个电商后台系统时,我把通用功能抽离成了独立SDK模块。本以为引入依赖就能万事大吉,结果主项目启动时频频报NoSuchBeanDefinitionException。这才意识到,在多模块架构中&…...
Orwell Dev-C++和Embarcadero Dev-C++哪个更稳定
关于Orwell Dev-C和Embarcadero Dev-C的稳定性比较,可以从以下几个维度分析:开发背景Orwell Dev-C(5.x版本)是原始Dev-C项目的延续维护版本,最后一次更新为2015年;Embarcadero Dev-C(6.x版本&am…...
保姆级教程:用Cesium.js 1.107+ 加载ArcGIS Server发布的WMTS地图(附完整代码)
从零实现Cesium与ArcGIS WMTS地图集成:2023终极实践指南 第一次打开Cesium的官方示例时,那个缓缓旋转的蓝色星球总让人有种造物主般的兴奋。但当你真正需要把业务地图投射到这个数字地球上时,现实往往比想象复杂得多——特别是当数据源来自企…...
从单根谱线到频谱搬移:用Matlab的fft/pspectrum搞懂实信号与复信号频谱差异
从单根谱线到频谱搬移:用Matlab的fft/pspectrum搞懂实信号与复信号频谱差异 第一次用Matlab的fft函数画正弦信号频谱时,我盯着屏幕上对称的两根谱线愣了半天——明明只生成了一个频率的正弦波,为什么会出现两根线?直到后来接触复信…...
今天不看SITS2026这页PPT,明年招标书里将彻底消失“传统机器人”术语
第一章:SITS2026演讲:AGI与机器人结合 2026奇点智能技术大会(https://ml-summit.org) 核心范式转变 传统机器人系统依赖预编程行为树与模块化感知-决策-执行链路,而SITS2026展示的AGI驱动架构将大语言模型(LLM)与具身…...
全球首份AGI行业渗透率年报(SITS2026机密版流出):制造业AGI渗透率飙升至34.7%,你的竞对已部署第3代智能体
第一章:SITS2026发布:AGI行业应用报告 2026奇点智能技术大会(https://ml-summit.org) SITS2026发布的《AGI行业应用报告》基于全球37个国家、214家头部企业的实证调研,首次系统性呈现通用人工智能在金融、医疗、制造与能源四大核心场景的规…...
