Midscene.js:如何用视觉AI实现跨平台UI自动化测试

news2026/4/29 21:05:20
Midscene.js如何用视觉AI实现跨平台UI自动化测试【免费下载链接】midsceneAI-powered, vision-driven UI automation for every platform.项目地址: https://gitcode.com/GitHub_Trending/mid/midsceneMidscene.js是一款基于视觉语言模型的AI驱动UI自动化工具通过纯视觉路线实现跨平台的智能自动化。这款工具让开发者能够用自然语言描述任务AI会自动执行网页、移动端甚至桌面应用的UI操作彻底改变了传统自动化测试的工作方式。为什么视觉AI是UI自动化的未来传统的UI自动化工具严重依赖DOM结构、元素选择器和坐标定位这些方法在面对动态内容、Canvas渲染或跨平台应用时常常失效。Midscene.js采用纯视觉路线完全基于屏幕截图进行元素定位和交互从根本上解决了这些痛点。视觉AI自动化的核心优势跨平台一致性无论是Web应用、Android/iOS移动端还是桌面软件Midscene.js使用相同的视觉识别技术无需为不同平台编写特定代码。动态适应性页面布局变化、元素位置移动、分辨率差异都不再是问题AI能够像人类一样看到并操作界面元素。零代码快速上手通过Chrome扩展即可立即开始使用无需编写复杂的定位器或等待元素加载。开源模型支持支持Qwen3-VL、Doubao-1.6-vision、UI-TARS等主流视觉语言模型既可使用云端API也可本地部署。搭建你的第一个视觉自动化项目环境配置与项目初始化开始使用Midscene.js非常简单首先克隆项目并安装依赖git clone https://gitcode.com/GitHub_Trending/mid/midscene cd midscene npm install或者通过npm直接安装核心包npm install midscene/web模型配置与优化策略在项目根目录下的midscene_prompt.md文件中你可以配置AI模型参数。Midscene.js支持多种视觉语言模型根据任务需求选择最合适的模型// 模型选择策略示例 const modelConfig { // 简单任务降低成本快速响应 simpleTasks: qwen3-vl, // 复杂任务提高准确性 complexTasks: ui-tars, // 实时性要求高快速响应 realtimeTasks: gemini-3-flash, // 本地部署数据隐私保护 selfHosted: qwen3-vl-local };基础自动化脚本编写让我们创建一个简单的网页自动化示例展示Midscene.js的核心APIimport { createWebAgent } from midscene/web; // 创建Web自动化代理 const agent await createWebAgent({ model: qwen3-vl, browserType: chromium, useCache: true, // 启用缓存加速 cacheDir: ./midscene-cache }); // 打开目标网站 await agent.goto(https://example.com/login); // 使用自然语言进行登录操作 await agent.aiTap(用户名输入框); await agent.aiType(testuserexample.com); await agent.aiTap(密码输入框); await agent.aiType(securepassword123); await agent.aiTap(登录按钮); // 验证登录成功 const welcomeText await agent.aiQuery(欢迎文本内容); console.log(登录成功欢迎消息, welcomeText);高级功能与实战应用Bridge模式连接终端与浏览器Midscene.js的Bridge模式允许你通过本地终端SDK控制桌面浏览器特别适合脚本化操作和cookie复用场景。在packages/web-integration/src/bridge-mode/模块中你可以找到完整的桥接实现。Bridge模式应用场景自动化测试脚本与手动操作的平滑切换复用浏览器会话状态如登录状态在CI/CD流水线中控制真实浏览器开发调试过程中的快速原型验证Playground交互式调试环境Midscene.js提供了内置的Playground让你能够在浏览器中实时测试和调试自动化操作。位于apps/playground/src/App.tsx的Playground界面支持Action、Query、Assert三种操作模式。Playground核心功能实时操作反馈立即看到AI对指令的理解和执行结果动作录制与回放记录操作序列并生成可复用的脚本元素定位验证验证AI是否正确识别界面元素性能监控查看每个操作的响应时间和成功率移动端自动化实战对于Android设备控制Midscene.js通过packages/android/src/模块提供了完整的解决方案import { createAndroidAgent } from midscene/android; const agent await createAndroidAgent({ deviceId: your-device-id, model: ui-tars // 使用专门优化的UI模型 }); // 自动化应用测试流程 await agent.launchApp(com.example.shopping); await agent.aiTap(搜索框); await agent.aiType(无线耳机); await agent.aiTap(搜索按钮); // 提取商品信息 const products await agent.aiQuery(商品列表包含名称、价格、评价数量); products.forEach(product { console.log(商品${product.name}价格${product.price}); }); // 执行复杂操作序列 await agent.aiAct(将第一个商品加入购物车然后返回首页);可视化报告系统Midscene.js生成详细的操作报告位于apps/report/src/components/。报告系统包含时间轴交互、详情面板和全局悬浮预览等功能帮助开发者深入分析自动化执行过程。报告系统特性时间轴可视化清晰展示每个操作的执行顺序和耗时截图对比每个步骤前后的界面变化对比错误诊断自动标记失败步骤并提供调试建议性能分析统计模型响应时间、操作成功率等关键指标性能优化与最佳实践缓存策略优化Midscene.js提供了智能缓存机制可以显著提升重复执行的速度。在packages/core/src/中的缓存模块支持多种缓存策略// 高级缓存配置示例 const agent await createWebAgent({ useCache: true, cacheStrategy: adaptive, // 自适应缓存策略 cacheTTL: 3600, // 缓存有效期1小时 cacheValidation: screenshot-diff, // 基于截图差异的缓存验证 cacheDir: ./.midscene/cache }); // 缓存命中率监控 agent.on(cache-hit, (data) { console.log(缓存命中${data.operation}节省时间${data.timeSaved}ms); }); agent.on(cache-miss, (data) { console.log(缓存未命中${data.operation}执行时间${data.executionTime}ms); });错误处理与重试机制在实际自动化场景中网络波动、页面加载延迟等问题不可避免。Midscene.js提供了完善的错误处理机制// 自定义重试策略 async function robustAutomation(agent, task, options {}) { const { maxRetries 3, retryDelay 1000, fallbackStrategies [] } options; for (let attempt 1; attempt maxRetries; attempt) { try { console.log(尝试执行任务${task.description} (第${attempt}次)); return await task.execute(agent); } catch (error) { console.error(第${attempt}次尝试失败, error.message); if (attempt maxRetries) { // 最后一次尝试失败执行备用策略 for (const strategy of fallbackStrategies) { try { console.log(执行备用策略${strategy.name}); return await strategy.execute(agent); } catch (fallbackError) { console.error(备用策略失败, fallbackError.message); } } throw new Error(所有尝试和备用策略均失败${error.message}); } // 等待后重试 await new Promise(resolve setTimeout(resolve, retryDelay * attempt)); } } } // 使用示例 await robustAutomation(agent, { description: 登录操作, execute: async (agent) { await agent.aiTap(登录按钮); await agent.aiType(username, 用户名输入框); await agent.aiType(password, 密码输入框); await agent.aiTap(确认登录); } }, { maxRetries: 3, fallbackStrategies: [ { name: 刷新页面后重试, execute: async (agent) { await agent.refresh(); await agent.aiTap(登录按钮); // ... 其他操作 } } ] });多模型协同工作对于复杂的自动化任务可以结合多个模型的优势// 多模型协同配置 const multiModelAgent await createWebAgent({ models: { // 主模型用于常规操作 primary: { name: ui-tars, useFor: [tap, type, scroll] }, // 辅助模型用于数据提取 secondary: { name: qwen3-vl, useFor: [query, extract, analyze] }, // 备用模型主模型失败时使用 fallback: { name: gemini-3-pro, useFor: [all] } }, modelSelector: (operationType, context) { // 根据操作类型选择最合适的模型 switch (operationType) { case tap: case type: return primary; case query: case extract: return secondary; default: return primary; } } });企业级应用场景电商自动化测试电商网站通常包含复杂的交互流程和动态内容Midscene.js能够完美应对这些挑战// 电商网站端到端测试 async function ecommerceTest(agent, productName) { // 1. 首页导航 await agent.goto(https://shop.example.com); await agent.aiTap(登录入口); // 2. 用户登录 await agent.aiType(testuserexample.com, 邮箱输入框); await agent.aiType(password123, 密码输入框); await agent.aiTap(登录按钮); // 3. 商品搜索 await agent.aiTap(搜索框); await agent.aiType(productName); await agent.aiTap(搜索按钮); // 4. 商品筛选与选择 await agent.aiTap(价格筛选); await agent.aiTap(100-500元区间); await agent.aiTap(第一个商品); // 5. 购物车操作 await agent.aiTap(加入购物车); await agent.aiTap(查看购物车); // 6. 订单验证 const cartItems await agent.aiQuery(购物车商品列表包含名称、价格、数量); const totalPrice await agent.aiQuery(订单总价); return { success: cartItems.length 0, items: cartItems, total: totalPrice }; }移动应用回归测试移动应用的UI测试通常需要覆盖多种设备和分辨率Midscene.js的视觉方法使其特别适合这类场景// 移动应用多设备测试 async function mobileAppRegressionTest(appPackage, testCases) { const devices [ { id: device-1, name: Pixel 6, resolution: 1080x2400 }, { id: device-2, name: iPhone 13, resolution: 1170x2532 }, { id: device-3, name: Galaxy S22, resolution: 1080x2340 } ]; const results []; for (const device of devices) { console.log(在设备 ${device.name} 上执行测试); const agent await createAndroidAgent({ deviceId: device.id, resolution: device.resolution }); await agent.launchApp(appPackage); for (const testCase of testCases) { const startTime Date.now(); try { await testCase.execute(agent); const duration Date.now() - startTime; results.push({ device: device.name, testCase: testCase.name, status: passed, duration: duration, screenshot: await agent.captureScreenshot() }); } catch (error) { results.push({ device: device.name, testCase: testCase.name, status: failed, error: error.message, screenshot: await agent.captureScreenshot() }); } } await agent.close(); } return results; }数据采集与监控Midscene.js也可以用于自动化数据采集和系统监控// 自动化数据采集系统 class DataCollector { constructor(config) { this.agent null; this.config config; this.dataPoints []; } async initialize() { this.agent await createWebAgent({ model: this.config.model, headless: this.config.headless || true }); } async collectData(sourceUrl, extractionRules) { await this.agent.goto(sourceUrl); const collectedData {}; for (const [key, rule] of Object.entries(extractionRules)) { try { if (rule.type query) { collectedData[key] await this.agent.aiQuery(rule.prompt); } else if (rule.type extract) { collectedData[key] await this.agent.aiExtract(rule.prompt, rule.format); } else if (rule.type count) { collectedData[key] await this.agent.aiCount(rule.prompt); } } catch (error) { console.warn(提取 ${key} 失败, error.message); collectedData[key] null; } } this.dataPoints.push({ timestamp: new Date().toISOString(), source: sourceUrl, data: collectedData }); return collectedData; } async monitorWebsite(url, checkInterval 300000) { // 默认5分钟检查一次 while (true) { try { const status await this.checkWebsiteStatus(url); console.log(网站状态检查${new Date().toISOString()} - ${status}); if (status ! healthy) { await this.sendAlert(网站 ${url} 状态异常${status}); } } catch (error) { console.error(监控检查失败, error); } await new Promise(resolve setTimeout(resolve, checkInterval)); } } async checkWebsiteStatus(url) { await this.agent.goto(url); // 检查关键元素是否存在 const checks [ { element: 页面标题, expected: 包含特定关键词 }, { element: 主要导航菜单, expected: 可见且可点击 }, { element: 主要内容区域, expected: 加载完成 } ]; for (const check of checks) { const exists await this.agent.aiBoolean(${check.element} 是否存在且${check.expected}); if (!exists) { return failed_${check.element}; } } return healthy; } }集成与扩展MCP服务集成Midscene.js提供MCPModel Context Protocol服务位于packages/mcp/src/server.ts允许将原子化的AI操作暴露为MCP工具// MCP工具配置示例 const mcpTools { ui-click: { description: 点击界面上的指定元素, parameters: { elementDescription: 元素的文字描述或特征 }, execute: async (params) { return await agent.aiTap(params.elementDescription); } }, ui-type: { description: 在指定输入框中输入文本, parameters: { text: 要输入的文本, target: 目标输入框的描述 }, execute: async (params) { return await agent.aiType(params.text, params.target); } }, ui-query: { description: 从界面中查询信息, parameters: { query: 查询的自然语言描述 }, execute: async (params) { return await agent.aiQuery(params.query); } } };自定义技能开发在packages/core/src/skill/中你可以创建自定义技能来扩展Midscene.js的功能// 自定义技能表单自动填充 export class FormAutoFillSkill { constructor(agent) { this.agent agent; } async fillForm(formData) { const results []; for (const [field, value] of Object.entries(formData)) { try { // 定位表单字段 await this.agent.aiTap(field); // 清除现有内容如果有 await this.agent.clearField(); // 输入新值 await this.agent.aiType(value); results.push({ field, status: success, message: 字段 ${field} 已成功填充 }); } catch (error) { results.push({ field, status: error, message: 字段 ${field} 填充失败${error.message} }); } } return results; } async validateForm(validationRules) { const validationResults []; for (const rule of validationRules) { const isValid await this.agent.aiBoolean(rule.condition); validationResults.push({ rule: rule.description, valid: isValid, message: isValid ? 验证通过 : 验证失败 }); } return validationResults; } }性能监控与调优Midscene.js内置了性能监控功能帮助优化自动化脚本// 性能监控配置 const performanceMonitor { metrics: { modelResponseTime: [], operationSuccessRate: [], cacheHitRate: [], totalExecutionTime: [] }, startMonitoring(agent) { // 监听各种事件 agent.on(operation-start, this.recordStart.bind(this)); agent.on(operation-end, this.recordEnd.bind(this)); agent.on(model-call, this.recordModelCall.bind(this)); agent.on(cache-hit, this.recordCacheHit.bind(this)); agent.on(cache-miss, this.recordCacheMiss.bind(this)); }, recordStart(operation) { this.currentOperation { name: operation.name, startTime: Date.now() }; }, recordEnd(result) { if (this.currentOperation) { const duration Date.now() - this.currentOperation.startTime; this.metrics.operationSuccessRate.push(result.success); this.metrics.totalExecutionTime.push(duration); console.log(操作 ${this.currentOperation.name} 完成耗时${duration}ms结果${result.success ? 成功 : 失败}); } }, recordModelCall(data) { this.metrics.modelResponseTime.push(data.responseTime); }, getPerformanceReport() { return { averageModelResponseTime: this.calculateAverage(this.metrics.modelResponseTime), operationSuccessRate: this.calculateSuccessRate(this.metrics.operationSuccessRate), cacheHitRate: this.calculateCacheHitRate(), averageExecutionTime: this.calculateAverage(this.metrics.totalExecutionTime), totalOperations: this.metrics.operationSuccessRate.length }; }, calculateAverage(values) { if (values.length 0) return 0; return values.reduce((sum, val) sum val, 0) / values.length; }, calculateSuccessRate(successArray) { if (successArray.length 0) return 0; const successCount successArray.filter(s s).length; return (successCount / successArray.length) * 100; } };总结与展望Midscene.js代表了UI自动化测试的新方向——通过视觉AI技术让自动化测试更加智能、灵活和可靠。无论你是测试工程师、开发者还是自动化爱好者Midscene.js都能帮助你降低学习成本用自然语言代替复杂的定位器编写提高测试覆盖率视觉方法能够处理传统工具难以覆盖的场景加速测试开发快速原型验证和调试跨平台一致性一套代码覆盖Web、移动端和桌面应用智能错误处理AI能够理解上下文并提供更有意义的错误信息随着AI技术的不断发展视觉驱动的UI自动化将成为行业标准。Midscene.js作为这一领域的先行者不仅提供了强大的现成功能还通过开放的架构允许开发者根据具体需求进行定制和扩展。开始你的视觉自动化之旅让AI成为你的高效测试助手释放更多时间专注于创造性的工作。【免费下载链接】midsceneAI-powered, vision-driven UI automation for every platform.项目地址: https://gitcode.com/GitHub_Trending/mid/midscene创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2566662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…