📺

Playwright CLIとClaude Code Skillsで効率的なブラウザテストを実現する

に公開

はじめに

Playwright MCPを使いブラウザテストのシナリオについて実装しておりましたがMCP経由だとツール定義のロード等でコンテキストが約8%増加するという以下の記事を受けて

https://qiita.com/moritalous/items/97df9ff710914a806340

自分でもPlaywright CLIとClaude CodeのSkills(カスタムコマンド) を組み合わせることでコンテキストを抑えつつブラウザ自動化を行うことをやってみようとおもいました。

Playwright CLIとは

Playwright MCPリポジトリから、v0.0.58(2026/1/24)で追加されたトークン効率的なCLIモードです。

リリースノートでは以下のように紹介されています

We are adding a new token-efficient CLI mode of operation to Playwright. This brings the long-awaited official SKILL-focused CLI mode to our story and makes it more coding agent-friendly.

パッケージ構成

同じリポジトリから2つのパッケージが配布されています。

パッケージ コマンド 用途
@playwright/mcp playwright-mcp MCPサーバー
@playwright/cli playwright-cli CLIツール

MCPとCLIの使い分け

観点 MCP CLI (Skills)
コンテキスト増加量 約8% 約1.3%
操作方式 ツール呼び出し Bashコマンド
向いている用途 インタラクティブなデバッグ 定型的なフロー確認
セットアップ .mcp.jsonに設定 Skillsファイルを作成

セットアップ

1. Playwright CLIのインストール

# どちらでもOK
npm install -g @playwright/cli
# または
npm install -g playwright-cli
playwright-cli --version
# 0.0.61(2026/01/30時点の最新)

2. Claude Code Skillsファイルの作成

プロジェクトの .claude/commands/ ディレクトリにSkillsファイルを作成します。

mkdir -p .claude/commands

.claude/commands/playwright-cli.md を作成

---
description: Automates browser interactions for web testing, form filling, screenshots, and data extraction
allowed-tools: Bash
---

# playwright-cli

Browser automation CLI tool.

## Quick Start

\`\`\`bash
playwright-cli open https://example.com/
playwright-cli snapshot
playwright-cli click e3
\`\`\`

## Core Workflow

1. `open` to navigate to a page
2. `snapshot` to get element refs
3. `click`, `fill`, `type` to interact

## Commands

### Core
\`\`\`bash
playwright-cli open <url>              # open url
playwright-cli close                   # close the page
playwright-cli click <ref>             # perform click
playwright-cli fill <ref> <text>       # fill text
playwright-cli type <text>             # type text
playwright-cli snapshot                # capture page snapshot
playwright-cli screenshot [ref]        # take screenshot
\`\`\`

### Sessions
\`\`\`bash
playwright-cli --session=<name> open <url>  # open with named session
playwright-cli session-stop-all             # stop all sessions
\`\`\`

### DevTools
\`\`\`bash
playwright-cli tracing-start           # start trace recording
playwright-cli tracing-stop            # stop trace recording
playwright-cli console [min-level]     # list console messages
\`\`\`

3. .gitignoreの設定

Playwright CLIの作業ファイルをgit管理から除外します。

# playwright-cli
.playwright-cli/

実際のワークフロー

ここからが本題です。Playwright CLIとSkillsを使った実際のワークフローを紹介します。

例として、Webアプリケーションで「カテゴリ選択 → サブカテゴリへの遷移」というフローをテストする場合を考えます。

Step 1: Skillsでフローを確認する

Claude Codeで /playwright-cli と入力すると、Skillsの内容がコンテキストに読み込まれます。

/playwright-cli カテゴリ選択からサブカテゴリページへの遷移を確認したい

Claude Codeは以下のようにplaywright-cliコマンドを実行してくれます。

# セッション付きでブラウザを開く
playwright-cli --session=test --headed open http://localhost:3000(Skillで指定していれば他のPORTで開けます)

# snapshotで要素を確認
playwright-cli --session=test snapshot

snapshotの結果から要素のref(参照)が得られyaml形式でテストのステップが示され出力されます。

- button "カテゴリ選択" [ref=e39] [cursor=pointer]
- generic "カテゴリを選択してください" [ref=e6]
- generic "決定" [ref=e15] [cursor=pointer]

これを使い、Claude Codeが操作を進めます

# モーダルを閉じる
playwright-cli --session=test click e15

# カテゴリ選択ボタンをクリック
playwright-cli --session=test click e39

# snapshotで選択肢の要素を確認
playwright-cli --session=test snapshot

# カテゴリAを選択
playwright-cli --session=test click e370

# サブカテゴリのリンクをクリック
playwright-cli --session=test click e60

# スクリーンショットで確認
playwright-cli --session=test screenshot

この対話的なやり取りを通じて、テストに必要な情報(セレクタ、遷移先URL、モーダルの存在など)を収集し意図した動作をHeadlessブラウザ内で確認することができます。

Step 2: テストコードを実装する

Step 1で確認したフローをもとに、@playwright/test のテストコードを実装します。

npm install -D @playwright/test
npx playwright install chromium

playwright.config.ts

import { defineConfig } from "@playwright/test";

export default defineConfig({
  testDir: "./e2e",
  timeout: 30_000,
  use: {
    baseURL: "http://localhost:3000",()
    screenshot: "only-on-failure",
    video: "on",
  },
  projects: [
    {
      name: "chromium",
      use: { browserName: "chromium" },
    },
  ],
});

対話形式で画面上で確認しながらyamlへ出力した内容でテストを実装してくれます。

e2e/category-navigation.spec.ts

import { test, expect } from "@playwright/test";

test("初期アクセス → モーダル決定 → カテゴリ選択 → サブカテゴリ遷移", async ({
  page,
}) => {
  // 1. 初期アクセス
  await page.goto("/");

  // 2. 選択モーダルの「決定」ボタンをクリック
  const modal = page.locator("text=カテゴリを選択してください");
  await expect(modal).toBeVisible();
  await page.locator("text=決定").click();
  await expect(modal).toBeHidden();

  // 3. カテゴリ選択ボタンをクリックしてカテゴリAを選択
  await page.getByRole("button", { name: "カテゴリ選択" }).click();
  await page.locator("text=カテゴリA").first().click();
  await expect(page).toHaveURL(/categoryId=1/);

  // 4. サブカテゴリのリンクをクリック
  await page.getByRole("link", { name: "サブカテゴリX" }).click();
  await expect(page).toHaveURL(/subCategoryId=10/);
  await expect(page).toHaveTitle(/サブカテゴリX/);
});

Step 3: テスト実行

npx playwright test --headed

video: "on" を設定しているため、テスト結果の動画が test-results/ に webm形式で出力されるので意図した挙動が画面上で実際に行われているか確認が可能です。

playwright-cliの作業ファイルについて

playwright-cliは各コマンド実行時に .playwright-cli/ ディレクトリへ作業ファイルを生成します。

ファイル 役割
*.yml snapshotの結果(アクセシビリティツリー)。要素のrefを確認するために使用
*.png screenshotの結果(視覚的なキャプチャ)

これらはテスト完了後に削除しても問題ありません。

# セッション停止と作業ファイルの削除
playwright-cli session-stop-all
rm -rf .playwright-cli/

まとめ

ツール 役割 タイミング
Playwright CLI + Skills ブラウザとの対話的なフロー確認 テスト設計時
@playwright/test テストコードの実装・実行 テスト実装・CI
Playwright MCP 複雑なインタラクティブデバッグ 必要に応じて

Playwright CLIは「ブラウザとの対話を通じてテストシナリオの各ステップを確認する」ためのツールとしてClaude Code Skillsと組み合わせることで、コンテキスト効率を保ちながらMCPと同等のブラウザ操作が可能になるのでとても便利だなという所感です!

Discussion