dsh-selenium-test
已验证@wjx-ai/dsh-selenium-test · v0.1.8 · MIT
DSH(DeepSeek Harness)Selenium 浏览器自动化测试工具插件:注册 selenium_test 工具,通过真实浏览器对网页执行点击/输入/截图/等待/断言/跳转/执行 JS 等操作并返回每步结果与截图路径。
安装
dsh plugin add @wjx-ai/dsh-selenium-test 用 dsh --profile default --dump-config 确认 layer 已生效 —— 参见安装指南。
源码
标签
说明文档
@wjx-ai/dsh-selenium-test
DeepSeek Harness(DSH)Selenium 浏览器自动化测试工具插件 —— 为 DSH 提供一个可直接调用的
selenium_test工具,输入页面 URL 与操作列表,通过真实浏览器按顺序执行测试并返回每步结果与截图路径。
简介
@wjx-ai/dsh-selenium-test 是 DSH 的一个 Host 侧工具插件。它以 Cordis 插件的形式注册一个动态工具
selenium_test,用真实 Chrome 浏览器对目标网页执行自动化测试。
- 输入页面 URL 和操作列表(点击 / 输入 / 截图 / 等待 / 断言 / 跳转 / 执行 JS)。
- 逐条记录并返回每一步是否成功,失败即终止并给出原因。
- 截图保存到本地(默认临时目录,可指定路径),并在结果中返回截图路径。
- 适用场景:让 Agent 打开某个页面,检查元素/文案、填写表单、验证行为、截图取证等。
特性
- 零配置上手:装好后即可用,Python 脚本随包分发、由
__dirname定位,无机器绝对路径。 - 真实浏览器:基于 Selenium
webdriver+webdriver-manager,自动拉取匹配的 chromedriver。 - 失败降级保护:插件注册全程
try/catch,即使脚本或服务异常也不会拖垮 DSH 启动。 - 清晰结果:每步独立记录
ok/error,整体success;缺依赖/缺参数都会返回可读错误。
环境要求
| 依赖 | 说明 |
|---|---|
| DSH(DeepSeek Harness) | 提供 tools / subprocess Service,并负责按 cordis:include 加载插件 |
| Node.js | 运行本插件 >= 18(ESM) |
| Python 3 | 用于驱动脚本;脚本惰性导入 Selenium,缺依赖会返回可读错误 |
| Google Chrome | 本机安装的 Chrome,供 webdriver-manager 驱动 |
| Python 三方包 | pip install selenium webdriver-manager |
安装
dsh plugin --profile web add @wjx-ai/dsh-selenium-test
或从 GitHub 直接安装:
dsh plugin --profile web add github:wjx-ai/dsh-selenium-test
dsh plugin add 会把包装进 profile 并自动激活(包内 cordis.patch.yml 会插入 selenium-test 条目),然后 dsh web 重启生效,启动日志出现 [selenium-test] registered selenium_test tool 即成功。
使用
装好并重启后,直接让 Agent 调用 selenium_test 工具对指定页面执行浏览器自动化测试即可。
变更记录
v0.1.8(2026-09-16)—— 中文编码修复(需重启 DSH 生效)
修复的真实缺陷:Windows 上 Python 的 stdout 默认编码是 cp936(GBK)。插件用
print(json.dumps(result, ensure_ascii=False)) 输出含中文的结果时,写出的是 GBK 字节,
而 JS 侧按 UTF-8 读取 → 结果里所有中文(标题、步骤返回值、断言文本、console_errors)
全部乱码,且输出本身不是合法 UTF-8;若文本含 GBK 编不了的字(emoji、生僻字),更会直接
UnicodeEncodeError 让脚本崩掉、返回“脚本无输出”。
修复:
- JS 侧:以
python -X utf8启动脚本,强制 Python 进入 UTF-8 模式。 - 脚本侧:
_force_utf8_stdio()对 stdin/stdout/stderr 执行reconfigure(encoding="utf-8")兜底。 assert改为浏览器端 ASCII 安全判定:期望值先经json.dumps(..., ensure_ascii=True)转义为纯 ASCII(中文 →\uXXXX)再拼进下发的脚本,因此发给 ChromeDriver 的请求体永远是纯 ASCII, 从根本上规避多字节字符导致的missing command parameters;判断在浏览器里用indexOf完成, 回程只传true/false,断言的是document.body.innerText(活 DOM,即真实渲染内容,非状态码)。 新增可选selector:把断言范围限定到某个元素。
结论:脚本源与断言期望值里可以直接写中文,无需再手工 \u 转义。
回归测试:新增 test/encoding.mjs —— Tier 1(默认,无需 Chrome)验证 stdout 为合法 UTF-8 且中文完好;
Tier 2(DSH_SELENIUM_TEST_E2E=1)在真实 Chrome 里跑「中文 eval + 中文断言」。npm test 已接入 Tier 1。
v0.1.7(2026-07-08)—— SPA 健壮性升级(需重启 DSH 生效)
lib/selenium_test.py 新增/增强(向后兼容,旧调用不受影响):
execute_async_script动作:正确 await JS Promise(cb约定绑定末位 callback;同步execute_script不会等 Promise)。settle动作:JS 睡眠 + DOM-ready 探测,吸收「点击后异步渲染未完成」竞态(ms参数,默认 1000)。_send就绪探测 + 重试:page_load_strategy=none时导航未落定的瞬态invalid argument自动小步重试,不再整轮崩。assert活 DOM +poll:默认查document.body.innerText(覆盖 JS 渲染)并按poll秒轮询,SPA 异步渲染可断言;仍保留page_source兜底。console_errors采集:注入window.__dshErrs+driver.get_log('browser'),结果回带(collect_console开关,默认 true)。- 避免重复
driver.get:首动作是navigate时不再预导航。 script_timeout选项:含setTimeout的异步脚本须设足够大,否则报script timeout(默认 0=用 ChromeDriver 30s)。
配套 lib/index.js:schema 暴露 execute_async_script / settle / poll / ms / implicitly_wait / collect_console / script_timeout,输出与渲染回带 console_errors。
验证:py_compile ✓、node --check ✓、test/smoke.mjs ✓;静态 SPA 页 e2e(异步等待/活 DOM 断言/中文/控制台错误)全绿;万象 /wanxiang 全量点击(登录→8 选项卡→辨证→五运四块断言)console_errors=[] 跑通。
正在运行的 DSH 实例要用本升级,须重启一次(插件在启动时注册;工具描述与 schema 亦随之更新)。
免责声明
本插件仅用于技术学习与合法内容整理。自动化测试请遵守目标站点条款与相关法律法规,勿用于侵权、绕过风控或商业滥用; 因使用本插件产生的一切后果由使用者自行承担。