<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>瀏覽器自動化 on KnightLi的博客</title>
        <link>https://knightli.com/zh-tw/tags/%E7%80%8F%E8%A6%BD%E5%99%A8%E8%87%AA%E5%8B%95%E5%8C%96/</link>
        <description>Recent content in 瀏覽器自動化 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Sun, 24 May 2026 23:43:35 +0800</lastBuildDate><atom:link href="https://knightli.com/zh-tw/tags/%E7%80%8F%E8%A6%BD%E5%99%A8%E8%87%AA%E5%8B%95%E5%8C%96/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>browser-harness 的 domain skills 機制：讓 AI Agent 不再重複踩網頁自動化的坑</title>
        <link>https://knightli.com/zh-tw/2026/05/24/browser-harness-domain-skills-summary/</link>
        <pubDate>Sun, 24 May 2026 23:43:35 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/05/24/browser-harness-domain-skills-summary/</guid>
        <description>&lt;p&gt;&lt;code&gt;browser-use/browser-harness&lt;/code&gt; 最有意思的地方，不只是讓 AI Agent 能控制真實 Chrome，而是它把網頁操作中的經驗變成了可以重用的 &lt;code&gt;domain skills&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;這件事很關鍵。瀏覽器自動化真正困難的地方，往往不是「能不能點擊按鈕」，而是每個網站都有自己的細節：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;哪些頁面必須登入。&lt;/li&gt;
&lt;li&gt;哪些資料可以直接走 API。&lt;/li&gt;
&lt;li&gt;哪些按鈕用普通 DOM 點擊無效。&lt;/li&gt;
&lt;li&gt;哪些 iframe、shadow DOM、彈窗會擋住流程。&lt;/li&gt;
&lt;li&gt;哪些選擇器穩定，哪些只是臨時 class。&lt;/li&gt;
&lt;li&gt;哪些操作涉及帳號、支付或不可逆變更，必須讓人確認。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果這些經驗只留在一次任務日誌裡，Agent 下次還會重新踩坑。&lt;code&gt;domain skills&lt;/code&gt; 的作用，就是把這些經驗沉澱下來，讓 Agent 不必每次都像第一次打開網站。&lt;/p&gt;
&lt;h2 id=&#34;domain-skills-是什麼&#34;&gt;domain skills 是什麼
&lt;/h2&gt;&lt;p&gt;可以把 &lt;code&gt;domain skills&lt;/code&gt; 理解成「給 Agent 看的站點操作手冊」。&lt;/p&gt;
&lt;p&gt;它不是普通的使用者文件，也不是一次性腳本。它更像一組經過實測的站點級知識：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;這個站點適不適合用瀏覽器。&lt;/li&gt;
&lt;li&gt;如果有 API，應該優先用哪個 API。&lt;/li&gt;
&lt;li&gt;如果必須操作網頁，應該從哪個 URL 進入。&lt;/li&gt;
&lt;li&gt;哪些 DOM 結構、aria-label、按鈕行為經過驗證。&lt;/li&gt;
&lt;li&gt;哪些常見寫法會失敗。&lt;/li&gt;
&lt;li&gt;哪些場景要停止並請求人類介入。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這類內容既能被人類審查，也能被 Agent 在任務中讀取。它把「臨場摸索」變成「可維護經驗」。&lt;/p&gt;
&lt;h2 id=&#34;它不是讓-agent-盲目點擊&#34;&gt;它不是讓 Agent 盲目點擊
&lt;/h2&gt;&lt;p&gt;一個好的瀏覽器 Agent，不應該把所有問題都變成打開網頁、看截圖、點按鈕。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;domain skills&lt;/code&gt; 裡很重要的一類經驗，恰恰是在告訴 Agent：什麼時候不要用瀏覽器。&lt;/p&gt;
&lt;p&gt;比如 ArXiv 這類站點，論文搜尋、元資料和摘要可以透過 Atom API 或 HTML meta 標籤直接拿到。用 HTTP 請求通常比打開瀏覽器更快、更穩，也更容易解析。&lt;/p&gt;
&lt;p&gt;GitHub 也是類似思路。倉庫、使用者、release 資料優先用 REST API；檔案內容優先讀 &lt;code&gt;raw.githubusercontent.com&lt;/code&gt;；只有 GitHub Trending 這類沒有等價 API 的頁面，才需要進入瀏覽器。&lt;/p&gt;
&lt;p&gt;這說明 browser-harness 的思路不是「瀏覽器萬能」，而是把瀏覽器放在正確位置：當 API、HTTP、靜態頁面無法解決問題時，再讓 Agent 操作真實頁面。&lt;/p&gt;
&lt;h2 id=&#34;它記錄的是站點級知識&#34;&gt;它記錄的是站點級知識
&lt;/h2&gt;&lt;p&gt;傳統自動化腳本通常圍繞一次任務寫，比如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;打開頁面 -&amp;gt; 輸入關鍵詞 -&amp;gt; 點擊按鈕 -&amp;gt; 下載文件
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這種腳本可以完成任務，但經驗很容易散落在程式碼裡。站點一改版，腳本失效；換一個任務，很多經驗也沒法重用。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;domain skills&lt;/code&gt; 的粒度更接近站點級知識庫。它關心的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazon 搜尋結果裡哪個容器選擇器穩定。&lt;/li&gt;
&lt;li&gt;GitHub 哪些資料應該走 REST API。&lt;/li&gt;
&lt;li&gt;LinkedIn 邀請管理頁的按鈕 aria-label 有什麼差異。&lt;/li&gt;
&lt;li&gt;Shopify Admin 裡哪些頁面是嵌入式 app。&lt;/li&gt;
&lt;li&gt;Shopify Polaris 輸入框為什麼不能只用普通 JS 設定 value。&lt;/li&gt;
&lt;li&gt;Browser Use Cloud 的瀏覽器實例如何建立、列出和清理。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這些經驗不是一次任務的步驟，而是以後很多任務都會用到的判斷依據。&lt;/p&gt;
&lt;h2 id=&#34;例子amazon-商品搜尋&#34;&gt;例子：Amazon 商品搜尋
&lt;/h2&gt;&lt;p&gt;Amazon 商品搜尋的經驗，重點不只是「怎麼搜尋商品」，而是哪些路徑更穩定。&lt;/p&gt;
&lt;p&gt;比較可靠的做法是直接使用搜尋 URL，而不是每次都打開首頁再模擬輸入。搜尋結果可以從 &lt;code&gt;[data-component-type=&amp;quot;s-search-result&amp;quot;]&lt;/code&gt; 這樣的容器中提取。欄位提取也有細節：標題、價格、評分、評論數、是否贊助，都有各自更穩的 DOM 來源。&lt;/p&gt;
&lt;p&gt;這種經驗對 Agent 很有價值。沒有它時，Agent 可能會從截圖裡猜按鈕、反覆嘗試選擇器；有了它之後，Agent 可以直接進入更穩定的資料提取路徑。&lt;/p&gt;
&lt;p&gt;更重要的是，這類 skill 還會記錄陷阱。例如某些看似可用的選擇器，在贊助結果或交叉推薦區域裡會誤讀。這種坑只有實測過才知道。&lt;/p&gt;
&lt;h2 id=&#34;例子linkedin-邀請管理&#34;&gt;例子：LinkedIn 邀請管理
&lt;/h2&gt;&lt;p&gt;LinkedIn 這類站點更接近真實帳號工作流，風險也更高。&lt;/p&gt;
&lt;p&gt;在邀請管理頁裡，Accept 和 Ignore 按鈕的 &lt;code&gt;aria-label&lt;/code&gt; 格式不同，不能簡單地從一個推導另一個。有些邀請卡片裡的 Accept 控件甚至不是 &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;，而是 &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;，普通 CDP 點擊不一定能觸發接受動作。&lt;/p&gt;
&lt;p&gt;這種細節說明，真實網頁自動化不是「定位到元素就結束」。按鈕標籤、事件綁定、軟導航、元件實作方式，都會影響操作是否真的生效。&lt;/p&gt;
&lt;p&gt;對 Agent 來說，這類經驗還有一個安全含義：涉及社交帳號、邀請、消息、發文的操作，不應該完全託管。skill 可以記錄路徑和陷阱，但批量接受邀請、對外發送內容、修改帳號資料這類動作，最好保留人工確認。&lt;/p&gt;
&lt;h2 id=&#34;例子shopify-admin&#34;&gt;例子：Shopify Admin
&lt;/h2&gt;&lt;p&gt;Shopify Admin 的經驗說明了另一個問題：後台系統往往不是一個頁面，而是一堆嵌入式應用和複雜元件的組合。&lt;/p&gt;
&lt;p&gt;很多 Shopify app 會運行在 iframe 裡。Polaris React 輸入框、Web Components、嵌入式 app 的互動方式也不同。某些輸入框不能只用 &lt;code&gt;element.value = ...&lt;/code&gt;，需要使用更接近真實鍵盤輸入的 CDP keystrokes。&lt;/p&gt;
&lt;p&gt;這類 skill 的價值在於，它讓 Agent 先判斷目前頁面屬於哪類 UI，再選擇合適的操作方式。&lt;/p&gt;
&lt;p&gt;同時，Shopify 的經驗也強調「能不用瀏覽器就不用瀏覽器」：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;唯讀商品和庫存資料，優先用 Storefront API。&lt;/li&gt;
&lt;li&gt;有 Admin API token 時，優先用 Admin API。&lt;/li&gt;
&lt;li&gt;編輯主題程式碼時，優先用 Shopify CLI。&lt;/li&gt;
&lt;li&gt;只有沒有 API、一次性設定、探索後台時，才適合讓瀏覽器介入。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這才是成熟的 Agent 工具選擇邏輯。&lt;/p&gt;
&lt;h2 id=&#34;例子browser-use-cloud&#34;&gt;例子：Browser Use Cloud
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;domain skills&lt;/code&gt; 不只服務網頁點擊，也可以記錄圍繞瀏覽器執行環境的 API 經驗。&lt;/p&gt;
&lt;p&gt;Browser Use Cloud 的經驗裡，會記錄如何透過 REST API 建立 cloud browser、列出正在運行的瀏覽器、清理 zombie browser、取得 &lt;code&gt;liveUrl&lt;/code&gt; 和 &lt;code&gt;cdpUrl&lt;/code&gt; 等資訊。&lt;/p&gt;
&lt;p&gt;這說明 skill 的邊界並不侷限於「某個網頁按鈕怎麼點」。只要某類任務會反覆出現，而且有穩定做法，就可以沉澱成 skill：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API 呼叫方式。&lt;/li&gt;
&lt;li&gt;鑑權頭格式。&lt;/li&gt;
&lt;li&gt;請求和回應結構。&lt;/li&gt;
&lt;li&gt;已驗證狀態碼。&lt;/li&gt;
&lt;li&gt;常見失敗模式。&lt;/li&gt;
&lt;li&gt;清理和回收資源的方法。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;對 Agent 來說，這些都是可重用能力。&lt;/p&gt;
&lt;h2 id=&#34;為什麼這比臨場推理更可靠&#34;&gt;為什麼這比臨場推理更可靠
&lt;/h2&gt;&lt;p&gt;很多人期待大模型每次都能「自己看懂網頁」。但真實任務裡，只靠臨場推理並不穩定。&lt;/p&gt;
&lt;p&gt;原因很簡單：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;網頁 UI 經常變化。&lt;/li&gt;
&lt;li&gt;同一按鈕可能有多種實作。&lt;/li&gt;
&lt;li&gt;看得見不代表點得動。&lt;/li&gt;
&lt;li&gt;能點擊不代表操作真的生效。&lt;/li&gt;
&lt;li&gt;有些任務本來就應該用 API，而不是瀏覽器。&lt;/li&gt;
&lt;li&gt;有些操作需要人類確認，不能讓模型自己決定。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;domain skills&lt;/code&gt; 把這些經驗寫成文件後，有幾個好處：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;人類可以 review。&lt;/li&gt;
&lt;li&gt;錯誤經驗可以修正。&lt;/li&gt;
&lt;li&gt;同一站點的經驗可以持續積累。&lt;/li&gt;
&lt;li&gt;新 Agent 可以直接繼承舊經驗。&lt;/li&gt;
&lt;li&gt;臨時任務發現可以變成長期知識。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這比把一切都塞進 prompt 或聊天上下文更穩。&lt;/p&gt;
&lt;h2 id=&#34;團隊可以怎麼用&#34;&gt;團隊可以怎麼用
&lt;/h2&gt;&lt;p&gt;如果把 browser-harness 用在團隊裡，&lt;code&gt;domain skills&lt;/code&gt; 可以變成一種輕量自動化知識庫。&lt;/p&gt;
&lt;p&gt;比較適合沉澱的內容包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;內部後台的登入後路徑。&lt;/li&gt;
&lt;li&gt;報表匯出流程。&lt;/li&gt;
&lt;li&gt;常見彈窗處理方式。&lt;/li&gt;
&lt;li&gt;哪些按鈕需要人工確認。&lt;/li&gt;
&lt;li&gt;哪些頁面有 API 替代方案。&lt;/li&gt;
&lt;li&gt;哪些選擇器經過實測可靠。&lt;/li&gt;
&lt;li&gt;哪些任務不允許 Agent 自動執行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這類知識不必一開始就很完整。更實際的做法是從低風險、高頻、可回復的流程開始：先讓 Agent 做唯讀、下載、整理、檢查類任務。等流程穩定後，再把經驗整理成 skill。&lt;/p&gt;
&lt;p&gt;對團隊管理者來說，skill 文件還有一個好處：它讓自動化邊界變得可見。你可以審查 Agent 知道什麼、能做什麼、應該停在哪裡。&lt;/p&gt;
&lt;h2 id=&#34;需要注意的邊界&#34;&gt;需要注意的邊界
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;domain skills&lt;/code&gt; 能提高 Agent 成功率，但它不應該讓高風險操作完全自動化。&lt;/p&gt;
&lt;p&gt;幾個邊界要守住：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不記錄密碼、Cookie、token、客戶資料和內部敏感 URL。&lt;/li&gt;
&lt;li&gt;支付、刪除、批量提交、帳號變更、對外發布內容，要保留人工確認。&lt;/li&gt;
&lt;li&gt;skill 要寫明驗證日期和適用範圍。&lt;/li&gt;
&lt;li&gt;站點改版後，要允許 skill 失效並重新驗證。&lt;/li&gt;
&lt;li&gt;不要把繞過風控、規避平台限制當成目標。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;換句話說，domain skill 是讓 Agent 更穩，不是讓 Agent 無限制地做事。&lt;/p&gt;
&lt;h2 id=&#34;簡單結論&#34;&gt;簡單結論
&lt;/h2&gt;&lt;p&gt;browser-harness 的 &lt;code&gt;domain skills&lt;/code&gt; 機制說明了一件事：AI Agent 的瀏覽器自動化，不能只靠模型臨場發揮。&lt;/p&gt;
&lt;p&gt;一個可用的瀏覽器 Agent，至少需要三層能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;底層控制能力：截圖、點擊、輸入、下載、CDP、HTTP。&lt;/li&gt;
&lt;li&gt;站點級知識：API 優先級、穩定選擇器、元件陷阱、登入邊界。&lt;/li&gt;
&lt;li&gt;人類安全規則：憑據不交給模型，高風險操作要確認，敏感資訊不寫進 skill。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;domain skills&lt;/code&gt; 補的是第二層。它讓 Agent 帶著驗證過的經驗進入網頁任務，而不是每次都重新摸索。&lt;/p&gt;
&lt;p&gt;參考資料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;browser-harness domain skills：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/tree/main/agent-workspace/domain-skills&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/tree/main/agent-workspace/domain-skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Amazon product-search skill：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/amazon/product-search.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/amazon/product-search.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ArXiv scraping skill：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/arxiv/scraping.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/arxiv/scraping.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub scraping skill：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/github/scraping.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/github/scraping.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LinkedIn invitation-manager skill：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/linkedin/invitation-manager.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/linkedin/invitation-manager.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Shopify admin skill：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/shopify-admin/README.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/shopify-admin/README.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Browser Use Cloud skill：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/browser-use-cloud/cloud.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/agent-workspace/domain-skills/browser-use-cloud/cloud.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>browser-harness、Playwright、Puppeteer 怎麼選？瀏覽器自動化工具對比</title>
        <link>https://knightli.com/zh-tw/2026/05/24/browser-harness-playwright-puppeteer-comparison/</link>
        <pubDate>Sun, 24 May 2026 17:51:28 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/05/24/browser-harness-playwright-puppeteer-comparison/</guid>
        <description>&lt;p&gt;在瀏覽器自動化和自動化測試領域，&lt;code&gt;Playwright&lt;/code&gt; 和 &lt;code&gt;Puppeteer&lt;/code&gt; 是最常被拿來比較的兩個工具。它們都可以控制瀏覽器、點擊頁面、抓取內容、產生截圖或 PDF，也都和 Chrome DevTools Protocol 有很深關係。&lt;/p&gt;
&lt;p&gt;但如果把 &lt;code&gt;browser-use/browser-harness&lt;/code&gt; 放進來，問題就不只是「哪個測試框架更強」，而是變成兩類工具的對比：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Playwright&lt;/code&gt; / &lt;code&gt;Puppeteer&lt;/code&gt;：面向人類工程師寫確定性腳本。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser-harness&lt;/code&gt;：面向 AI Agent 操作真實瀏覽器。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前者適合測試、爬蟲和工程化自動化；後者更像給 Claude Code、Codex CLI、Gemini 這類 Agent 準備的瀏覽器控制層。&lt;/p&gt;
&lt;h2 id=&#34;playwright-和-puppeteer-的關係&#34;&gt;Playwright 和 Puppeteer 的關係
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Puppeteer&lt;/code&gt; 最早由 Google Chrome 團隊推出，天然服務於 Chromium 和 Chrome 自動化。它的 API 簡潔，生態成熟，特別適合圍繞 Chrome 做截圖、PDF、頁面抓取和輕量自動化。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Playwright&lt;/code&gt; 由 Microsoft 維護，背後團隊和早期 Puppeteer 有很深淵源。它吸收了 Puppeteer 的很多經驗，同時把跨瀏覽器、自動等待、上下文隔離、測試報告和調試工具鏈做得更完整。&lt;/p&gt;
&lt;p&gt;簡單說：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;只圍繞 Chrome 做輕量任務，&lt;code&gt;Puppeteer&lt;/code&gt; 仍然很順手。&lt;/li&gt;
&lt;li&gt;做跨瀏覽器 E2E 測試、複雜 SPA 自動化和團隊測試工程，&lt;code&gt;Playwright&lt;/code&gt; 通常更合適。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;核心區別總覽&#34;&gt;核心區別總覽
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;維度&lt;/th&gt;
          &lt;th&gt;Puppeteer&lt;/th&gt;
          &lt;th&gt;Playwright&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;主導方&lt;/td&gt;
          &lt;td&gt;Google&lt;/td&gt;
          &lt;td&gt;Microsoft&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;瀏覽器支援&lt;/td&gt;
          &lt;td&gt;主要面向 Chrome / Chromium&lt;/td&gt;
          &lt;td&gt;Chromium、Firefox、WebKit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;語言支援&lt;/td&gt;
          &lt;td&gt;主要是 JavaScript / TypeScript&lt;/td&gt;
          &lt;td&gt;JavaScript / TypeScript、Python、Java、.NET&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;自動等待&lt;/td&gt;
          &lt;td&gt;需要更多顯式等待&lt;/td&gt;
          &lt;td&gt;Locator 和 auto-waiting 更完整&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;多上下文隔離&lt;/td&gt;
          &lt;td&gt;支援，但不是最突出的優勢&lt;/td&gt;
          &lt;td&gt;BrowserContext 體驗很強&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;工具鏈&lt;/td&gt;
          &lt;td&gt;簡潔、成熟、偏基礎&lt;/td&gt;
          &lt;td&gt;Codegen、Trace Viewer、測試報告更完整&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;典型場景&lt;/td&gt;
          &lt;td&gt;Chrome 自動化、截圖、PDF、輕量抓取&lt;/td&gt;
          &lt;td&gt;跨瀏覽器 E2E 測試、複雜前端應用自動化&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;瀏覽器支援&#34;&gt;瀏覽器支援
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Puppeteer&lt;/code&gt; 的優勢在 Chrome。它和 Chromium 結合緊密，如果你的目標就是控制 Chrome、產生 PDF、截圖、跑簡單爬蟲，Puppeteer 的心智負擔很低。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Playwright&lt;/code&gt; 的優勢在跨瀏覽器。它原生支援 Chromium、Firefox 和 WebKit。WebKit 這一點很關鍵，因為很多 Safari 相關問題不能只靠 Chrome 測出來。對需要覆蓋桌面端、行動端和不同瀏覽器核心的應用來說，Playwright 更適合作為主力工具。&lt;/p&gt;
&lt;p&gt;這也是兩者選擇的第一道分界線：只看 Chrome，可以用 Puppeteer；要認真做跨瀏覽器測試，優先 Playwright。&lt;/p&gt;
&lt;h2 id=&#34;自動等待與穩定性&#34;&gt;自動等待與穩定性
&lt;/h2&gt;&lt;p&gt;瀏覽器自動化最煩人的問題，往往不是「不會點擊」，而是頁面還沒準備好。元素可能還沒掛到 DOM，可能被遮擋，可能正在動畫中，可能按鈕還是 disabled。&lt;/p&gt;
&lt;p&gt;Puppeteer 裡經常會寫：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;waitForSelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這沒有問題，但等待邏輯需要工程師自己想清楚。頁面越複雜，腳本裡越容易出現各種 &lt;code&gt;waitForSelector&lt;/code&gt;、&lt;code&gt;waitForTimeout&lt;/code&gt; 和重試邏輯。&lt;/p&gt;
&lt;p&gt;Playwright 的 Locator 機制和自動等待更完整：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;locator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在點擊之前，Playwright 會自動檢查元素是否可見、可操作、穩定、沒有被遮擋，並在合理時間內重試。這對 React、Vue、Next.js 這類非同步渲染很多的現代 Web 應用尤其重要，可以明顯減少 flaky test。&lt;/p&gt;
&lt;h2 id=&#34;多帳號和上下文隔離&#34;&gt;多帳號和上下文隔離
&lt;/h2&gt;&lt;p&gt;如果你要模擬多個使用者，或者想讓多個任務共享同一個瀏覽器行程但隔離 Cookie、LocalStorage 和 Session，&lt;code&gt;BrowserContext&lt;/code&gt; 就很重要。&lt;/p&gt;
&lt;p&gt;Puppeteer 也支援上下文隔離，但 Playwright 把這件事做成了核心能力。你可以在一個瀏覽器實例裡快速建立多個獨立 context，每個 context 像一個乾淨的瀏覽器環境，卻不需要反覆啟動完整瀏覽器行程。&lt;/p&gt;
&lt;p&gt;這對這些場景很有價值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多帳號並發測試。&lt;/li&gt;
&lt;li&gt;多角色協作流程測試。&lt;/li&gt;
&lt;li&gt;電商、IM、協作文檔等多使用者場景。&lt;/li&gt;
&lt;li&gt;需要隔離 Cookie 和登入狀態的爬取任務。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;工具鏈差異&#34;&gt;工具鏈差異
&lt;/h2&gt;&lt;p&gt;Playwright 是更工程化的方案。它內建了很多測試開發會用到的工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;codegen&lt;/code&gt;：在網頁上操作，自動產生腳本。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Trace Viewer&lt;/code&gt;：失敗後回看每一步的截圖、DOM、網路請求和 console 日誌。&lt;/li&gt;
&lt;li&gt;Test Runner：支援斷言、並行、重試、報告和專案矩陣。&lt;/li&gt;
&lt;li&gt;Locator：支援按文字、角色、label、test id 等方式定位元素。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puppeteer 則更像一個輕量瀏覽器控制庫。它不臃腫，API 直接，適合嵌入腳本、服務端任務和自定義自動化流程。&lt;/p&gt;
&lt;p&gt;如果你要搭企業級測試體系，Playwright 的配套工具會省很多事。如果你只是要寫一個 Node.js 腳本，把網頁轉 PDF 或定時截圖，Puppeteer 反而更乾脆。&lt;/p&gt;
&lt;h2 id=&#34;browser-harness-放在哪裡&#34;&gt;browser-harness 放在哪裡
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;browser-harness&lt;/code&gt; 和 Playwright、Puppeteer 不是同一類工具。&lt;/p&gt;
&lt;p&gt;Playwright 和 Puppeteer 主要假設「人類寫腳本」。人類工程師要決定選擇器、等待條件、斷言邏輯和異常處理。它們追求的是確定性：同樣的腳本，在同樣的頁面狀態下，應該給出同樣的結果。&lt;/p&gt;
&lt;p&gt;browser-harness 主要假設「AI Agent 操作瀏覽器」。它的目標不是提供一套巨大的高階 API，而是透過 CDP 連接真實 Chrome，把截圖、座標點擊、DOM、網路請求和 helper 暴露給 Agent。Agent 可以觀察頁面、判斷下一步、遇到缺能力時補 helper，再把站點經驗沉澱成 skill。&lt;/p&gt;
&lt;p&gt;這就讓它更適合開放任務：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;登入後台後下載帳單。&lt;/li&gt;
&lt;li&gt;在內部系統裡填一組表單。&lt;/li&gt;
&lt;li&gt;處理經常改版的 OA 或 SaaS 頁面。&lt;/li&gt;
&lt;li&gt;按使用者目標探索頁面，而不是執行固定腳本。&lt;/li&gt;
&lt;li&gt;讓 Claude Code、Codex CLI 這類工具擁有瀏覽器操作能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三者核心對比&#34;&gt;三者核心對比
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;維度&lt;/th&gt;
          &lt;th&gt;Puppeteer&lt;/th&gt;
          &lt;th&gt;Playwright&lt;/th&gt;
          &lt;th&gt;browser-harness&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;面向對象&lt;/td&gt;
          &lt;td&gt;人類工程師&lt;/td&gt;
          &lt;td&gt;人類工程師和測試團隊&lt;/td&gt;
          &lt;td&gt;AI Agent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;主要目標&lt;/td&gt;
          &lt;td&gt;控制 Chrome&lt;/td&gt;
          &lt;td&gt;穩定跨瀏覽器自動化&lt;/td&gt;
          &lt;td&gt;讓 Agent 操作真實瀏覽器&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;腳本方式&lt;/td&gt;
          &lt;td&gt;手寫 JS/TS 自動化&lt;/td&gt;
          &lt;td&gt;手寫腳本 + 測試框架&lt;/td&gt;
          &lt;td&gt;使用者下目標，Agent 分步執行&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;元素定位&lt;/td&gt;
          &lt;td&gt;CSS、XPath、DOM API&lt;/td&gt;
          &lt;td&gt;Locator、文字、角色、CSS&lt;/td&gt;
          &lt;td&gt;截圖視覺、座標、DOM、CDP&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;等待機制&lt;/td&gt;
          &lt;td&gt;更多手動控制&lt;/td&gt;
          &lt;td&gt;自動等待很強&lt;/td&gt;
          &lt;td&gt;由 Agent 觀察和調整&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;瀏覽器環境&lt;/td&gt;
          &lt;td&gt;通常啟動自動化瀏覽器&lt;/td&gt;
          &lt;td&gt;通常啟動測試瀏覽器&lt;/td&gt;
          &lt;td&gt;常連接真實 Chrome&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;最適合&lt;/td&gt;
          &lt;td&gt;Chrome 腳本、截圖、PDF、輕量抓取&lt;/td&gt;
          &lt;td&gt;E2E 測試、跨瀏覽器驗證、複雜 SPA&lt;/td&gt;
          &lt;td&gt;AI 助手、開放網頁任務、真實帳號工作流&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;程式碼體感對比&#34;&gt;程式碼體感對比
&lt;/h2&gt;&lt;p&gt;Puppeteer 更像直接控制 Chrome：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;puppeteer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;puppeteer&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;puppeteer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;launch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newPage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;goto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;waitForSelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;})();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Playwright 更強調 Locator 和自動等待：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;chromium&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;playwright&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;chromium&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;launch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newPage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;goto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;locator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;})();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;browser-harness 的使用體感則完全不同。你通常不是寫完整腳本，而是在 Agent 環境裡下達目標：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;幫我打開後台，下載上個月的帳單，並整理成報銷用的文件。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Agent 會借助 browser-harness 反覆執行類似流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;截圖，理解目前頁面。&lt;/li&gt;
&lt;li&gt;點擊某個座標或定位某個元素。&lt;/li&gt;
&lt;li&gt;輸入文字、上傳檔案、下載檔案。&lt;/li&gt;
&lt;li&gt;遇到彈窗時判斷如何關閉。&lt;/li&gt;
&lt;li&gt;缺少 helper 時補充程式碼。&lt;/li&gt;
&lt;li&gt;把可重用流程沉澱為 domain skill。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這不是傳統測試腳本的寫法，而是瀏覽器 Agent 的工作方式。&lt;/p&gt;
&lt;h2 id=&#34;怎麼選&#34;&gt;怎麼選
&lt;/h2&gt;&lt;p&gt;選擇 &lt;code&gt;Puppeteer&lt;/code&gt;，通常是因為：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;專案主要跑在 Node.js 裡。&lt;/li&gt;
&lt;li&gt;只需要 Chrome 或 Chromium。&lt;/li&gt;
&lt;li&gt;任務是截圖、PDF、簡單頁面抓取或輕量自動化。&lt;/li&gt;
&lt;li&gt;你希望 API 簡潔、依賴少，自己控制更多細節。&lt;/li&gt;
&lt;li&gt;你對 Chrome DevTools Protocol 有較深依賴。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;選擇 &lt;code&gt;Playwright&lt;/code&gt;，通常是因為：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你要做標準 UI 自動化或 E2E 測試。&lt;/li&gt;
&lt;li&gt;需要覆蓋 Chromium、Firefox 和 WebKit。&lt;/li&gt;
&lt;li&gt;團隊主語言可能是 Python、Java 或 C#。&lt;/li&gt;
&lt;li&gt;頁面是複雜 SPA，非同步狀態多，容易出現 flaky test。&lt;/li&gt;
&lt;li&gt;你需要 codegen、Trace Viewer、測試報告和並行測試。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;選擇 &lt;code&gt;browser-harness&lt;/code&gt;，通常是因為：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你在開發或使用 AI Agent。&lt;/li&gt;
&lt;li&gt;你希望模型像人一樣操作真實瀏覽器。&lt;/li&gt;
&lt;li&gt;任務步驟不固定，需要邊看頁面邊判斷。&lt;/li&gt;
&lt;li&gt;目標網站經常改版，或者彈窗、iframe、shadow DOM 很多。&lt;/li&gt;
&lt;li&gt;你想把真實網頁工作流交給 Claude Code、Codex CLI 等工具處理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;簡單結論&#34;&gt;簡單結論
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Playwright&lt;/code&gt; 和 &lt;code&gt;Puppeteer&lt;/code&gt; 是瀏覽器自動化工具，核心是讓人寫出可靠腳本。兩者相比，Puppeteer 更輕、更貼近 Chrome；Playwright 更完整、更適合跨瀏覽器測試和複雜前端應用。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;browser-harness&lt;/code&gt; 則是另一個方向：它不是為了取代 Playwright 或 Puppeteer 寫測試，而是為了讓 AI Agent 接管真實瀏覽器。它犧牲了一部分傳統腳本的確定性，換來更強的開放任務適應能力。&lt;/p&gt;
&lt;p&gt;所以答案不是三選一，而是按任務分層：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;測試工程：優先 Playwright。&lt;/li&gt;
&lt;li&gt;Chrome 輕量腳本：Puppeteer 很合適。&lt;/li&gt;
&lt;li&gt;AI Agent 上網辦事：看 browser-harness。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;參考資料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;browser-use/browser-harness：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Playwright 官方文件：&lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://playwright.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Puppeteer 官方文件：&lt;a class=&#34;link&#34; href=&#34;https://pptr.dev/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://pptr.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chrome DevTools Protocol：&lt;a class=&#34;link&#34; href=&#34;https://chromedevtools.github.io/devtools-protocol/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://chromedevtools.github.io/devtools-protocol/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>browser-harness 是什麼？讓 AI Agent 接管真實 Chrome 的瀏覽器自動化工具</title>
        <link>https://knightli.com/zh-tw/2026/05/24/browser-use-browser-harness-ai-agent-browser-automation/</link>
        <pubDate>Sun, 24 May 2026 17:19:54 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/05/24/browser-use-browser-harness-ai-agent-browser-automation/</guid>
        <description>&lt;p&gt;&lt;code&gt;browser-use/browser-harness&lt;/code&gt; 是一個面向 AI Agent 的瀏覽器控制工具。它的目標不是再做一層複雜的自動化框架，而是把大模型直接連到真實 Chrome，透過 CDP 完成瀏覽、點擊、截圖、下載、上傳和表單操作。&lt;/p&gt;
&lt;p&gt;專案 README 對自己的定位很明確：用一層很薄、可編輯的 CDP harness，讓 LLM 直接連接真實瀏覽器；當任務中缺少 helper 時，Agent 可以在執行過程中補上程式碼，並把可重用經驗沉澱成 domain skills。&lt;/p&gt;
&lt;p&gt;這類工具值得關注，是因為瀏覽器仍然是很多真實工作的入口：後台系統、SaaS 面板、電商頁面、招聘網站、CRM、報銷系統、雲控制台、文件平台，往往沒有穩定 API，或者 API 權限比網頁權限更難拿到。讓 Agent 能可靠操作瀏覽器，本質上是在補齊自動化的最後一段距離。&lt;/p&gt;
&lt;h2 id=&#34;browser-harness-是什麼&#34;&gt;browser-harness 是什麼
&lt;/h2&gt;&lt;p&gt;從結構看，browser-harness 更像一個給 Agent 用的瀏覽器執行環境，而不是普通使用者手動點擊的瀏覽器外掛。&lt;/p&gt;
&lt;p&gt;它的核心思路有幾個：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;直接連接 Chrome 或 Chromium。&lt;/li&gt;
&lt;li&gt;透過 CDP WebSocket 操作頁面。&lt;/li&gt;
&lt;li&gt;讓 Agent 組合截圖、座標點擊、DOM、網路請求和原始 CDP 完成任務。&lt;/li&gt;
&lt;li&gt;把任務相關 helper 放在 &lt;code&gt;agent-workspace/agent_helpers.py&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;把站點相關經驗沉澱到 &lt;code&gt;agent-workspace/domain-skills/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;保持核心很薄，避免做成龐大的自動化平台。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;README 提到，專案核心架構大約是 4 個核心檔案、約 1000 行程式碼，主要包括 &lt;code&gt;install.md&lt;/code&gt;、&lt;code&gt;SKILL.md&lt;/code&gt;、&lt;code&gt;src/browser_harness/&lt;/code&gt;、&lt;code&gt;agent-workspace/agent_helpers.py&lt;/code&gt; 和 &lt;code&gt;agent-workspace/domain-skills/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;這種設計的重點不是內建所有網站能力，而是給 Agent 一個足夠貼近真實瀏覽器的操作層，讓它在具體任務裡補齊缺失能力。&lt;/p&gt;
&lt;h2 id=&#34;它和傳統瀏覽器自動化有什麼不同&#34;&gt;它和傳統瀏覽器自動化有什麼不同
&lt;/h2&gt;&lt;p&gt;傳統瀏覽器自動化通常圍繞測試框架展開，例如 Playwright、Selenium 或 Puppeteer。它們適合寫確定性的測試腳本：打開頁面、定位元素、點擊、斷言結果。&lt;/p&gt;
&lt;p&gt;browser-harness 面向的是另一類任務：使用者說一句目標，Agent 自己探索頁面、判斷狀態、處理彈窗、補 helper、複用站點經驗。它強調的是互動過程中的適應性。&lt;/p&gt;
&lt;p&gt;差異可以這樣理解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Playwright 更適合人寫腳本，Agent 執行腳本。&lt;/li&gt;
&lt;li&gt;browser-harness 更適合 Agent 邊看頁面邊行動。&lt;/li&gt;
&lt;li&gt;傳統自動化偏固定流程。&lt;/li&gt;
&lt;li&gt;browser-harness 偏開放任務。&lt;/li&gt;
&lt;li&gt;傳統腳本常依賴選擇器。&lt;/li&gt;
&lt;li&gt;browser-harness 鼓勵先截圖、再按可見介面行動，必要時再回到 DOM 或 CDP。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這不表示它要取代 Playwright。對穩定測試來說，Playwright 仍然更成熟。browser-harness 的價值在於把真實網頁變成 Agent 可操作的環境，尤其適合頁面結構複雜、步驟不固定、需要臨場判斷的任務。&lt;/p&gt;
&lt;h2 id=&#34;為什麼強調真實-chrome&#34;&gt;為什麼強調真實 Chrome
&lt;/h2&gt;&lt;p&gt;很多瀏覽器 Agent 工具會使用隔離的無頭瀏覽器。這樣部署簡單，也適合批量任務，但它有一個現實問題：使用者真實工作裡的登入狀態、擴充功能、歷史記錄、書籤和日常瀏覽器環境，不一定能直接複用。&lt;/p&gt;
&lt;p&gt;browser-harness 支援連接本機 Chrome，也支援 Browser Use cloud browser。對本機瀏覽器，它提供兩種方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;透過 &lt;code&gt;chrome://inspect/#remote-debugging&lt;/code&gt; 允許目前 Chrome 實例被連接。&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;--remote-debugging-port=9222 --user-data-dir=...&lt;/code&gt; 啟動一個隔離 profile。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果要讓 Agent 幫你處理真實帳號裡的任務，專案文件更傾向第一種方式，因為它能複用日常 Chrome 的登入狀態、擴充功能和書籤。如果要做無人值守自動化，或者不希望被彈窗打斷，則更適合使用隔離 profile 或雲瀏覽器。&lt;/p&gt;
&lt;p&gt;這裡的取捨很清楚：真實瀏覽器更貼近使用者工作流，但安全邊界也更敏感；隔離瀏覽器更適合自動化，但需要重新處理登入和環境。&lt;/p&gt;
&lt;h2 id=&#34;可編輯-helper-與-domain-skills&#34;&gt;可編輯 helper 與 domain skills
&lt;/h2&gt;&lt;p&gt;browser-harness 最有意思的地方，是它把「Agent 會學到什麼」設計進了專案結構。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;agent-workspace/agent_helpers.py&lt;/code&gt; 用來放任務中臨時補出的 helper。比如 Agent 做檔案上傳時發現現有能力不夠，可以補一個穩定的上傳函式；下次再遇到類似頁面，就不用從零開始。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;agent-workspace/domain-skills/&lt;/code&gt; 則用來放站點級經驗。README 裡舉的方向包括 LinkedIn outreach、Amazon 下單、報銷系統等。專案建議不要手寫這些 skill，而是讓 Agent 在真實任務中發現可重用流程後再生成，這樣更貼近實際頁面行為。&lt;/p&gt;
&lt;p&gt;這個思路很適合瀏覽器自動化。因為網頁自動化的難點往往不是「怎麼點擊按鈕」，而是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;某個網站的登入後頁面怎麼跳轉。&lt;/li&gt;
&lt;li&gt;哪些彈窗會擋住主流程。&lt;/li&gt;
&lt;li&gt;哪些 selector 穩定，哪些只是臨時樣式名。&lt;/li&gt;
&lt;li&gt;上傳、下載、iframe、shadow DOM、跨域元件怎麼處理。&lt;/li&gt;
&lt;li&gt;某個後台系統有哪些隱藏等待和非同步狀態。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這些知識如果只留在一次執行日誌裡，很快就會丟掉。把它們沉澱成 domain skills，才可能讓 Agent 越用越順。&lt;/p&gt;
&lt;h2 id=&#34;適合哪些場景&#34;&gt;適合哪些場景
&lt;/h2&gt;&lt;p&gt;browser-harness 更適合以下任務：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;幫使用者操作真實網頁後台。&lt;/li&gt;
&lt;li&gt;在沒有 API 的系統裡完成重複流程。&lt;/li&gt;
&lt;li&gt;登入狀態依賴強的個人或企業網頁任務。&lt;/li&gt;
&lt;li&gt;需要截圖判斷頁面狀態的複雜互動。&lt;/li&gt;
&lt;li&gt;Agent 需要在執行中補工具、補站點經驗。&lt;/li&gt;
&lt;li&gt;多個子 Agent 各自使用獨立瀏覽器執行任務。&lt;/li&gt;
&lt;li&gt;研究瀏覽器 Agent 的執行環境設計。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;具體例子包括：整理網頁表格、提交內部系統表單、下載帳單、上傳檔案、處理報銷流程、檢查訂單狀態、在 SaaS 控制台裡配置資源、從登入後的網頁提取資訊。&lt;/p&gt;
&lt;p&gt;如果任務只是抓取靜態網頁，未必需要瀏覽器。專案自己的 &lt;code&gt;SKILL.md&lt;/code&gt; 也提到，靜態頁面可以直接用 HTTP 批量取得；瀏覽器應該留給真正需要頁面狀態、登入狀態和互動的場景。&lt;/p&gt;
&lt;h2 id=&#34;需要注意的風險&#34;&gt;需要注意的風險
&lt;/h2&gt;&lt;p&gt;讓 AI Agent 接管真實 Chrome，很強，也很危險。&lt;/p&gt;
&lt;p&gt;第一，權限邊界要清楚。真實 Chrome 裡可能有信箱、支付後台、雲控制台、公司系統和個人帳號。Agent 一旦能操作瀏覽器，就等於獲得了這些網頁權限的一部分。&lt;/p&gt;
&lt;p&gt;第二，不要把憑證交給模型。遇到登入頁、支付驗證、二次確認等敏感步驟，應該讓使用者自己處理。Agent 可以等待登入完成，但不應該從截圖裡讀取或輸入密碼、驗證碼、支付資訊。&lt;/p&gt;
&lt;p&gt;第三，自動化不等於可託管。很多網頁任務看似簡單，但中間可能出現風控、誤點擊、資料刪除、批量提交、不可逆操作。適合先從唯讀、低風險、可回復的流程開始。&lt;/p&gt;
&lt;p&gt;第四，domain skills 需要避免洩露隱私。站點經驗可以公開，但不要把帳號、內部 URL、客戶資料、座標流水或一次性任務細節寫進去。&lt;/p&gt;
&lt;p&gt;第五，真實瀏覽器連接方式要謹慎選擇。如果要複用日常登入狀態，使用目前 Chrome 很方便；如果要跑長時間自動化，隔離 profile 或雲瀏覽器更可控。&lt;/p&gt;
&lt;h2 id=&#34;對-ai-agent-工具的意義&#34;&gt;對 AI Agent 工具的意義
&lt;/h2&gt;&lt;p&gt;browser-harness 代表了一種很務實的 Agent 工具路線：少做平台，多給模型一個可以直接觸達真實環境的介面。&lt;/p&gt;
&lt;p&gt;過去很多 Agent 失敗在兩端。一端是模型會推理，但摸不到真實頁面；另一端是自動化框架很強，但需要人先把流程寫死。browser-harness 試圖把這兩端接起來：瀏覽器負責真實世界的狀態，Agent 負責觀察、判斷和補工具。&lt;/p&gt;
&lt;p&gt;這也是「自我改進 harness」的意義。它不是說 Agent 會神奇地變聰明，而是把可重用的操作經驗放到專案結構裡，讓下一次任務少走彎路。&lt;/p&gt;
&lt;p&gt;對開發者來說，browser-harness 的價值主要在三個層面：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;作為個人 Agent 的瀏覽器控制層。&lt;/li&gt;
&lt;li&gt;作為研究瀏覽器自動化和 Agent 工作流的樣本。&lt;/li&gt;
&lt;li&gt;作為把網頁流程變成可重用技能的實驗框架。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它不是所有瀏覽器自動化問題的答案，但它給出了一個清晰方向：當 Agent 真正要幫人做事時，工具層不只要能呼叫 API，也要能理解和操作人類每天使用的網頁介面。&lt;/p&gt;
&lt;h2 id=&#34;簡單結論&#34;&gt;簡單結論
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;browser-use/browser-harness&lt;/code&gt; 值得關注，不是因為它包裝了多少高階功能，而是因為它把瀏覽器 Agent 的幾個關鍵問題擺在了台面上：真實 Chrome、CDP、截圖驅動、可編輯 helper、站點技能沉澱，以及使用者權限邊界。&lt;/p&gt;
&lt;p&gt;如果你只是寫穩定端到端測試，繼續用 Playwright 或 Selenium 就很好。如果你想讓 Codex、Claude Code 這類 Agent 直接幫你處理真實網頁任務，browser-harness 提供了一個更貼近 Agent 工作方式的入口。&lt;/p&gt;
&lt;p&gt;真正使用時，建議從低風險任務開始：先讓它讀頁面、截圖、提取資訊，再逐步嘗試點擊和提交。等你確認它能穩定識別頁面狀態，再考慮讓它接管更長的流程。&lt;/p&gt;
&lt;p&gt;參考資料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub 專案：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;README：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/README.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/README.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;安裝文件：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/install.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/install.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;使用說明：&lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness/blob/main/SKILL.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness/blob/main/SKILL.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>CloakBrowser 是什麼？給 Playwright 和 Puppeteer 換一個更像真實用戶的瀏覽器</title>
        <link>https://knightli.com/zh-tw/2026/05/19/cloakbrowser-stealth-chromium-browser-automation/</link>
        <pubDate>Tue, 19 May 2026 10:56:50 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/05/19/cloakbrowser-stealth-chromium-browser-automation/</guid>
        <description>&lt;p&gt;&lt;code&gt;CloakHQ/CloakBrowser&lt;/code&gt; 是一個面向瀏覽器自動化的開源項目。它不是普通的 Playwright 配置，也不是單純注入一段 JavaScript，而是圍繞自定義 Chromium 二進制構建，讓瀏覽器指紋、WebGL、Canvas、音頻、字體、GPU、屏幕信息、WebRTC、網絡時序等信號更接近真實瀏覽器。&lt;/p&gt;
&lt;p&gt;項目地址：&lt;a class=&#34;link&#34; href=&#34;https://github.com/CloakHQ/CloakBrowser&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/CloakHQ/CloakBrowser&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;截至寫作時，GitHub API 顯示這個倉庫已有約 1.5 萬 star，主要語言是 Python，許可證爲 MIT。README 對它的定位很直接：一個可替代 Playwright / Puppeteer 啓動器的 Stealth Chromium。&lt;/p&gt;
&lt;h2 id=&#34;它解決什麼問題&#34;&gt;它解決什麼問題
&lt;/h2&gt;&lt;p&gt;很多自動化腳本在普通 Headless Chromium 下會暴露明顯自動化特徵，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;navigator.webdriver&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;Headless UA 泄漏。&lt;/li&gt;
&lt;li&gt;插件、字體、屏幕、GPU 等指紋不自然。&lt;/li&gt;
&lt;li&gt;CDP 行爲和真實用戶輸入不一致。&lt;/li&gt;
&lt;li&gt;默認臨時 profile 缺少正常瀏覽痕跡。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CloakBrowser 的思路是把一部分指紋修改放到 Chromium 源碼層，而不是隻在運行時做配置或 JS patch。這樣對 Playwright 用戶來說，使用方式仍然接近原來的瀏覽器自動化 API，但底層瀏覽器換成了項目提供的自定義構建。&lt;/p&gt;
&lt;p&gt;這類工具適合做合規的自動化測試、站點兼容性驗證、反爬系統自測、Agent 瀏覽器環境實驗。不要把它用於未授權訪問、賬號濫用、繞過平臺風控或違反服務條款的場景。&lt;/p&gt;
&lt;h2 id=&#34;基本使用方式&#34;&gt;基本使用方式
&lt;/h2&gt;&lt;p&gt;Python 安裝：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install cloakbrowser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;JavaScript / Node.js 安裝：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install cloakbrowser playwright-core
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;README 給出的 Python 示例很接近 Playwright：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;cloakbrowser&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;launch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;launch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new_page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;goto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://protected-site.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;JavaScript 示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;launch&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;cloakbrowser&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;launch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newPage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;goto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://protected-site.com&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;第一次運行時，項目會自動下載對應平臺的 Chromium 二進制文件，README 提到體積約 200MB，並會緩存到本地。&lt;/p&gt;
&lt;h2 id=&#34;browser-profile-manager&#34;&gt;Browser Profile Manager
&lt;/h2&gt;&lt;p&gt;CloakBrowser 還提供一個 Browser Profile Manager，可以自託管瀏覽器 profile，管理不同指紋、代理和持久會話。README 中的 Docker 啓動方式如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -p 8080:8080 -v cloakprofiles:/data cloakhq/cloakbrowser-manager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;啓動後打開：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;http://localhost:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這個方向更像開源的瀏覽器 profile 管理工具，適合需要多 profile、持久 cookie、隔離會話的自動化測試或內部 QA 場景。&lt;/p&gt;
&lt;h2 id=&#34;和普通-playwright-有什麼差別&#34;&gt;和普通 Playwright 有什麼差別
&lt;/h2&gt;&lt;p&gt;普通 Playwright 的優點是穩定、官方維護、API 成熟。CloakBrowser 的差別在於它使用自定義 Chromium，並提供一組源代碼級別的指紋 patch。&lt;/p&gt;
&lt;p&gt;README 裏列出的能力包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Canvas、WebGL、Audio、Fonts、GPU、Screen 等指紋處理。&lt;/li&gt;
&lt;li&gt;WebRTC IP spoofing。&lt;/li&gt;
&lt;li&gt;代理相關信號處理。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;humanize=True&lt;/code&gt; 模擬更自然的鼠標、鍵盤和滾動行爲。&lt;/li&gt;
&lt;li&gt;Python 與 JavaScript 雙端 API。&lt;/li&gt;
&lt;li&gt;Docker 鏡像與 CDP server 模式。&lt;/li&gt;
&lt;li&gt;持久 profile。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也就是說，它更適合對“瀏覽器環境真實性”有要求的自動化任務，而不是替代所有 Playwright 使用場景。&lt;/p&gt;
&lt;h2 id=&#34;使用時要注意什麼&#34;&gt;使用時要注意什麼
&lt;/h2&gt;&lt;p&gt;第一，瀏覽器自動化和反檢測相關工具有很強的合規邊界。它可以用於測試自己的站點、驗證自動化環境、做內部 QA，也可以用於研究瀏覽器指紋；但不應被用於未經授權的抓取、賬號批量註冊、繞過訪問控制、攻擊或濫用服務。&lt;/p&gt;
&lt;p&gt;第二，README 中也說明，CloakBrowser 不內置代理輪換，也不是驗證碼解決服務。它提供瀏覽器層能力，網絡信譽、賬號信譽、行爲策略和目標站點規則仍然會影響結果。&lt;/p&gt;
&lt;p&gt;第三，自定義 Chromium 二進制意味着供應鏈安全要額外關注。正式使用前建議檢查版本、二進制來源、簽名說明、許可證和更新機制。&lt;/p&gt;
&lt;h2 id=&#34;適合誰&#34;&gt;適合誰
&lt;/h2&gt;&lt;p&gt;適合三類用戶：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;已經在用 Playwright / Puppeteer，但需要更接近真實瀏覽器環境的開發者。&lt;/li&gt;
&lt;li&gt;做瀏覽器自動化測試、兼容性測試或反爬策略驗證的團隊。&lt;/li&gt;
&lt;li&gt;需要給 AI Agent 提供瀏覽器執行環境的開發者。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果只是普通網頁測試，原生 Playwright 已經夠用。如果目標是研究瀏覽器指紋、profile 隔離和真實瀏覽器行爲，CloakBrowser 值得關注。&lt;/p&gt;
&lt;h2 id=&#34;小結&#34;&gt;小結
&lt;/h2&gt;&lt;p&gt;CloakBrowser 的關鍵點不是“多寫一個自動化封裝”，而是把瀏覽器自動化的一部分僞裝能力下沉到 Chromium 構建層。它保留了 Playwright / Puppeteer 的使用習慣，同時提供自定義瀏覽器、profile 管理、Docker 和 CDP server。&lt;/p&gt;
&lt;p&gt;這類工具能力強，也更需要謹慎使用。判斷是否值得接入，重點看你的場景是否真的需要自定義 Chromium，而不是只因爲普通 Headless 瀏覽器被某些檢測服務標記。&lt;/p&gt;
&lt;p&gt;參考項目：&lt;a class=&#34;link&#34; href=&#34;https://github.com/CloakHQ/CloakBrowser&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/CloakHQ/CloakBrowser&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Playwright CLI 會話管理：多瀏覽器會話、隔離、持久化與清理</title>
        <link>https://knightli.com/zh-tw/2026/04/15/playwright-cli-session-management/</link>
        <pubDate>Wed, 15 Apr 2026 08:15:12 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/04/15/playwright-cli-session-management/</guid>
        <description>&lt;p&gt;如果你在用 &lt;code&gt;Playwright CLI&lt;/code&gt; 做自動化，很快就會碰到一個實際問題：同一時間裡，能不能開多個互不干擾的瀏覽器會話？答案是可以，而且 &lt;code&gt;Playwright CLI&lt;/code&gt; 已經把這套機制做得很直接。&lt;/p&gt;
&lt;p&gt;這篇就按照官方 &lt;code&gt;session-management&lt;/code&gt; 參考文件，整理它最實用的幾個部分：命名會話、會話隔離、持久化 profile、並發模式，以及常見清理命令。文中的命令列與命令區塊說明均按參考內容保留。&lt;/p&gt;
&lt;h2 id=&#34;01-命名瀏覽器會話&#34;&gt;01 命名瀏覽器會話
&lt;/h2&gt;&lt;p&gt;官方建議用 &lt;code&gt;-s&lt;/code&gt; 參數隔離不同瀏覽器上下文：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Browser 1: Authentication flow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;auth open https://app.example.com/login
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Browser 2: Public browsing (separate cookies, storage)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;public open https://example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Commands are isolated by browser session&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;auth fill e1 &lt;span class=&#34;s2&#34;&gt;&amp;#34;user@example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;public snapshot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這裡的重點是：不同 &lt;code&gt;session&lt;/code&gt; 名稱對應不同瀏覽器上下文。你可以把 &lt;code&gt;auth&lt;/code&gt; 用在登入流程，把 &lt;code&gt;public&lt;/code&gt; 用在匿名存取，它們之間不會共用 cookies 或本地狀態。&lt;/p&gt;
&lt;h2 id=&#34;02-瀏覽器會話隔離了什麼&#34;&gt;02 瀏覽器會話隔離了什麼
&lt;/h2&gt;&lt;p&gt;每個瀏覽器會話都會獨立維護下面這些內容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cookies&lt;/li&gt;
&lt;li&gt;LocalStorage / SessionStorage&lt;/li&gt;
&lt;li&gt;IndexedDB&lt;/li&gt;
&lt;li&gt;Cache&lt;/li&gt;
&lt;li&gt;Browsing history&lt;/li&gt;
&lt;li&gt;Open tabs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這意味著如果你在 &lt;code&gt;auth&lt;/code&gt; 會話裡登入了某個網站，並不會自動影響 &lt;code&gt;public&lt;/code&gt; 會話。做多帳號測試、登入態驗證、匿名對比時，這一點尤其重要。&lt;/p&gt;
&lt;h2 id=&#34;03-瀏覽器會話相關命令&#34;&gt;03 瀏覽器會話相關命令
&lt;/h2&gt;&lt;p&gt;官方文件把會話管理裡最常用的一組命令放在了一起：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# List all browser sessions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Stop a browser session (close the browser)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli close                 &lt;span class=&#34;c1&#34;&gt;# stop the default browser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mysession close   &lt;span class=&#34;c1&#34;&gt;# stop a named browser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Stop all browser sessions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli close-all
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Forcefully kill all daemon processes (for stale/zombie processes)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli kill-all
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Delete browser session user data (profile directory)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli delete-data              &lt;span class=&#34;c1&#34;&gt;# delete default browser data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mysession delete-data &lt;span class=&#34;c1&#34;&gt;# delete named browser data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可以把它們理解成三類操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;list&lt;/code&gt;：看目前有哪些會話&lt;/li&gt;
&lt;li&gt;&lt;code&gt;close&lt;/code&gt; / &lt;code&gt;close-all&lt;/code&gt; / &lt;code&gt;kill-all&lt;/code&gt;：結束會話或清理卡住的瀏覽器程序&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete-data&lt;/code&gt;：刪除某個會話對應的使用者資料目錄&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你只是結束瀏覽器，通常先用 &lt;code&gt;close&lt;/code&gt;；如果已經出現殘留程序或殭屍程序，再用 &lt;code&gt;kill-all&lt;/code&gt; 會更合適。&lt;/p&gt;
&lt;h2 id=&#34;04-用環境變數設定預設會話&#34;&gt;04 用環境變數設定預設會話
&lt;/h2&gt;&lt;p&gt;如果你不想每條命令都重複寫 &lt;code&gt;-s=mysession&lt;/code&gt;，官方還提供了環境變數方式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PLAYWRIGHT_CLI_SESSION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;mysession&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli open example.com  &lt;span class=&#34;c1&#34;&gt;# Uses &amp;#34;mysession&amp;#34; automatically&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這樣之後不顯式指定 &lt;code&gt;-s&lt;/code&gt; 時，命令就會預設使用 &lt;code&gt;mysession&lt;/code&gt; 這個瀏覽器會話。&lt;/p&gt;
&lt;h2 id=&#34;05-常見模式並發抓取&#34;&gt;05 常見模式：並發抓取
&lt;/h2&gt;&lt;p&gt;參考文件給了一個很典型的並發抓取例子：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Scrape multiple sites concurrently&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Start all browsers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;site1 open https://site1.com &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;site2 open https://site2.com &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;site3 open https://site3.com &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;wait&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Take snapshots from each&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;site1 snapshot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;site2 snapshot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;site3 snapshot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Cleanup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli close-all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這個模式適合同時打開多個站點，各自抓取頁面狀態，再統一清理。因為每個站點都跑在獨立會話裡，所以不會互相污染本地狀態。&lt;/p&gt;
&lt;h2 id=&#34;06-常見模式ab-測試會話&#34;&gt;06 常見模式：A/B 測試會話
&lt;/h2&gt;&lt;p&gt;另一個常見場景，是同時對比不同實驗版本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Test different user experiences&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;variant-a open &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://app.com?variant=a&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;variant-b open &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://app.com?variant=b&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Compare&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;variant-a screenshot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;variant-b screenshot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這種寫法很適合做 A/B 頁面差異對比，因為兩個版本在獨立會話裡運行，截圖和狀態檢查也更容易分開管理。&lt;/p&gt;
&lt;h2 id=&#34;07-持久化瀏覽器-profile&#34;&gt;07 持久化瀏覽器 profile
&lt;/h2&gt;&lt;p&gt;官方文件特別說明：預設情況下，瀏覽器 profile 只保存在記憶體裡。&lt;/p&gt;
&lt;p&gt;如果你希望把瀏覽器 profile 持久化到磁碟，需要在 &lt;code&gt;open&lt;/code&gt; 時加上 &lt;code&gt;--persistent&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Use persistent profile (auto-generated location)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli open https://example.com --persistent
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Use persistent profile with custom directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli open https://example.com --profile&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/path/to/profile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這個能力適合需要長期複用登入態、本地快取或擴充除錯環境的場景。尤其在反覆除錯同一站點時，持久化 profile 往往會比每次從零開始更高效。&lt;/p&gt;
&lt;h2 id=&#34;08-預設瀏覽器會話&#34;&gt;08 預設瀏覽器會話
&lt;/h2&gt;&lt;p&gt;如果沒有顯式傳入 &lt;code&gt;-s&lt;/code&gt;，那麼命令會使用預設瀏覽器會話：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# These use the same default browser session&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli open https://example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli snapshot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli close  &lt;span class=&#34;c1&#34;&gt;# Stops default browser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;也就是說，不帶 &lt;code&gt;-s&lt;/code&gt; 的幾條命令預設是在同一個預設會話裡連續執行的。&lt;/p&gt;
&lt;h2 id=&#34;09-打開時附帶會話配置&#34;&gt;09 打開時附帶會話配置
&lt;/h2&gt;&lt;p&gt;除了會話名，官方也給出了幾種常見的啟動配置方式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Open with config file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli open https://example.com --config&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;.playwright/my-cli.json
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Open with specific browser&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli open https://example.com --browser&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;firefox
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Open in headed mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli open https://example.com --headed
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Open with persistent profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli open https://example.com --persistent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這些參數可以和會話管理一起搭配使用。比如你可以讓某個命名會話固定跑在 &lt;code&gt;firefox&lt;/code&gt;，或者讓某個會話始終以 &lt;code&gt;headed&lt;/code&gt; 模式啟動，方便人工觀察。&lt;/p&gt;
&lt;h2 id=&#34;10-官方給出的最佳實務&#34;&gt;10 官方給出的最佳實務
&lt;/h2&gt;&lt;p&gt;參考文件列了三條很實用的最佳實務。&lt;/p&gt;
&lt;h3 id=&#34;1-用有語義的會話名&#34;&gt;1. 用有語義的會話名
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# GOOD: Clear purpose&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;github-auth open https://github.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;docs-scrape open https://docs.example.com
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# AVOID: Generic names&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;s1 open https://github.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;會話名最好能直接表達用途。像 &lt;code&gt;github-auth&lt;/code&gt;、&lt;code&gt;docs-scrape&lt;/code&gt; 這種名字，後面維護腳本時會清楚很多。&lt;/p&gt;
&lt;h3 id=&#34;2-用完及時清理&#34;&gt;2. 用完及時清理
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Stop browsers when done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;auth close
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;scrape close
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Or stop all at once&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli close-all
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# If browsers become unresponsive or zombie processes remain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli kill-all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果任務結束後不關瀏覽器，會話和背景程序會一直留著。短期看問題不大，但任務一多，很容易把環境弄亂。&lt;/p&gt;
&lt;h3 id=&#34;3-刪除陳舊瀏覽器資料&#34;&gt;3. 刪除陳舊瀏覽器資料
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Remove old browser data to free disk space&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;playwright-cli -s&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;oldsession delete-data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;當某些舊會話已經不用時，刪除對應資料目錄可以節省磁碟空間，也能避免後面誤用過期狀態。&lt;/p&gt;
&lt;h2 id=&#34;11-快速總結&#34;&gt;11 快速總結
&lt;/h2&gt;&lt;p&gt;如果只抓重點，可以記住下面這幾件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-s=&amp;lt;name&amp;gt;&lt;/code&gt; 用來建立並使用獨立瀏覽器會話&lt;/li&gt;
&lt;li&gt;不同會話之間會隔離 cookies、各種儲存、快取、歷史紀錄和分頁&lt;/li&gt;
&lt;li&gt;&lt;code&gt;close-all&lt;/code&gt; 適合統一關閉，&lt;code&gt;kill-all&lt;/code&gt; 適合處理異常殘留程序&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--persistent&lt;/code&gt; 用來把 profile 落盤，適合長期複用狀態&lt;/li&gt;
&lt;li&gt;會話名盡量語義化，舊資料定期清理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你的工作流裡已經有登入態複用、多帳號並行、A/B 對比或批次抓取需求，那麼 &lt;code&gt;session management&lt;/code&gt; 基本就是 &lt;code&gt;Playwright CLI&lt;/code&gt; 裡最值得先掌握的一塊能力。&lt;/p&gt;
&lt;h2 id=&#34;參考連結&#34;&gt;參考連結
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Playwright CLI session-management 參考文件：https://github.com/microsoft/playwright-cli/blob/main/skills/playwright-cli/references/session-management.md&lt;/li&gt;
&lt;li&gt;Playwright CLI 專案首頁：https://github.com/microsoft/playwright-cli&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
