:用 JS 代碼驅(qū)動 AI 完成復雜網(wǎng)頁交互任務)
1. 為什么 AI 需要 MCP-Playwright 才能操作真實網(wǎng)頁大語言模型能寫代碼、能分析文本但你把一個需要登錄、翻頁、勾選條件、再點提交的網(wǎng)頁任務丟給它它只能干瞪眼。原因很直接模型本身沒有瀏覽器它看不到 DOM點不了按鈕也拿不到渲染后的數(shù)據(jù)。過去我們靠 Selenium 手寫 XPath頁面一改選擇器就全廢后來靠模型生成腳本又卡在“生成完還得人工跑、報錯還得人工改”的循環(huán)里。MCP-Playwright 解決的正是這個斷層。MCP 是模型上下文協(xié)議它把 Playwright 的瀏覽器控制能力包裝成模型可以調(diào)用的工具集。模型不再只是“輸出一段代碼讓你去跑”而是能在對話過程中直接發(fā)起動作打開頁面、點擊元素、填寫輸入框、執(zhí)行一段 JS、截圖回傳。Playwright 本身是微軟開源的自動化框架支持 Chromium、Firefox、WebKit 三套內(nèi)核穩(wěn)定性比早期方案好很多。兩者結合后AI 第一次真正具備了“看見網(wǎng)頁、操作網(wǎng)頁”的閉環(huán)能力。這套組合適合誰我梳理了三類典型場景。第一類是自動化測試同學需要讓 AI 根據(jù)自然語言描述生成并執(zhí)行交互步驟比如“登錄后進入訂單頁篩選近七天已發(fā)貨訂單導出列表”。第二類是數(shù)據(jù)采集與分析頁面是動態(tài)渲染的接口有簽名直接抓包成本高用瀏覽器驅(qū)動反而更省事。第三類是智能代理開發(fā)你要做一個能自主完成多步驟表單的 AgentMCP-Playwright 就是它的“手和眼”。熱詞里提到的 MCP-Playwright、Playwright、AI、JS、自動化其實指向同一個核心讓 JS 代碼成為 AI 與瀏覽器之間的執(zhí)行層。你寫的不再是給人看的腳本而是給模型調(diào)用的工具描述加執(zhí)行邏輯。下面我會從環(huán)境準備、配置片段、可復制腳本到排障完整走一遍。2. TaoToken 前置準備拿到 Base URL、API Key 與模型 ID在配置 MCP 服務之前得先有一個能調(diào)用模型的入口。TaoToken 在這里扮演的是模型網(wǎng)關角色它提供兼容 OpenAI 風格的接口你拿到 Base URL 和 API Key 后就能在 MCP 配置里把模型接進來。注意MCP-Playwright 負責瀏覽器動作模型負責決策“下一步點哪里”兩者缺一不可。第一步訪問官網(wǎng) https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注冊并登錄。進入控制臺后找到 API Keys 頁面新建一個 Key。這個 Key 只顯示一次復制后先存到本地密碼管理器或環(huán)境變量里別直接寫進會提交到 Git 的配置文件。第二步確認 Base URL。TaoToken 的 API 地址是 https://taotoken.net/api注意這個地址不帶任何查詢參數(shù)配置時直接填這個即可。如果你用的是 OpenAI SDK 兼容模式通常還需要在末尾保留/v1具體以接入文檔為準。文檔入口在 https://taotoken.net/doc 里面有各語言 SDK 的示例。第三步選模型 ID。這一步很關鍵因為 MCP-Playwright 的交互任務對模型的指令遵循能力要求較高。你可以在模型對話頁面 https://taotoken.net/model-chat 里先試幾個模型看哪個對“點擊第幾個按鈕”“填寫哪個字段”這類指令理解更準。實測下來指令遵循強的模型在復雜分支任務里出錯率明顯低。選好后記下 Model ID后面配置里要用。如果你打算長期跑編碼類或 Agent 類任務可以關注 Coding Plan 頁面 https://taotoken.net/coding-plan 它針對高頻調(diào)用場景做了額度優(yōu)化。不過對于本篇的 MCP-Playwright 驗證先用按量計費的 Key 就夠了。這里有個容易踩的坑很多人把 Key 直接寫進claude_desktop_config.json或 MCP 的 settings 文件然后不小心同步到了云端。正確做法是用環(huán)境變量引用配置里寫${TAOTOKEN_API_KEY}這種形式具體語法取決于你用的 MCP 客戶端。下面第三節(jié)我會給出完整片段。3. 可復制配置MCP 服務 JSON 與 Playwright 啟動參數(shù)這一節(jié)是全文的核心操作部分。我會給出兩個配置片段一個是 MCP 客戶端里注冊 Playwright 服務的 JSON另一個是模型接入的 settings 片段。路徑和字段名我會寫清楚你直接替換自己的值即可。先看 MCP 服務注冊。以 Claude Desktop 為例配置文件在 macOS 下通常是~/Library/Application Support/Claude/claude_desktop_config.jsonWindows 下在%APPDATA%\Claude\claude_desktop_config.json。如果你用的是 Cline 或其它支持 MCP 的編輯器路徑不同但結構一致。{ mcpServers: { playwright: { command: npx, args: [ -y, executeautomation/playwright-mcp-server ], env: { PLAYWRIGHT_BROWSERS_PATH: 0, TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: ${TAOTOKEN_API_KEY}, TAOTOKEN_MODEL_ID: your-model-id } } } }這里有幾個點要說明。command用npx是為了免去全局安裝-y表示自動確認。executeautomation/playwright-mcp-server是社區(qū)維護的 Playwright MCP 服務包如果你用的是其它實現(xiàn)包名要相應替換。PLAYWRIGHT_BROWSERS_PATH設為0表示使用項目本地安裝的瀏覽器避免和系統(tǒng)全局版本沖突。env里的三個變量是我建議加的。TAOTOKEN_BASE_URL固定填https://taotoken.net/apiTAOTOKEN_API_KEY用環(huán)境變量引用不要寫明文。TAOTOKEN_MODEL_ID填你在模型對話頁面選好的那個 ID。注意MCP 服務本身不一定直接讀這三個變量它們更多是給配套的模型調(diào)用層用的如果你的 MCP 客戶端把模型配置和 MCP 配置分開那就把這三個值填到模型配置那邊。再看模型接入的 settings 片段。如果你用的是支持 OpenAI 兼容接口的客戶端配置通常長這樣{ model: { provider: openai-compatible, baseUrl: https://taotoken.net/api, apiKey: ${TAOTOKEN_API_KEY}, modelId: your-model-id, temperature: 0.2 } }temperature我建議設低一點0.2 左右。因為網(wǎng)頁交互任務需要確定性模型每次決策要穩(wěn)定溫度太高會導致同一個頁面它這次點“提交”、下次點“取消”。這個參數(shù)在復雜表單場景里影響很大。如果你用的是 Codex 類的auth.json結構字段名可能是base_url和api_key注意下劃線風格。Cline 的 MCP 配置則是在設置界面里填 Base URL、Key、Model ID 三件套填完后它會自動寫入配置文件。無論哪種核心三件套不變Base URL 是https://taotoken.net/apiKey 是你的 TaoToken KeyModel ID 是你選的模型。配置寫完后重啟 MCP 客戶端。重啟后在工具列表里應該能看到playwright相關的工具比如playwright_navigate、playwright_click、playwright_evaluate。如果看不到先檢查 JSON 語法再檢查npx是否能正常拉包。4. 驗證請求用 JS 腳本驅(qū)動一次多步驟表單交互配置就緒后我們來跑一個真實任務。我設計了一個場景打開一個帶動態(tài)渲染的注冊表單頁填寫用戶名和郵箱勾選服務條款點擊提交然后讀取提交后的提示文本。這個場景覆蓋了輸入、點擊、條件判斷和結果讀取能驗證 MCP-Playwright 的完整鏈路。先給出一段可復制的 JS 交互腳本。這段腳本不是直接跑在 Node 里而是作為 MCP 工具調(diào)用的參數(shù)傳給 Playwright 服務。不同 MCP 客戶端的調(diào)用方式不同但核心是playwright_evaluate或playwright_run_code這類工具。async function fillAndSubmit(page) { await page.goto(https://example.com/signup, { waitUntil: networkidle }); await page.waitForSelector(#username, { state: visible }); await page.fill(#username, mcp_test_user); await page.waitForSelector(#email, { state: visible }); await page.fill(#email, mcp_testexample.com); const agreeBox await page.$(#agree-terms); if (agreeBox) { const checked await agreeBox.isChecked(); if (!checked) { await agreeBox.check(); } } await page.click(#submit-btn); await page.waitForSelector(.result-message, { timeout: 10000 }); const message await page.textContent(.result-message); return message; }這段腳本的關鍵點在于等待策略。waitUntil: networkidle表示等網(wǎng)絡空閑再繼續(xù)適合動態(tài)渲染頁面。waitForSelector帶state: visible比單純等元素存在更穩(wěn)因為有些元素在 DOM 里但被隱藏。條件分支那段先判斷復選框是否存在再判斷是否已勾選避免重復勾選導致取消。最后用waitForSelector等結果元素出現(xiàn)再讀文本。在 MCP 客戶端里你可以用自然語言讓模型調(diào)用這段邏輯。比如輸入“用 playwright 打開注冊頁填寫用戶名 mcp_test_user 和郵箱 mcp_testexample.com勾選條款后提交告訴我結果提示是什么?!蹦P蜁阉鸪啥鄠€工具調(diào)用navigate、fill、check、click、evaluate。你可以在客戶端的工具調(diào)用日志里看到每一步。成功的結果長這樣模型返回“提交成功提示文本為注冊已受理請查收郵件?!蓖瑫r你可以在 Playwright 的截圖工具里看到頁面截圖。如果模型返回的是“找不到 #submit-btn”那說明選擇器不對或頁面沒加載完進入下一節(jié)排障。這里我試過一個坑有些頁面的提交按鈕是button但被一層div包裹click會點到外層。解決辦法是用page.click(#submit-btn, { force: true })強制點擊或者先scrollIntoViewIfNeeded。這個細節(jié)在復雜頁面里很常見。5. 常見報錯排查401、local proxy failed、reading choices 與 OAuth這一節(jié)我按真實遇到的報錯來寫每個都給出定位思路和修復動作。401 Unauthorized。這個最常見說明 API Key 不對或沒傳。先檢查環(huán)境變量TAOTOKEN_API_KEY是否真的被 MCP 客戶端讀到了。有些客戶端不展開${}語法那就得用客戶端自己的密鑰管理功能。再檢查 Base URL 是否寫成了https://taotoken.net/api/帶尾斜杠某些 SDK 對尾斜杠敏感。最后確認 Key 沒有過期或被刪除。修復后重啟客戶端再跑一次最小請求只讓模型調(diào)用一次playwright_navigate打開空白頁看是否還報 401。local proxy failed。這個報錯通常出現(xiàn)在 MCP 服務啟動階段意思是本地代理或端口綁定失敗。Playwright MCP 服務默認會起一個本地通信通道如果端口被占用就會失敗。解決辦法是換端口或者在配置里加--port參數(shù)指定一個空閑端口。另外如果你本機裝了會攔截流量的安全軟件也可能導致本地回環(huán)通信失敗臨時關閉后重試。注意這里說的是本地回環(huán)不是任何外部網(wǎng)絡配置。reading choices 報錯。這個一般出現(xiàn)在模型返回結構解析階段提示讀取choices字段失敗。原因是模型接口返回的 JSON 結構和客戶端預期不一致。檢查你的 Base URL 是否指向了正確的兼容端點。TaoToken 的 API 地址是https://taotoken.net/api如果你用的是 OpenAI SDK可能需要在代碼里把base_url設為https://taotoken.net/api/v1。具體以接入文檔 https://taotoken.net/doc 為準。修復后模型對話應該能正常返回內(nèi)容。OAuth 相關報錯。如果你在 MCP 客戶端里配置了需要 OAuth 的模型提供方但實際用的是 API Key 模式就會報 OAuth 失敗。解決辦法是把認證方式從 OAuth 切換為 API Key填 TaoToken 的 Key。有些客戶端在切換后需要清空緩存重新登錄記得做這一步。除了這四個還有一個高頻問題模型能調(diào)用工具但點不中元素。這通常不是報錯而是任務失敗。排查方法是讓模型先執(zhí)行playwright_screenshot截圖你看截圖里元素的實際位置和選擇器是否匹配。如果頁面有 iframe選擇器要加上 frame 定位。如果是動態(tài) ID改用文本選擇器或data-testid。排障時建議用最小復現(xiàn)法先只做 navigate再做單個 fill逐步加步驟。這樣能快速定位是哪一步斷了。另外把 MCP 客戶端的日志級別調(diào)到 debug能看到每次工具調(diào)用的入?yún)⒑头祷胤浅S杏谩?. 從驗證到落地把 MCP-Playwright 接入你的自動化流程跑通單次任務后下一步是把它變成可復用的流程。我的做法是把常用的交互步驟封裝成幾個 JS 函數(shù)每個函數(shù)對應一個業(yè)務動作比如login(page, user, pass)、searchOrder(page, orderId)、exportList(page)。然后在 MCP 客戶端里用自然語言組合調(diào)用。這樣模型不需要每次從零生成選擇器出錯率會低很多。如果你要做的是長期運行的 Agent建議關注 Coding Plan https://taotoken.net/coding-plan 它在高頻調(diào)用場景下額度更劃算。同時把 API Key 的管理做成輪換機制避免單 Key 泄露影響全部任務。模型對話頁面 https://taotoken.net/model-chat 可以隨時用來測試新模型對交互指令的理解程度換模型前先在那里跑一遍你的核心腳本。還有一個實用技巧給每個關鍵步驟加超時和重試。Playwright 的waitForSelector默認 30 秒復雜頁面可以調(diào)到 60 秒。重試邏輯寫在 JS 里比如點擊后等結果如果 5 秒沒出現(xiàn)就再點一次。這些細節(jié)能讓你的自動化流程在真實網(wǎng)絡環(huán)境下穩(wěn)定很多。最后別忘了截圖留痕。每次任務結束讓模型調(diào)一次playwright_screenshot把截圖存到本地按時間戳命名。出問題時回看截圖比翻日志快得多。這套組合我用下來處理多步驟表單和條件分支任務的效率比手寫腳本高不少尤其是頁面結構頻繁變動的場景改選擇器的工作量小了很多。