Qwen3vl+Midscene+Playwright自动化AI测试框架搭建流程(win11本地安装)

发布时间:2026/8/26 12:14:15

Qwen3vl+Midscene+Playwright自动化AI测试框架搭建流程(win11本地安装)
一、环境准备Windows 11其他 Windows 版本同理安装Node.jsv20不建议使用18及以下版本安装npm20及以后的node.js正常已经集成了npm二、项目初始化在Windows系统中创建项目根目录如D:/Midscene并初始化新建Midscene根目录如D:/Midscene 进入Midscene根目录中打开命令行执行初始化命令npm init -y三、安装核心依赖在Midscene根目录中打开命令行执行以下安装命令npm install playwright/test midscene/web playwright npm install node-autoit-koffi dotenv npx playwright install chromium其中node-autoit-koffi插件用于操作弹框等特殊控件需要同步下载客户端工具autoit-v3解压到Midscene根目录下即可四、配置 Playwright创建playwright.config.js在调试阶段建议把报告中的截图、视频和异常信息都设为开启后续跑成熟了可以改为失败后展示javascript// playwright.config.js const { defineConfig } require(playwright/test); module.exports defineConfig({ testDir: ./testcase, timeout: 1800000, // 超时时间默认为30分钟 retries: 0, use: { headless: false, launchOptions: { args: [ --start-maximized, // 启动时最大化窗口 --disable-featuresExternalProtocolDialog,// 关闭外部协议弹窗 --disable-infobars, // 禁用“Chrome 正受到自动化测试软件控制”的提示栏 --disable-notifications, // 禁用网页通知弹窗 --disable-popup-blocking, // 禁用弹出窗口拦截 ], }, viewport: null, screenshot: always,// only-on-failure 仅在失败时截图 video: always,// retain-on-failure 仅在失败时保留视频 trace: on, // on-first-retry 仅在第一次重试时启用跟踪 }, reporter: [ [html, { outputFolder: playwright-report }], [line], ], });五、配置环境变量Qwen3-VL 模型在项目根目录创建.env文件建议把MIDSCENE_MODEL_TEMPERATURE随机性调低避免AI天马行空的乱思考# 阿里云线上模型地址 MIDSCENE_MODEL_BASE_URLhttps://dashscope.aliyuncs.com/compatible-mode/v1 MIDSCENE_MODEL_API_KEYsk-xxxxxxx MIDSCENE_MODEL_NAMEqwen3-vl-plus MIDSCENE_MODEL_FAMILYqwen3-vl MIDSCENE_USE_QWEN_VL1 MIDSCENE_PLANNING_MAX_ATTEMPTS1 # 调整模型参数最大token数、降低随机性、重试间隔时间 MIDSCENE_MODEL_MAX_TOKENS4096 MIDSCENE_MODEL_TEMPERATURE0.1 MIDSCENE_MODEL_RETRY_INTERVAL10000 # 测试地址信息 TEST_BASE_URLhttps://www.abc.com/login #登录地址 TEST_USERNAMEabcdef TEST_PASSWORDAbc111六、编写钉钉登录、日期处理等辅助工具类Midscene根目录下创建utils文件夹新建autoLoginDingtalk.js、date.js两个工具类其中autoLoginDingtalk.js用于弹框识别和操作// utils/autoLoginDingtalk.js import * as autoit from node-autoit-koffi; async function autoLoginDingtalk({ page, agent, data }) { await agent.aiAct(点击页面右侧登录区域中的【点击图标直接登录】文字页面跳转到认证页); await page.waitForTimeout(3000); await agent.aiAct(点击认证页中位于二维码右侧的用户头像); await page.waitForTimeout(3000); await autoit.init(); // 等待【登录弹窗】出现前端类匹配 const authCheckDialog await autoit.winGetHandle([CLASS:CUICef2ProjectWnd]); if (!authCheckDialog) { throw new Error(未检测到钉钉登录弹窗); } // 激活窗口状态设为1正常显示并等待窗口稳定 await autoit.winSetStateByHandle(authCheckDialog, 5); await autoit.sleep(500); // 等待窗口稳定 const ctrlHandle await autoit.controlGetHandle(authCheckDialog, [CLASS:Chrome_RenderWidgetHostHWND; INSTANCE:1]); console.log(✅ 获取到钉钉登录弹框句柄: ctrlHandle); await autoit.controlClickByHandle(authCheckDialog, ctrlHandle, left, 1, 200, 320); await autoit.sleep(500); console.log(✅ 已点击【登录】按钮); await page.waitForTimeout(6000); } module.exports { autoLoginDingtalk };注需要通过之前下载的autoit-v3工具包中的Au3Info_x64.exe程序点击finder tool拖拽到需要探查的按钮上即可获取定位信息用于winGetHandle、controlGetHandle、controlClickByHandle方法入参。date.js用于生成日、周、月、年等格式信息// utils/date.js function formatDate(date, format YYYY-MM-DD) { const year date.getFullYear(); const month String(date.getMonth() 1).padStart(2, 0); const day String(date.getDate()).padStart(2, 0); const week String(getWeekNumber(date)).padStart(2, 0); switch (format) { case YYYY-MM-DD: return ${year}-${month}-${day}; case YYYY-WW: return ${year}-${week}; case YYYY-MM: return ${year}-${month}; case YYYY: return ${year}; default: return ${year}-${month}-${day}; } } function getWeekNumber(date new Date()) { const d new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); const dayNum d.getUTCDay() || 7; d.setUTCDate(d.getUTCDate() 4 - dayNum); const yearStart new Date(Date.UTC(d.getUTCFullYear(), 0, 1)); return Math.ceil((((d - yearStart) / 86400000) 1) / 7); } module.exports { formatDate };工具类可以根据需要自行修改或新增并在测试用例文件中通过如下方式引入const{formatDate}require(../utils/date.js);const{autoLoginDingtalk}require(../utils/autoLoginDingtalk.js);七、编写第一个测试用例Midscene根目录下创建testcase文件夹新建test001.spec.js注意这里调用的是本地浏览器进而可以比较真实的模拟本机上的浏览器的配置如果确实需要调用playwright安装时自带的chromium直接去掉下方代码注释中写明了用于本地 Chrome的配置项// testcase/test001.spec.js import { test } from playwright/test; import { chromium } from playwright; import { PlaywrightAgent } from midscene/web/playwright; import dotenv/config; import path from path; import { log } from console; const { formatDate } require(../utils/date.js); const { autoLoginDingtalk } require(../utils/autoLoginDingtalk.js); const loginUsername process.env.TEST_USERNAME; const loginPassword process.env.TEST_PASSWORD; const baseURL process.env.TEST_BASE_URL; const testDataList [ // { // name: UI自动化-生产指标分析-集团-月度-对比分析, // OrgLevel: 集团, // dateType: 月, // analysisType: 对比分析, // }, { name: UI自动化-生产指标分析-集团-周度-对比分析, OrgLevel: 集团, dateType: 周, analysisType: 对比分析, } ]; test.describe(UI自动化-生产指标分析-001, () { let agent; let context; // 保存 persistent context let page; // 保存手动创建的 page test.beforeEach(async () { // 使用项目下的独立目录确保没有被其他 Chrome 占用 const userDataDir path.join(process.cwd(), chrome-profile-test); // 2. 启动持久化上下文直接使用本地安装的 Chrome context await chromium.launchPersistentContext(userDataDir, { headless: false, channel: chrome, // 关键使用本地 Chrome而不是 Playwright 自带的 Chromium args: [ --start-maximized, // 启动时最大化窗口 --disable-featuresExternalProtocolDialog, // 禁用外部协议弹窗 --disable-infobars, --disable-notifications, --disable-external-protocol-handling, ], }); // 3. 获取或创建页面 page context.pages()[0] || await context.newPage(); await page.goto(baseURL); // 4. 创建 Midscene Agent传入手动创建的 page agent new PlaywrightAgent(page, { waitForNetworkIdleTimeout: 10000, cache: { strategy: read-write, id: pre-establish-cache }, }); }); test.afterEach(async () { if (agent) await agent.destroy(); if (context) await context.close(); // 关闭持久化上下文 }); testDataList.forEach((data) { test(data.name, async () { console.info(data.name - 测试开始); await autoLoginDingtalk({ page,agent, data }); await agent.aiAct(鼠标悬停在【XX】菜单上); await page.waitForTimeout(2000); await agent.aiAct(在弹出的下拉菜单中点击【生产指标分析】); await page.waitForTimeout(2000); await agent.aiAct(鼠标悬停在【XX】菜单下方的【XX】子菜单上); await page.waitForTimeout(2000); await agent.aiAct(在弹出菜单中点击第1列的第3个菜单【XX】); await page.waitForTimeout(5000); await agent.aiAssert(检查左侧架构树【XX】单选框默认选中【XX】当前架构为【XX】); const day formatDate(new Date(), YYYY-MM-DD); const week formatDate(new Date(), YYYY-WW); const month formatDate(new Date(), YYYY-MM); log(当前日期, day, 当前周, week, 当前月, month); await agent.aiAssert(检查右侧图表区域顶部控件从左到右依次为日周月选项卡默认为日、时间选择器默认为 day 的前一天、下拉菜单1默认为三天平均下拉菜单2默认为全部、其他筛选); log(顶部控件验证通过); await agent.aiAssert(检查第1幅图表左上角标题为【XX】); log(第1幅图表验证通过); switch (data.dateType) { case 日: await agent.aiAct(切换【日周月选项卡】的时间格式为日并在右侧【时间选择器】上选择起止时间均为day日的前一天); break; case 周: await agent.aiAct(切换【日周月选项卡】的时间格式为周并在右侧【时间选择器】上选择起止时间均为week周的前一周); break; case 月: await agent.aiAct(切换【日周月选项卡】的时间格式为月并在右侧【时间选择器】上选择起止时间均为month月的前一月); break; } console.info(data.name - 测试通过); }); }); });截止到这一步项目整体目录和文件已经全部创建完成结构如下图所示框里的是主体文件八、运行测试在根目录下打开命令行执行npx playwright test test001.spec.js如果一切配置正确的话命令行会输出部分日志如下Running 2 tests using 1 worker UI自动化-生产指标分析001 - 测试开始 ✅ 获取到钉钉登录弹框句柄: 1444844 ✅ 已点击【登录】按钮 当前日期 2026-06-24 当前周 2026-26 当前月 2026-06 顶部控件验证通过 第1幅图表验证通过 UI自动化-生产指标分析001 - 测试通过UI自动化-生产指标分析002 - 测试开始 ✅ 获取到钉钉登录弹框句柄: 6885268 ✅ 已点击【登录】按钮 当前日期 2026-06-24 当前周 2026-26 当前月 2026-06 顶部控件验证通过 第1幅图表验证通过 UI自动化-生产指标分析-002- 测试通过2 passed (4.5m)To open last HTML report run:npx playwright show-report九、测试报告测试报告在测试完成后由playwright自动生成并打开html格式文档10、运行成本优化1、Midscene 自带 AI 缓存可在配置文件中开启2、大模型云端添加 Prompt Caching

相关新闻

想提升企业资源管理效能?ERP系统优化是关键!

想提升企业资源管理效能?ERP系统优化是关键!

2026/8/26 12:29:57

一、引言在当今竞争激烈的商业环境中,企业要想取得成功,高效的资源管理至关重要。ERP系统作为企业资源管理的核心工具,其优化对于提升企业的竞争力具有重要意义。本文将探讨ERP系统优化的关键方面,帮助企业全方位提升资源管理效能…

工业级传感器控制系统核心组件与设计实践

工业级传感器控制系统核心组件与设计实践

2026/8/26 6:53:25

1. 工业级传感器控制系统的核心组件解析在工业自动化和嵌入式控制领域,构建一个稳定可靠的传感器/执行器控制系统需要精心选择每个关键组件。AD74115H、ADP1034和PIC32MX675F512L这三款芯片的组合,恰好形成了一个从信号采集到逻辑处理再到电源管理的完整…

为什么企业已经有了客户洞察,却依然无法形成稳定商机闭环?

为什么企业已经有了客户洞察,却依然无法形成稳定商机闭环?

2026/8/23 21:53:48

在复杂ToB出海业务中,一个越来越普遍的现象正在出现:企业已经具备了一定程度的客户洞察能力,甚至能够通过数据、市场报告或AI工具识别潜在客户与需求信号,但最终在商机转化上依然效果不稳定。问题并不在于“有没有客户信息”&…

UCS654 - Lab-2 考试二分类预测

UCS654 - Lab-2 考试二分类预测

2026/8/26 14:06:30

在机器学习领域,二分类问题广泛应用于各类实际任务中,诸如信贷评分、疾病预测等。UCS654 - Lab-2 Exam (Kaggle Hack) 竞赛正是聚焦于这一类型的任务,旨在通过数据科学方法来预测目标变量的值(0或1)。参赛者需根据训练数据集构建模型,并在测试集上进行预测,通过准确率这…

时间序列分析与模型优化厄瓜多尔零售商销售预测

时间序列分析与模型优化厄瓜多尔零售商销售预测

2026/8/26 14:06:30

在零售行业中,销售预测对库存管理、需求规划及客户满意度至关重要。通过时间序列预测技术,零售商能够对未来的销售趋势进行有效预测,从而优化商品的供应链管理。特别是在面对促销、季节性波动等复杂因素时,精准的销售预测不仅能减少过剩库存,还能降低食品浪费。 本文将详…

USB驱动异常怎么排查?看懂错误代码,用这几种方法让设备恢复正常

USB驱动异常怎么排查?看懂错误代码,用这几种方法让设备恢复正常

2026/8/26 14:06:30

朋友新买的U盘插上电脑,指示灯亮了,熟悉的“叮咚”声也跳了出来,可资源管理器里就是死活不出现盘符。更气人的是,原来好好的无线鼠标也跟着凑热闹,光标一顿一顿地跳舞,设备管理器里挂起了一串黄色叹号。他又…

巴别鸟智巢AI知识库与自动化任务引擎实战

巴别鸟智巢AI知识库与自动化任务引擎实战

2026/8/26 14:06:30

巴别鸟智巢AI知识库与自动化任务引擎实战 在企业级文件管理场景中,光有存储已经远远不够。如何让文件在团队协作中流动起来、如何让历史积累的知识真正被复用,才是现代云盘产品的核心命题。巴别鸟在这方面的解题思路中,有两个功能模块对开发者…

构建机器学习模型识别图像AI生成内容的检测

构建机器学习模型识别图像AI生成内容的检测

2026/8/26 14:06:30

随着生成式AI技术的飞速发展,AI生成的图像越来越逼真,以至于人眼难以分辨其真伪。在这种背景下,如何有效地识别真假图像,尤其是在深度伪造(Deepfake)技术的应用下,成为了当前亟待解决的技术难题。该问题不仅在媒体行业产生了巨大影响,同时也在网络安全、公众信任等多个…

苹果设备管理为什么更依赖官方框架?从设备归属到策略管理的完整解析

苹果设备管理为什么更依赖官方框架?从设备归属到策略管理的完整解析

2026/8/26 13:56:29

在移动设备管理领域,有一个问题经常被客户问到:“苹果手机到底怎样管理才稳定?”这个问题看似简单,但实际上涉及设备归属、系统能力、企业管理流程以及长期运营维护等多个方面。很多企业刚开始接触设备管理时,关注点往…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/26 1:49:16

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/24 21:16:09

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

2026/8/26 0:05:45

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

Hermes接入团队协作后,我推翻了三个效率假设

Hermes接入团队协作后,我推翻了三个效率假设

2026/8/26 0:05:45

聊《Hermes真能提效吗?先看流程里最慢的那一步》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要团队把 Hermes 接进项目三个月后,交付速度没有提升反而慢了。复盘后发现,最先…

免费AI大模型调教指南:打造专属网文写作助手

免费AI大模型调教指南:打造专属网文写作助手

2026/8/26 0:05:45

1. 先搞清楚“AI小说扩展模式”到底能帮你做什么如果你是一个刚开始写网文、或者卡在L3级别以下的作者,最头疼的可能是情节推进不下去、人物对话干瘪,或者世界观设定不够丰满。自己对着空白文档硬憋,效率很低。这时候,一个能理解你…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…