Chrome DevTools MCP vs Playwright MCP - どちらを選ぶべき?実測で比較
はじめに
Claude Codeでブラウザテストするとき、Chrome DevTools MCPとPlaywright MCPのどちらを使うべきか迷っていませんか?
この記事では、同じBlazorアプリで両方を実際に使い、選び方の基準を示します。
結論を先に:選び方の基準
| 用途 | おすすめ | 理由 |
|---|---|---|
| デバッグ・要素特定 | Chrome DevTools MCP | UIDで要素を確実に指定 |
| パフォーマンス分析 | Chrome DevTools MCP | Core Web Vitals測定可能 |
| 標準的なフォーム操作 | Playwright MCP | AIが自動で要素を検出 |
| 探索的テスト | Playwright MCP | 操作手順がシンプル |
| CI/CD自動テスト | どちらも不向き | 従来のPlaywright/Selenium推奨 |
検証環境
Blazor ServerとRadzen Componentsで作成したTest Formページを使用:
- URL:
https://localhost:7286/test-form - フィールド: Name、Email、Age、Country(ドロップダウン)
- 動作: Submit後に成功メッセージ表示
実際の使用感:同じテストでの比較
Blazorのフォーム(Name、Email、Age、Country)に入力してSubmitするテストで比較しました。
Playwright MCP:AIにお任せ
指示(自然言語):
フォームに John Doe、john@example.com、30、USA を入力して送信
実行内容:
- AIが自動でセレクターを生成(
#Name、#Email等) - ドロップダウンも2ステップで完了
- ✅ 手軽だが、AIの推測に依存
Chrome DevTools MCP:UID指定で確実
指示(同じ内容):
フォームに John Doe、john@example.com、30、USA を入力して送信
実行内容:
- スナップショット取得 → UID確認(
uid=1_22 (Name)等) - UIDでフォーム入力
- ドロップダウンは3ステップ(展開 → スナップショット → 選択)
- ✅ 確実だが、ステップ数が多い

詳細比較:6つの観点
1. 操作方法の違い
本質的な違いは「要素の識別方法」:
Chrome DevTools MCP:
-
take_snapshotでアクセシビリティツリーを取得し、UID(一意識別子)を付与 - 操作時にはUIDで要素を明示的に指定
- 例:
{"uid": "1_22", "value": "John Doe"}
Playwright MCP:
- アクセシビリティツリーからAIがセレクターを自動生成
- 操作時にはAIが適切なセレクター(name、role、text)を選択
- 例:
await page.locator('#Name').fill('John Doe')
2. フォーム入力
Chrome DevTools MCP:
❌ 事前にスナップショットでUIDを確認する必要がある
mcp__chrome-devtools__take_snapshot()
→ 結果: uid=1_22 (Name), uid=1_24 (Email), uid=1_26 (Age)
mcp__chrome-devtools__fill_form([
{"uid": "1_22", "value": "John Doe"},
{"uid": "1_24", "value": "john@example.com"},
{"uid": "1_26", "value": "30"}
])
Playwright MCP:
✅ AIが自動でセレクターを推測
mcp__playwright__browser_fill_form
→ 実行されるPlaywrightコード:
await page.locator('#Name').fill('John Doe');
await page.locator('#Email').fill('john@example.com');
await page.locator('#Age').fill('30');
3. ドロップダウン操作
Chrome DevTools MCP:
❌ 3ステップ必要
mcp__chrome-devtools__click(uid="3_30") // コンテナクリック
mcp__chrome-devtools__take_snapshot(verbose=true) // オプション一覧を取得
mcp__chrome-devtools__click(uid="5_135") // 目的のオプションをクリック
Playwright MCP:
✅ 2ステップで完了(AIが自動で要素を推測)
mcp__playwright__browser_click // ドロップダウン展開
mcp__playwright__browser_click // USAオプション選択
→ 実行されるPlaywrightコード:
await page.getByRole('option', { name: 'USA' }).click();
4. スナップショット(ページ構造の確認)
Chrome DevTools MCP:
uid=1_0 RootWebArea "Test Form"
uid=1_22 textbox " "
uid=1_23 StaticText "Name"
uid=1_24 textbox " "
uid=1_25 StaticText "Email"
uid=1_26 textbox " " value="0"
uid=1_27 StaticText "Age"
→ UIDが明確、デバッグしやすい
Playwright MCP:
textbox "Name"
textbox "Email"
textbox "Age" [value=0]
combobox "Country"
→ 人間が読みやすい、直感的
5. 使いやすさ
Chrome DevTools MCP:
- ✅ 細かい制御が可能
- ✅ デバッグしやすい(UIDが明確)
- ✅ 要素の特定が確実
- ❌ AIの実行ステップが多い(操作の前に必ずスナップショット取得が必要)
- ❌ UIDが動的に変わる(ページ更新や要素追加でUIDが変化する)
Playwright MCP:
- ✅ 操作手順がシンプル
- ✅ AIによる要素検出が便利
- ✅ 標準的なUI要素に強い
- ❌ AIの推測に依存(誤った要素を選ぶ可能性)
- ❌ デバッグが難しい(どのセレクターを使ったか不明瞭)
- ❌ 繰り返し実行の精度にばらつき
6. 共通機能と本質的な違い
両MCPの共通点:
- ✅ 内部的にアクセシビリティツリーを使用
- ✅ 基本的なブラウザ操作(ドラッグ&ドロップ、キーボード操作、ホバー、ファイルアップロード)は同等に実行可能
| 操作 | Chrome DevTools MCP | Playwright MCP |
|---|---|---|
| ドラッグ&ドロップ | ✅ drag
|
✅ browser_drag
|
| キーボード操作 | ✅ press_key
|
✅ browser_press_key
|
| ホバー | ✅ hover
|
✅ browser_hover
|
| ファイルアップロード | ✅ upload_file
|
✅ browser_file_upload
|
本質的な違いは「要素の識別方法」:
- Chrome DevTools MCP: アクセシビリティツリーにUID(一意識別子)を付与し、UIDで要素を明示的に指定
- Playwright MCP: アクセシビリティツリーからAIがセレクターを自動生成して要素を特定
どちらを選ぶかは、「確実性を取るか(Chrome DevTools MCP)」「手軽さを取るか(Playwright MCP)」の判断になります。
Claude Codeでのセットアップ
Chrome DevTools MCPのセットアップ
# MCPサーバーを追加
claude mcp add chrome-devtools npx chrome-devtools-mcp@latest
# 追加されたか確認
claude mcp
Playwright MCPのセットアップ
# MCPサーバーを追加
claude mcp add playwright npx @playwright/mcp@latest
# 追加されたか確認
claude mcp
Chrome DevTools MCP特有の機能:パフォーマンス分析
Chrome DevTools MCPの最大の特徴は、Playwright MCPにないパフォーマンス分析機能です。
Blazor Server(https://localhost:7286/test-form)で実際に検証した結果:
パフォーマンストレース結果
mcp__chrome-devtools__performance_start_trace({
reload: true,
autoStop: true
})
取得できたCore Web Vitals:
LCP: 138 ms ✅ 良好(2.5秒以内)
- TTFB: 25 ms ✅ 優秀(800ms以内)
- Render delay: 114 ms(描画遅延)
CLS: 0.00 ✅ 完璧(0.1以下)
Chrome MCPが自動生成したパフォーマンス改善提案(6種類):
パフォーマンストレースを実行すると、Chrome DevTools MCPが測定結果を分析し、具体的な改善アクションを自動的に提案してくれます:
- LCPBreakdown: LCP最適化の提案
- CLSCulprits: レイアウトシフト防止策
- RenderBlocking: レンダリングブロック削減
- NetworkDependencyTree: ネットワーク依存関係最適化
- DocumentLatency: 初期ロード遅延削減(推定削減: 8.3 kB)
- Cache: キャッシュ戦略の提案
コンソールログ取得結果
mcp__chrome-devtools__list_console_messages()
取得できたBlazor特有のログ:
[info] Normalizing '_blazor' to 'https://localhost:7286/_blazor'
[info] WebSocket connected to wss://localhost:7286/_blazor
[debug] CSS Hot Reload ignoring bootstrap.min.css (7000+ rules)
[debug] CSS Hot Reload ignoring material-base.css (7000+ rules)
→ Blazorの内部動作(WebSocket接続、CSS Hot Reload)を監視できます。
ネットワークリクエスト取得結果
mcp__chrome-devtools__list_network_requests({
resourceTypes: ["document", "script", "xhr", "fetch"]
})
取得できたBlazor初期化リクエスト(10件):
GET /test-form [200]
GET /_framework/blazor.web.js [304]
GET /_content/Radzen.Blazor/Radzen.Blazor.js [200]
POST /_blazor/negotiate [200]
→ Blazorの初期化プロセス(SignalR negotiation、WebSocket接続)を詳細に確認できます。
実用例:パフォーマンス問題の検出
この検証で以下のことが分かりました:
- ✅ LCPは良好(138ms < 2.5秒)
- ✅ CLSは完璧(0.00 = レイアウトシフトなし)
- ⚠️ Render delayがやや長い(114ms / 138ms = 82%)
- 改善提案:レンダリングブロックリソースの削減
Chrome DevTools MCPを使えば、このような具体的な改善ポイントが自動で提示されます。
まとめ
Chrome DevTools MCPとPlaywright MCPは、どちらもアクセシビリティツリーを使いますが、要素の識別方法が異なります:
- Chrome DevTools MCP: UID指定で確実。パフォーマンス分析も可能
- Playwright MCP: AIが推測して手軽。標準UIに強い
用途に応じて使い分けることで、効率的なブラウザテストが実現できます。
Discussion