dsh-vm-tester — 在虚拟机里像人一样测软件
31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yugejixian/vm-blackbox该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · vision
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 27 处,展示前 27 条)
- 读取本地文件agent/tunnel-host.js:21
const VAULT_GET = vaultScriptCandidates.find((f) => { try { return fs.existsSync(f); } catch (e) { return false; } }) || vaultScriptCandidates[0]; - 执行外部命令来自配置/变量agent/tunnel-host.js:31
const out = execFileSync(VBOX, ["list", "runningvms"], { windowsHide: true, timeout: 15000 }).toString("utf8"); - 读取本地文件agent/tunnel-host.js:54
for (const f of fs.readdirSync(SHOTS)) { - 读取本地文件agent/tunnel-host.js:57
try { if (now - fs.statSync(fp).mtimeMs > 10 * 60 * 1000) fs.unlinkSync(fp); } catch (e) { } - 执行外部命令来自配置/变量agent/tunnel-host.js:114
const p = spawn(cmd, args, { windowsHide: true }); - 执行外部命令来自配置/变量agent/tunnel-host.js:158
const p = spawn(cmd, args, { windowsHide: true }); - 写入本地文件agent/tunnel-host.js:187
fs.mkdirSync(SHOTS, { recursive: true }); - 写入本地文件agent/tunnel-host.js:188
fs.writeFileSync(ip, buf); - 读取本地文件agent/tunnel-host.js:192
return fs.readFileSync(op); - 删除本地文件agent/tunnel-host.js:197
try { fs.unlinkSync(ip); } catch (e) { } - 删除本地文件agent/tunnel-host.js:198
try { fs.unlinkSync(op); } catch (e) { } - 写入本地文件agent/tunnel-host.js:264
fs.mkdirSync(SHOTS, { recursive: true }); - 读取本地文件agent/tunnel-host.js:266
return fs.readFileSync(raw); - 删除本地文件agent/tunnel-host.js:267
} finally { try { fs.unlinkSync(raw); } catch (e) { } } - 写入本地文件agent/tunnel-host.js:271
fs.mkdirSync(SHOTS, { recursive: true }); - 读取本地文件agent/tunnel-host.js:282
const buf = fs.readFileSync(out); - 删除本地文件agent/tunnel-host.js:285
try { fs.unlinkSync(raw); } catch (e) { } - 删除本地文件agent/tunnel-host.js:286
if (!persist) { try { fs.unlinkSync(out); } catch (e) { } } - 写入本地文件agent/tunnel-host.js:522
fs.mkdirSync(SHOTS, { recursive: true }); - 写入本地文件agent/tunnel-host.js:524
fs.writeFileSync(file, buf); - 读取本地文件index.js:32
const files = readdirSync(shotsDir) - 读取本地文件index.js:37
try { t = statSync(fp).mtimeMs } catch { return null } - 删除本地文件index.js:44
try { unlinkSync(files[i].fp) } catch { } - 发起网络请求index.js:53
res = await fetch(base + path, { signal: AbortSignal.timeout(30000) }) - 发起网络请求index.js:71
res = await fetch(base + path, { - 写入本地文件index.js:344
mkdirSync(shotsDir, { recursive: true }) - 写入本地文件index.js:346
writeFileSync(path, bytes)
扫描于 2026/11/3(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 的黑盒 GUI 测试:AI 测试员只靠截图和鼠标键盘操作真实的 Windows 虚拟机。
README
由 DeepSeek 最新模型翻译生成dsh-vm-tester — 在虚拟机里像人一样测软件
给 DeepSeek Harness 用的黑盒 GUI 测试插件:AI 测试员只看屏幕、只点鼠标,判定必须由像素支撑。
Black-box GUI testing for DSH: the agent sees nothing but screenshots and drives nothing but mouse and keyboard.
为什么
AI 跑自动化测试最容易失效的地方不是「点不准」,而是它能读到日志、源码、内部状态,于是「知道」自己没错——测试就退化成了自我确认。
这个插件把测试员扔进一台真实的 Windows 虚拟机,只给它截图和键鼠:看不到日志、进程、注册表,也够不到宿主。结论只能靠像素,而像素可以被独立复核。这就是「真实」的来源。
架构
DSH 测试员 ──工具调用──▶ dsh-vm-tester ──HTTP :8890──▶ tunnel-host.js (宿主) ▲ │ 反向隧道 :8801
QaTunnel.exe (虚拟机内)
│ SendInput / GDI
▼
Windows 虚拟机(真实桌面)
虚拟机主动外连宿主,不需要给虚拟机开入站端口。
展开完整文档(README 剩余 1 节)
dsh-vm-tester — 在虚拟机里像人一样测软件
给 DeepSeek Harness 用的黑盒 GUI 测试插件:AI 测试员只看屏幕、只点鼠标,判定必须由像素支撑。
Black-box GUI testing for DSH: the agent sees nothing but screenshots and drives nothing but mouse and keyboard.
为什么
AI 跑自动化测试最容易失效的地方不是「点不准」,而是它能读到日志、源码、内部状态,于是「知道」自己没错——测试就退化成了自我确认。
这个插件把测试员扔进一台真实的 Windows 虚拟机,只给它截图和键鼠:看不到日志、进程、注册表,也够不到宿主。结论只能靠像素,而像素可以被独立复核。这就是「真实」的来源。
架构
DSH 测试员 ──工具调用──▶ dsh-vm-tester ──HTTP :8890──▶ tunnel-host.js (宿主) ▲ │ 反向隧道 :8801
QaTunnel.exe (虚拟机内)
│ SendInput / GDI
▼
Windows 虚拟机(真实桌面)
虚拟机主动外连宿主,不需要给虚拟机开入站端口。
八个工具
| 工具 | 作用 |
| vm_status | 隧道是否连通、分辨率、当前登录用户 |
| vm_screenshot | 截当前屏幕;图上带坐标标尺(每 200px 标注原生像素)和上次点击的准星 |
| vm_click(x,y) | 左键点击(原生像素坐标) |
| vm_type(text) | 往当前焦点输入文本(支持中文,Unicode 注入) |
| vm_type_secret(name) | 从宿主凭据库注入密码/令牌,明文不进模型上下文;注入后相关区域自动遮蔽 |
| vm_key(combo) | 按一个键或组合键:enter / esc / win+r / ctrl+a … |
| vm_key_basic(key) | 只允许普通键(给「只会回车的普通用户」挡位用,防止它用快捷键作弊) |
| vm_wait(ms) | 等待 |
快速开始
第一次用?直接看 docs/QUICKSTART.md —— 保姆级流程,从装插件到第一次截图点击,含常见问题排查表。
安装
方式一:从 npm 安装(推荐)
dsh plugin add dsh-vm-tester
方式二:从 Releases 页面下载 .tgz 后安装(不写死版本)下载页:https://github.com/yugejixian/vm-blackbox/releases
dsh plugin add C:\path\to\dsh-vm-tester-x.y.z.tgz
方式三:从本仓库安装
dsh plugin add github:yugejixian/vm-blackbox
装完只是遥控器,还不能用:虚拟机、访客代理、宿主隧道三者缺一不可。
完整步骤见 docs/QUICKSTART.md。若你的安装方式拿不到 agent/ 目录(较早的 npm 版本),请改用 dsh plugin add github:yugejixian/vm-blackbox,它包含全部脚本。
如果你的配置档里已经手工插入过同样 id: vm-tester 的 patch 行,必须先删掉,否则会重复加载同一插件导致启动失败。
依赖:光装插件不够
插件只是「遥控器」,虚拟机侧还要三样东西(体积与平台相关,不在 npm 包里):
1. VirtualBox 7.x + 一台 Windows 虚拟机(推荐中文镜像);
2. QaTunnel.exe(agent/):跑在虚拟机内、开机自启,反向连宿主 8801,负责截屏(含坐标标尺)与 SendInput;
3. tunnel-host.js(agent/):跑在宿主的 Node 服务,监听 8801 并把能力摊成 8890 的 HTTP 接口。
一键建虚拟机脚本 scripts/build-vm.ps1,完整部署与踩坑记录见 docs/handoff.md。
配置
- id: vm-tester
name: 'dsh-vm-tester'
config:
tunnelUrl: 'http://127.0.0.1:8890' # tunnel-host.js 的 HTTP 地址 shotsDir: 'C:\Users\你\Pictures\vmshots' # 截图落盘目录(留空则用默认值)
仓库结构
| 目录 | 内容 |
| 根目录 | npm 包本身:index.js、package.json、cordis.patch.yml、locale/、icon.svg |
| agent/ | 虚拟机内代理、宿主隧道、标定工具 |
| scripts/ | 建虚拟机、窗口/无窗口切换、运行体检、截图清理、桌面围观小窗 |
| cases/ | 九条示例用例(记事本/计算器/安装/取消/卸载/游戏/资源管理器/浏览器/安全登录) |
| CHANGELOG.md | 版本变更记录 |
| docs/ | 部署交接、打包清单、发布检查表 |
| examples/ | 测试员提示词模板、执行报告模板 |
安全边界
- 测试员只能操作虚拟机;插件不提供任何宿主文件、命令、网络能力。
- 建议配合工具白名单把每个挡位的工具锁死(vm-naive 拿 4–5 个,vm-smart 拿 5 个)。
- 虚拟机里请用独立账号,建议关闭 UAC 提权提示(否则合成输入进不了安全桌面),并关掉防火墙拦截通知。
凭据与敏感信息(重要)
观察是基于截图的,测登录类场景必须按下面的方式做:
1. 虚拟机里绝不放假凭据:只用一次性测试账号,测完禁用;
2. 密码走凭据库:宿主侧 scripts/vault-set.ps1 -Name <名字>(DPAPI 加密),测试员用
vm_type_secret("<名字>") 注入 —— 明文永远不进模型上下文;
3. 自动遮蔽:注入后代理把焦点控件与窗口标题栏涂黑 180 秒(宿主抓帧路径同样遮),也可以用 vm_screenshot(mask=[{x,y,w,h}]) 手动指定区域(OTP 框、token 栏等);
4. 不要对密码框 / OTP / 带 token 的地址栏截图,需要验证就截提交后的页面。
残留风险(长度泄漏、应用自身回显、窗口移动后遮罩失准)见 docs/handoff.md 的「敏感数据与登录场景」。
已知限制(都是实测的)
| 限制 | 说明 |
| 帧率约 1 帧/秒 | 每次截图起一次抓屏,够看清操作,不是视频 |
| 只有左键 | 没有右键菜单;需要用应用本身的命令栏按钮 |
| 合成双击对 .exe/.lnk 无效 | 打开项目请用「单击选中 + Enter」 |
| 界面重排会毁掉旧坐标 | 例如 Windows 计算器显示表达式行时按钮下移;每次点击前重新截图 |
| 提权窗口 | 代理需以「计划任务 + 最高权限 + 交互式」运行,否则 UIPI 会丢弃输入 |
| 部分 3D 应用抓不到画面 | GDI 抓屏遇 D3D 交换链会超时;桌面类应用稳定 |
许可与免责
MIT,见 LICENSE。
使用前请阅读 DISCLAIMER.md:软件许可、终端用户协议(EULA)、隐私与合规责任由使用者自行承担。本仓库不含任何操作系统镜像、商业软件或游戏资源。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
yugejixian/vm-blackbox
dsh-vm-tester — 在虚拟机里像人一样测软件
相关插件 · 视觉能力
智能体工作台Devin-AXIS/iPolloWork
企业级、本地优先的智能体工作台,面向个人和智能体团队——一个工作区,容纳多个智能体引擎;一套统一体系,管理插件和技能;支…
★ 7,364已汉化DSH
72
开源设计工作台nexu-io/open-design
OpenDesign:首个协作式 AI 设计智能体工作区
★ 105,709已汉化DSH
71.8
GPT 图像提示词库freestylefly/awesome-gpt-image-2
Prompt as Code | GPT Image 2 / 2.5 提示词与案例库,530+ 个案例、20+…
★ 34,534已汉化DSH
71.5
多智能体编码工作区spacering-net/codeg
多智能体协作的 AI 编程工作区:汇总 Claude Code、Codex、OpenCode、Pi、Grok Build 等来源的会话。支持桌面应用、自托管服务器或 Docker。
★ 4,319已汉化DSH
71.5
AI 用量桌面小部件Javis603/token-monitor
EN | 简 | 繁 | KO | JA | PT
★ 3,533已汉化DSH
71.1
架构图生成器tt-a1i/archify
把你想理解、规划或分享的事,变成可以互动的可视化作品。
★ 93,105已汉化DSH
71.1
这是你的仓库?认领条目