用 dsh-playwright-browser 给 DeepSeek Harness 接上 Playwright 浏览器

前言

DeepSeek Harness(以下简称 DSH)把模型、工具、会话和 UI 都做成插件,官方口号是「一切皆插件」。开发者预览版里,智能体已经能读写文件、跑 Shell、做普通网页抓取,但这些还不够覆盖一类很常见的任务:打开真实浏览器、读渲染后的页面、点按钮、填表单、在多个标签页之间切换。

内置的 HTTP 抓取只能拿到静态响应。页面如果依赖 JavaScript 渲染,或者操作必须发生在浏览器里(登录后的后台、多步表单、需要等待加载的列表),智能体就需要一个持久的浏览器控制器,而不是一次性的 curl。社区里已经出现多款 Playwright 插件,本文介绍的是 Clizo1209 维护的 dsh-playwright-browser:它把 10 个 browser_* 工具注册进 DSH 工具表,用语义定位驱动页面,而不是让模型去猜一长串 CSS。

需要先说明两点。第一,DSH 目前仍是开发者预览,插件作者写明已针对 0.1.0-rc.6 包系列做过测试,后续核心 API 仍可能不兼容。第二,DeepSeek Harness 插件库是社区目录站点,和 DeepSeek / 幻方没有官方从属关系,不要把它当成官方应用商店。

这是什么

dsh-playwright-browser 是一款面向 DSH 的 Playwright 浏览器自动化插件,由 GitHub 用户 Clizo1209 维护,仓库地址为 Clizo1209/dsh-playwright-browser。目录页把它归在「界面增强」,许可证为 MIT,主要语言是 TypeScript。npm 上当前发布版本是 0.1.3(2026-08-14),GitHub 仓库当前 8 星。

它解决的问题可以概括成一句话:给 DSH 智能体一个可复用的浏览器上下文,让它用 accessibility 快照和语义定位去操作页面,而不是把整页 DOM 塞进上下文,也不提供任意 JavaScript eval

README 写明:行为设计参考了 Codex Browser 技能,但不包含 Codex 运行时代码,也不依赖 OpenAI 的浏览器绑定。项目文档 docs/CODEX_BROWSER_DESIGN.md 把这一点写得很清楚——只映射「持久绑定、显式标签页、语义点击、事后再观察」这类交互原则,浏览器进程由插件自己用 Playwright 拉起。

核心功能

十个原生 browser_* 工具

插件向 DSH 工具注册表挂上 10 个模型可调用工具,名称和职责以仓库 README 为准:

工具 作用
browser_open 打开标签页,可同时导航到 URL
browser_navigate 在已有标签页里导航
browser_snapshot 读取有长度上限的 accessibility 或可见文本快照
browser_click 点击语义目标
browser_fill 替换输入框内容,可选按 Enter
browser_press 发送 Playwright 键盘按键
browser_wait 等待目标、URL 或加载状态
browser_history 后退、前进或刷新
browser_screenshot 保存 PNG,返回绝对路径
browser_tabs 列出、选择或关闭标签页

架构文档把调用链写得很短:profile 的 cordis.patch.yml 挂上插件入口,入口再往工具表和系统提示词里各贡献一块,真正驱动浏览器的是内部的 BrowserController。控制器按需启动浏览器,标签页用单调递增的 tab-N 作为稳定 ID。

语义定位,CSS 只作退路

页面交互优先用语义字符串,而不是让模型拼选择器。README 给出的推荐格式如下:

role=button|保存
button|保存
label=邮箱
placeholder=搜索
text=设置
testid=submit
css=#legacy-button

role=button|保存 和快照友好的简写 button|保存 是同一类定位。CHANGELOG 里 0.1.3 专门加了这种 | 简写,原因是实测里智能体经常从 accessibility 快照里直接抄出 textbox|Name 这种写法,旧版解析失败。CSS 仍然可用,但文档把它标成兼容出口。

每次打开、导航或改页面之后,工具会返回一份新的、有长度上限的快照(默认最多 40000 字符)。系统提示词要求智能体把页面内容当成不可信数据,先观察再动手,动手后再观察一遍。

懒启动、回退浏览器、统一清理

浏览器不是插件一加载就启动。第一次真正调用浏览器工具时,控制器才会按配置拉起进程。未指定 channel / executablePath 时,Chromium 的尝试顺序是:

  1. Playwright 管理的 Chromium
  2. 本机已安装的 Google Chrome
  3. 本机已安装的 Microsoft Edge

显式配置的 channelexecutablePath 优先。Firefox 和 WebKit 需要对应的 Playwright 浏览器,或给出可执行文件路径。Playwright Chromium 可以用下面这条命令安装:

npx playwright install chromium

Cordis 卸载插件时会关掉页面、上下文和浏览器进程。关闭某个标签页时,会协作式取消该页上尚未完成的操作。插件声明不提供任意页面 JavaScript 求值,这是和部分社区浏览器插件的明显差别。

安装与启用

社区目录页给出的安装命令是:

dsh plugin add github:Clizo1209/dsh-playwright-browser

这条命令以目录页原文为准。dsh CLI 会从 GitHub 解析插件并装进当前配置。若需要可复现安装,目录页建议固定 commit 哈希:

dsh plugin add github:Clizo1209/dsh-playwright-browser#commit

commit 换成实际哈希即可。

仓库 README 另外提供了 npm 安装方式,适合已经指定 profile 的场景。当前包名与版本为 dsh-playwright-browser@0.1.3

dsh plugin --profile web add dsh-playwright-browser

从源码目录打包再装:

npm install
npm pack
dsh plugin --profile web add ./dsh-playwright-browser-0.1.3.tgz

无界面 profile 可以把 web 换成 headless。装完后可以用下面的命令检查组合配置,不必真正启动会话:

dsh --profile web --dump-config

Git 安装会跑包里的 prepare 脚本(即 TypeScript 构建)。README 提醒:pnpm 10 及以上可能要在该 profile 的 pnpm-workspace.yaml 里明确允许这次构建;预编译的 npm 包或 tarball 不需要在 profile 里再编一遍源码。

环境要求也写在 README 里:Node.js ^22.19.0>=24.0.0,以及一个可用的 DSH profile。浏览器三选一即可:Playwright Chromium、系统 Chrome / Edge,或配置 executablePath

目录页和插件安全说明都强调:插件以当前 dsh 进程的权限运行,安装时可能执行代码。 安装前应检查源代码仓库和许可证。

配置与用法

DSH 会在已安装的 bundle 补丁之后再应用用户覆盖。把类似下面的一行加进该 profile 的 cordis.patch.yml(仓库 examples/cordis.patch.yml 与 README 一致):

- id: playwright-browser
  config:
    browser: chromium
    channel: chrome
    headless: true
    viewportWidth: 1440
    viewportHeight: 900
    screenshotDir: .dsh-browser/screenshots

README 列出的配置项如下(未写出的项沿用默认值):

配置项 默认值 用途
browser chromium chromiumfirefoxwebkit
headless true 是否无头运行
channel chromemsedge 等 Chromium channel
executablePath 浏览器可执行文件的绝对路径
userDataDir 给智能体专用的持久化目录
viewportWidth 1280 视口宽度
viewportHeight 800 视口高度
actionTimeoutMs 15000 定位和操作超时
navigationTimeoutMs 30000 导航超时
maxSnapshotChars 40000 快照最大字符数
screenshotDir .dsh-browser/screenshots 截图目录

不要把 userDataDir 指到自己日常使用的浏览器配置目录。文档要求使用智能体专用目录;插件也不会去翻个人浏览器的 cookie、密码或扩展状态。

装好之后,这些工具会进入当前会话的工具表,由模型按任务调用,而不是你在终端里一条条敲 browser_click。一条符合文档设计的操作顺序是:

  1. browser_open 打开页面(或 browser_navigate 跳转到已有标签)
  2. 阅读返回的快照,确认可见控件
  3. role= / label= / text= 等形式 browser_clickbrowser_fill
  4. 需要时 browser_wait,或 browser_screenshot 留证
  5. 多页面任务用 browser_tabs 切换,用完再关闭

截图会写成本地 PNG,工具返回绝对路径。DSH 各条模型路由对图片附件的支持不一样,调用方可以把这条路径交给已有的读图工具。

适用场景与注意事项

适合在 DSH 里做这类工作的人:要让智能体操作 JavaScript 渲染后的页面、走多步表单、在多个标签间对照信息,或者需要截图作为操作证据。它不是完整的网页安全沙箱。架构文档写得很直接:这是浏览器自动化,运维仍要按自己的环境加上出口、代理、文件系统和账号控制。

使用前值得逐条核对的边界:

  • 只接受 http:https:about: 导航,带嵌入式用户名或密码的 URL 会被拒绝。
  • 页面正文是观察数据,不是给智能体的指令。
  • 涉及凭据、下载、购买、权限弹窗、账号变更和 CAPTCHA 时,文档要求先获得适当授权。
  • 插件不会在后台默默下载浏览器;环境缺失时先说明最小安装步骤,未授权不得改机器。
  • 截图和日志可能带上页面内容,需要按敏感数据处理。
  • 在项目到达 1.0 之前,安全修复只覆盖最新发布的 0.x。当前仓库最新发布是 0.1.3

DSH 本身还在快速迭代,插件作者也标明可能要跟着核心版本做兼容更新。安装社区插件前,建议打开 GitHub 仓库看一眼 LICENSESECURITY.mdsrc/,确认许可证(MIT)和权限模型可以接受。

小结

dsh-playwright-browser 给 DSH 补上的是一套语义化、多标签、可取消的 Playwright 控制面:10 个 browser_* 工具、有上限的 accessibility 快照、Chrome / Edge 回退,以及明确不做页面 eval。它是 Clizo1209 维护的社区 MIT 项目,不是 DeepSeek 官方捆绑能力。

目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-playwright-browser/

GitHub:https://github.com/Clizo1209/dsh-playwright-browser

npm:https://www.npmjs.com/package/dsh-playwright-browser

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜