CDP

WSL の playwright-cli からホスト Windows の Chrome にアタッチする

TL;DR — WSL2 ミラーモードなら --cdp=chrome チャンネル名は使えないが、Chrome を --remote-debugging-port=9222 で起動して --cdp=http://localhost:9222 を使えばアタッチできる。Firewall ルールも不要。なお、--remote-debugging-address は非 headless Chrome では無視され、Chrome は常に 127.0.0.1 にバインドする。localhost で繋がるのはミラーモードが 127.0.0.1 を通してくれるおかげ。

どっかで聞いたところによると…

playwright-cli(@playwright/cli)には、起動済みの Chrome にアタッチしてそのセッションをそのまま操作できる機能があり、SAML/SSO 認証済みのページを操作したいときにサンドボックスの Chrome にログインし直す手間が省ける、とのことです。

確かに便利そうなんだけど、この機能を WSL2 から使おうとしてハマったので記録しておきます。

ほんと大体ハマってんな俺。

やりたいこと

WSL 上の playwright-cli から、ホスト Windows で開いている Chrome(ログイン済み)にアタッチして操作する。

前提

  • WSL2 ネットワークモード:ミラーモード(networkingMode=mirrored
  • playwright-cli:0.1.9mise use --global npm:@playwright/cli@latest でインストール)
    • 前回自宅でハマったので職場では間違えなかった

チャンネル名(--cdp=chrome)は WSL から使えない

そもそもこれが駄目だった。

以下は Claude さんの解説です。

playwright-cli には microsoft/playwright#40177(2026年4月マージ)で、チャンネル名でアタッチできる機能が追加された。

playwright-cli attach --cdp=chrome

これは DevToolsActivePort ファイルを読んでポートを自動解決する仕組みなのだが、WSL では動かない。

原因は process.platform。WSL 上では linux になるため、スクリプトは ~/.config/google-chrome/DevToolsActivePort(Linux のパス)を探しに行く。ホスト Windows の Chrome が書き込むのは %LOCALAPPDATA%\Google\Chrome\User Data\DevToolsActivePort なので、当然見つからない。