iT邦幫忙

2026 iThome 鐵人賽

DAY 15
0

! 本篇文章將會介紹 agent-browser 入門:給 Agent 一雙手,期望大家都能讓 Agent 自己開網頁、看頁面、點按鈕、填表單 :D

W2 收官時我留了一個尾巴:發文這步目前還是靠我的 agent-browser 手感在撐,還沒系統化——而這正是 W3 的全部內容。今天第三週開張,先給 Agent 裝上雙手。前兩週它已經會寫文章(W1)、會看班表自動跑(W2),但寫完的文章要上架到 iT 邦幫忙,得有人開瀏覽器、貼標題、貼內文、按送出。這週的目標就是把「人開瀏覽器」換成「Agent 開瀏覽器」。本日範圍:安裝 agent-browser,以及四個核心操作——open、snapshot、click、fill。看起來樸素,但整週的瀏覽器自動化都建立在這四招上。

本篇目標

讀完這篇你會學到:

  • 安裝 agent-browser(CLI 跟瀏覽器是兩件事),並理解 daemon 常駐的運作方式
  • 看懂 snapshot 吐出的 accessibility tree 與 @ref 編號,理解為什麼不直接餵 HTML 給 Agent
  • 用 open / snapshot / click / fill 跑完一輪完整的「開頁 → 看 → 填 → 送」操作迴圈

環境準備

  • 一台裝好 Node.js 的電腦(本系列用 nvm 管理 Node,launchd 的 PATH 地雷在 d11 已經補過課)
  • 終端機一顆,就這樣
# 確認 Node 環境(npm 會一起帶上來)
node -v

# 安裝 CLI 本體
npm i -g agent-browser

# 下載它要驅動的瀏覽器——漏了這步,第一個指令就會跟你哭
agent-browser install

# 驗收(本系列機器上目前是 0.34.0)
agent-browser --version

主要內容

步驟一:兩個指令裝好,順便搞懂 daemon

安裝只要 npm i -g agent-browser 加 agent-browser install 兩步,但有一個觀念要先建立:CLI 跟瀏覽器是兩件事。前者是你在終端機敲的指令,後者才是真正開網頁的那顆 Chrome,agent-browser install 負責把瀏覽器備齊。

第二個觀念:agent-browser 不是每敲一個指令就開一顆新瀏覽器。第一次執行時它會在背景叫起一個 daemon(常駐程序),之後所有指令都送交同一顆瀏覽器處理——所以連續下指令的體感就像在同一場 session 裡操作,頁面不會憑消失不見。它底層直接透過 CDP(Chrome DevTools Protocol)驅動 Chrome/Chromium,不是 Playwright 也不是 Puppeteer 的包殼。閒置約一小時後 daemon 會自動收工省資源,下次有指令再自動醒來。

裝完先來個 30 秒煙霧測試:

# 開一頁
agent-browser open https://example.com

# 截圖存證——headless 模式你看不到畫面,截圖就是你的眼睛
agent-browser screenshot /tmp/smoke.png

# 確認沒問題就收工
agent-browser close

步驟二:open + snapshot——Agent 眼中的網頁不是 HTML

你我看網頁靠渲染出來的畫面,Agent 看網頁靠 snapshot。它吐出來的不是原始 HTML,而是 accessibility tree(無障礙樹),並且給每個可互動的元素發一個 @ref 編號:

agent-browser open https://example.com
agent-browser snapshot -i    # -i = 只列可互動元素,輸出最精簡

輸出長這樣(簡化示意):

Page: Example Domain
URL: https://example.com/

@e1 [link] "More information..."

為什麼不直接把 HTML 丟給 Agent?這是 token 經濟學。一個中型網頁的原始 HTML 動輒數十萬 token,塞進 context 不是爆表就是燒錢;accessibility tree 把頁面壓縮到數百 token 等級,Agent 還能直接知道哪個元素可以點、叫什麼名字。-i 進一步只保留可互動元素,等於把「按鈕清單」直接遞到 Agent 手上。對 CLI agent 來說,這個設計是成敗關鍵:context 有限的狀況下,看頁面的成本越低,剩給「思考跟決定下一步」的空間就越多。

snapshot 還有幾個好用的旗標:

agent-browser snapshot -i -u        # 連結附上 href
agent-browser snapshot -i -s "#main" # 只看某個 CSS selector 範圍內
agent-browser snapshot -i --json     # 機器可讀格式

小小小測驗:你知道 Agent 透過 snapshot 看到的頁面,跟你眼睛看到的畫面可能完全「不一樣」嗎?
答案:snapshot 讀的是網頁的無障礙標記(role、label、placeholder)。有些網站畫面做得美輪美奐,元素卻沒有語意標籤,Agent 看到的就是一片模糊。所以「給人看的 UI」不等於「給 Agent 看的 UI」——這也解釋了為什麼 W3 後面要花一整天教 selector 跟等待策略。

步驟三:click + fill——用 @ref 完成一輪完整操作

工具認識完了,拿真網站練一輪:讓 Agent 去 DuckDuckGo 搜尋。

agent-browser open https://duckduckgo.com
agent-browser snapshot -i               # 找到搜尋框的 ref,假設是 @e3
agent-browser fill @e3 "agent-browser cli"
agent-browser press Enter               # 按 Enter 送出搜尋
agent-browser wait --load networkidle   # 等網路請求穩定,別搶拍
agent-browser snapshot -i               # 頁面變了,refs 全部重發
agent-browser screenshot /tmp/results.png

拆解一下四個角色的分工:

  • open:導航到指定 URL
  • snapshot:看頁面、領取這一輪的 @ref 號碼牌
  • fill:清空後再填入(相對地,type 是直接疊打上去——操作表單用 fill 穩很多,不會跟殘留文字混在一起)
  • click:點 @ref(也可以吃 CSS selector)

操作完想回收資料,用 get 系列:

agent-browser get title      # 頁面標題
agent-browser get url        # 目前網址
agent-browser get text @e5   # 某個元素的可見文字

而這整段流程裡藏著一條本週最重要的鐵律:頁面一變、重看一次。@ref 是每次 snapshot 現場發放的臨時號碼牌,頁面一重新渲染就全部重洗。今天的搜尋迴圈裡 press Enter 之後那第二次 snapshot,就是這條鐵律的示範。這四招還會在 d19、d20 直接上戰場——拆 iThelp 的發文編輯器,標題與內文就是靠 fill 塞進去的。

常見問題 / 踩坑記錄

  • Q:npm i -g agent-browser 裝完了,第一個指令卻報錯找不到瀏覽器?
    A:九成是漏了 agent-browser install。CLI 跟瀏覽器分開安裝是它的設計,第二步不要省。Linux 主機還要補 agent-browser install --with-deps 安裝系統相依函式庫;macOS 通常免。
  • Q:click 之後接著用「上一輪」的 @ref,結果點到不存在的元素?
    A:經典的 stale ref。@ref 只在當次 snapshot 有效,頁面一變(導航、表單送出、動態重繪)號碼牌全部重發,拿舊牌下注不是報錯就是點錯格。解法只有一個:任何讓頁面產生變化的操作之後,下一個動作前先 re-snapshot。
  • Q:兩個 agent 同時操作瀏覽器,頁面被彼此搶走?
    A:預設 session 是這台機器上共用的一顆瀏覽器,誰先下指令誰就掌舵。解法是開工前先 export AGENT_BROWSER_SESSION=ironman-publish 這樣切一顆專用瀏覽器。本系列的 generate 與 publish 各有自己的 session,不會互相劫持頁面。
  • Q:fill 跟 click 明明寫對了,卻三不五時失敗,重跑又好了?
    A:時序問題。前一個動作觸發頁面更新,元素還沒長出來,指令就已經出手了。解法是在關鍵步驟之間插入 agent-browser wait——可以等指定元素出現,也可以等固定毫秒數。等待策略的水很深,d17 會有一整篇的篇幅認真處理。

小結

  • agent-browser 兩步安裝:npm i -g 裝 CLI、agent-browser install 裝瀏覽器;daemon 常駐讓一串指令像同一場 session
  • Agent 的眼睛是 snapshot:accessibility tree 加 @ref,把數十萬 token 等級的 HTML 壓成數百 token
  • 最小操作套裝出爐:open 導航、snapshot 看、click 點、fill 清空再填;鐵律是頁面一變、重看一次
  • 這雙手明天會被裝上「記憶」,然後在這週尾端去拆 iThelp 編輯器

明日預告

下一篇我們要介紹「Persistent profile:登入一次,永久 headless」,headless 模式每次醒來都是一顆全新的瀏覽器,登入狀態不會留下——那要怎麼讓 Agent 每天都「已經登入好」直接開工?明天用 --profile 解決,敬請期待!

參考資料:

有任何疑問但沒有 iT 邦幫忙帳號,或是想匿名提問?
歡迎到 https://dev.benben.me/q/Z5442T 提問或加油打氣,沒意外的話會在完賽之後一起回答 :D


上一篇
14 第二週回顧:排程系統拼圖完成
系列文
自我耍廢組:全自動化の鐵人 共 15 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言