dsh-browser-control:用無障礙樹驅動 Harness 側邊瀏覽器

前言

在 DeepSeek Harness(DSH)裏做聯網或頁面相關任務時,模型往往需要「看見頁面、點按鈕、填表單」。常見做法是外掛 Playwright、用 CDP,或讓模型猜 CSS 選擇器——這些路徑要麼和 Harness 右欄內置瀏覽器脫節,要麼定位依據不穩定。社區插件 dsh-browser-control 由維護者 neilweixing 提供,分類爲「聯網工具」,目標是讓模型像 ZCode 那樣操作 Harness 內置側邊瀏覽器(右欄 Browser 標籤頁):以 ARIA 快照作爲定位器唯一依據,用受信任輸入觸發真實交互,並返回真實截圖。

這是什麼

dsh-browser-control 是一組註冊到 DSH 模型工具表裏的 browser_* 工具集。它不替代 CDP 或無頭瀏覽器,而是專門綁定 Harness 窗口內 <webview> 承載的頁面:觀察來自頁內代理計算的無障礙樹,每個 ref 對應一次快照裏真實存在的元素;點擊與按鍵走 sendInputEvent,在元素視口座標上觸發,而不是 el.click()。

與「枚舉前 N 個鏈接」式自動化相比,README 強調三件事:觀察是無障礙樹快照;每個 ref 綁定被觀察到的元素;輸入是受信任的底層事件。

核心功能

工具一覽

安裝並刷新 Harness 後,下列工具出現在模型工具表中(作用摘自官方 README):

工具 作用
browser_open 打開頁面或導航已有標籤頁;mode: "same-site" 可複用同域標籤頁
browser_tabs 列出本會話瀏覽器標籤頁(URL、標題、加載狀態、是否掛載)
browser_close 關閉一個標籤頁
browser_nav back / forward / reload / stop
browser_snapshot 無障礙樹,每行一個節點:role、可訪問名、狀態、ref
browser_locator 只檢查定位器:匹配數量與目標;用於確認存在與讀取當前狀態
browser_act 一次一個改狀態動作:click / dblclick / hover / fill / type / press / select / check / uncheck / focus / scroll
browser_read 讀可見文本:整頁或某個元素
browser_wait 等待定位器狀態、可見文本、URL、加載狀態
browser_console 讀取 console、未捕獲錯誤、頁面嘗試彈出的原生對話框
browser_screenshot 真實截圖,作爲圖片返回

觀察與動作的節奏

browser_act 每次只執行一個動作並返回結果。下一步應先再觀察:查單個元素時優先 browser_locator(最便宜);需要新的定位依據時再 browser_snapshot。頁面變化後,舊 ref 會被明確拒絕(stale-ref / detached),不會靜默點到別的元素。

定位器優先級

README 給出的匹配順序如下:

  1. { "ref": "e12" } —— 精確,來自最新快照
  2. { "role": "button", "name": "保存" } —— 頁面自述
  3. { "testid": "submit-order" } —— 有測試 id 時較穩
  4. { "label": "郵箱" } / { "placeholder": "搜索" } —— 表單字段
  5. { "css": "..." } —— 兜底,僅在樹裏確實沒有可用 role/name 時

匹配到多個元素會報錯並要求收緊定位,而不是用 nth 猜位置。

快照示例

無障礙樹以緊湊縮進樹形式返回,隱藏元素(display:none、aria-hidden 等)不出現。示意結構與 README 一致:

- navigation "Main" [ref=e1]
  - link "Home" [href=/home] [ref=e2]
- heading "Products" [level=2] [ref=e4]
- region "Filters" [ref=e5]
  - textbox "Search products" [placeholder="Type to search"] [ref=e6]
  - button "Apply" [testid="apply"] [ref=e10]

架構簡述

命令路徑爲:模型調用 browser_*(Host 半)→ Connection RPC 長輪詢 → Client 半(頁面內)→ 右欄 Browser 的 <webview> → 頁內代理 → 結果(含截圖字節)回傳。Connection RPC 爲瀏覽器到 Host 的單向設計;命令按 Session 隔離;目標定位使用 Harness 內置標記(如 data-sidebar-right-tab、webview[data-sidebar-browser-frame])與會話元數據,每次調用重新解析目標,避免導航或重載後句柄失效。

安裝與啓用

插件通過插件管理器從本地包目錄安裝,README 給出的命令爲:

# 插件管理器,參數爲本地包目錄的絕對路徑
plugin_manager install_bundle /絕對路徑/dsh-browser-control

將 /絕對路徑/dsh-browser-control 換成本地插件包目錄的絕對路徑。安裝後刷新 Harness 頁面,讓 Client 半加載,工具纔會進入模型工具表。改完 index.js / client.js 後,需在插件管理器中移除再安裝,然後再次刷新。

當前倉庫 package.json 標註版本爲 2.0.0,許可證爲 MIT。

典型用法思路

下面是一套可復現的節奏(具體 URL 與頁面內容由你的任務決定):

  1. 用 browser_open 在側邊瀏覽器打開目標 https 頁面。
  2. 用 browser_snapshot 或 browser_wait 等待加載完成並取得樹與 ref。
  3. 用 browser_locator 確認要操作的節點存在且唯一。
  4. 用 browser_act 執行一個動作(例如 click 或 fill)。
  5. 頁面變化後重新快照或 locator,再執行下一步;需要視覺確認時調用 browser_screenshot。
  6. 調試腳本問題時可用 browser_console 查看日誌與原生對話框嘗試。

插件只接受 http/https,禁止內嵌憑據與指向 Harness 自身地址;頁面內容在工具描述與運行時 skill 中一律視爲不可信數據。

適用場景與注意

適合:在 DSH 會話內讓模型操作右欄 Browser、做表單填寫、導航、讀可見文本、截屏佐證,且希望定位與 ZCode 類「樹 + ref + 單步動作」流程一致的場景。

不適合或做不到(README「已知限制」):

  • 不是 CDP:無後臺標籤、網絡攔截、無頭模式;能力限於 <webview> 的 executeJavaScript / sendInputEvent / capturePage。
  • 截圖要求 Harness 窗口可見,否則 capturePage 不返回,插件會快速失敗並說明原因。
  • 不支持文件上傳與下載;file: 頁面被拒。
  • alert / confirm / prompt 被拒絕,記錄到 browser_console 並以安全默認值應答。

DSH 生態理念是「一切皆插件」;SkillHub 目錄頁 爲社區站點,與 DeepSeek / 幻方無官方從屬關係。插件在當前 DSH 進程權限下運行,安裝前請自行查閱 GitHub 源碼 與 MIT 許可證,確認符合你的安全與合規要求。

結尾

dsh-browser-control 把 Harness 側邊瀏覽器變成可編排的工具面:無障礙樹作定位 ground truth、單步 browser_act、受信任輸入與真實截圖,適合在 Harness 內完成頁面任務而不另起一套瀏覽器自動化棧。

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

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

小夜