前言
延續優化 SidePanel 的 UI,將其轉變為對話機器人的界面,並探索更多與 LLM 結合的可能性,我們已經在 SidePanel 中完成與 LLM 的對話功能,並且能成功取得網頁上的 BizForm 表單欄位資訊。本篇將進一步把這個能力應用到「自動填寫表單」的實戰上。你只需要輸入一個指令或貼上會議記錄,AI 就能幫你把資訊自動填入對應欄位,真正實現一鍵自動填表。
以下將以 KM 系統為例子,建立該網站的 2 項工具,一個取得表單欄位資訊,另一個則是將表單欄位資訊填入表單中。
實作
要取得網頁表單欄位的資訊及自動填入資料,要先解析網頁的 HTML,看看如何取得表單欄位資訊及透過 id 來指定它們的值。
你可以把這些 HTML 結構交給 ChatGPT,請它協助你產生對應的 JavaScript 來自動化擷取欄位資訊。這樣可以加快開發流程,先在瀏覽器 Console 測試 JS 程式碼是否正確抓到欄位,如下圖所示:

而在填入表單欄位資訊時,則需要取得表單的 id,然後透過 id 來指定它們的值。
不過在 KM 系統中,部分欄位使用了 TinyMCE 這類富文本編輯器。TinyMCE 會將原本的 textarea 元件「包裝」成一個 iframe,這時就不能單純用 id 屬性直接設定值。如下圖所示,

textarea 已經被 iframe 取代,所以我們必須改用 TinyMCE 的 setContent API 來操作內容。
建立工具
以下建立 KM 系統要使用的 2 項工具,一個取得表單欄位資訊,另一個則是將表單欄位資訊填入表單中。
在這裡主要是設定工具的描述及工具的參數類型,讓 LLM 知道這個工具是幹嘛用的,以及參數的類型(Tool Calling)。
而實際上的操作,則會傳送訊息讓 Content-Script 中的 Handler 去執行。
定義工具描述
這裡我們先定義三個工具,讓 LLM 清楚理解每種工具是幹嘛用的。
在utils/types/message.ts
的MESSAGE_TOOL_TYPES
加入取得欄位、設定欄位及設定 TinyMCE 欄位的描述。
1 | export const MESSAGE_TOOL_TYPES = { |
建立 KM 工具
在utils/tools
目錄中新增kmTools.ts
,在裡面建立LangChain的 Tool,如下,
1 | import { tool } from "@langchain/core/tools"; |
在設定欄位的工具中,我們使用z.record(z.string(), z.any())
來定義 schema,id 為字串,欄位值為 any,這樣就可以讓我們傳入任何類型的資料。
設定 KM 工具可以在那些網站使用
在utils/tools/index.ts
中,在toolRules中加入kmExtractFieldsTool
及kmSetFieldsTool
,如下,
1 | import { matchPattern } from "browser-extension-url-match"; |
因為 KM 系統的網址是 https://gsskm.gss.com.tw/*
,所以這裡我們設定 matches 的值為 https://gsskm.gss.com.tw/*
。
建立工具對應的 Handler
新增 Handler
在utils/handlers
目錄中新增kmHandlers.ts
,在裡面實作要針對網頁的讀取檔位資訊及設定欄位值的 Handler,如下,
1 | import { |
針對頁面 DOM 的操作,您可以依實際需求調整,這裡只是提供一個基本的範例。
因為 KM 系統有使用 TinyMCE 編輯器,所以還需要額外處理 textarea 的值設定,這裡使用 window.postMessage
來觸發設定 TinyMCE TinyMCE 編輯器方法。
設定 訊息對應的 Handler
在utils/handlers/index.ts
中,新增對應的 Handler,
1 | import { |
新增 TinyMCE 的設定
新增設定 TinyMCE 編輯器的 Function
在entrypoints
目錄中新增tinymcetools.ts
,
要設定 TinyMCE 編輯器的值,要使用到window.tinyMCE,預設的 Content-Script 是與網頁是隔離開來的,無法存取到 window
。
所以要將這個檔案透過injectScript的方式加到網頁之中,而 Content-Script 的 Handler 則透過 window.postMessage
來觸發設定 TinyMCE 編輯器的值,如下window.addEventListener
的部份。
1 | import { MESSAGE_TOOL_TYPES } from "../utils/types/message"; |
設定 injectScript 的檔案
injectScript 會將 JS 直接插入網頁作用域,突破 Content-Script 和網頁 window 的隔離。
在entrypoints/content.ts
中使用injectScript
來將tinymcetools.js
加入到網頁中,如下,
1 | import { messageRequest, messageResponse } from "../utils/types/message"; |
設定 web_accessible_resources
這步驟是讓 Chrome Extension 可以將指定的 JS 檔案注入到目標網頁,才能讓 content script 跟網頁本體溝通。
在 wxt.config.ts
中,設定 web_accessible_resources
,讓 Content-Script 可以將 tinymcetools.js
加到網頁中
1 | import { defineConfig } from "wxt"; |
經過上述的步驟,我們已經完成了對 KM 系統的填表功能,接下來執行npm run dev
,把 Extension 安裝到 Chrome 中,
進入到 KM 系統,點選 Extension 的 Icon,再開啟到填表畫面,然後在 SidePanel 中輸入需要 LLM 幫我們做的事,在後面貼上 Teams 的開會記事內容,
1 | 請根據下方會議記錄內容,依網頁表單欄位逐步執行以下流程,請每一步明確說明理由: |
然後按下送出,就可以看到 LLM 幫我們填寫好了表單。如下圖:

- 註: 如果您的 Chrome 升級到了 V.137 ,它不再支援
--load-extension
參數,所以要手動安裝 Extension(開啟 開發人員模式 ,載入未封裝項目,選擇 chrome-mv3-dev 目錄) - 註: 如果出現取不到網頁資訊表示 Content-Script 沒有順利載入到網頁中,請重新整理網頁,然後再試一次。
結論
從這次的實作可以看到,只要建立好對應的 Tools 和 Handlers,就能快速擴充 AI 助理的新能力,不論是自動填表還是擷取網頁資料都變得簡單高效。
這種「工具驅動 + LLM 協作」的模式,不僅大幅減少了重複性工作,更讓我們能把時間投入到真正有價值的決策和創造力發揮上。
未來,你也可以依照實際需求,彈性擴充更多自動化功能,讓瀏覽器成為最聰明的工作助手!
參考資源
用 Browser Extension 打造具網頁背景感知的 AI 助理,補足 LLM 的視野盲點
為什麼 AI 工具需要瀏覽器擴充功能來補全 Web 背景?
如何用 WXT 和 LangChain 快速打造具備 SidePanel 的 AI Chrome 擴充功能
wxtagent 程式碼
優化 SidePanel 的 UI,將其轉變為對話機器人的界面,並探索更多與 LLM 結合的可能性