Skip to content

アーキテクチャ

全体構成

┌─────────────────────────────────────────────────┐
│ dev-workflow /issue-test                         │
│                                                  │
│  1. テスト計画策定                                  │
│  2. エンジン選択(agent-browser or Playwright)      │
│  3. テスト実行                                     │
│  4. エビデンスキャプチャ                              │
│  5. upload-evidence                               │
│  6. コメント投稿                                    │
└──────────┬──────────────────────┬────────────────┘
           │                      │
           ▼                      ▼
┌──────────────────┐   ┌──────────────────┐
│  agent-browser   │   │   Playwright     │
│  (推奨・高速)     │   │  (フォールバック)   │
│                  │   │                  │
│ Rust CLI daemon  │   │ Node.js + npm    │
│ CDP over WS      │   │ CDP over WS      │
│ ~7 MB / ~8 MB   │   │ ~710 MB / ~143 MB│
└──────┬───────────┘   └──────┬───────────┘
       │                      │
       ▼                      ▼
┌─────────────────────────────────────────┐
│           Chrome for Testing            │
│      Chrome DevTools Protocol (CDP)     │
└─────────────────────────────────────────┘

agent-browser の内部アーキテクチャ

クライアント・デーモン構成

CLI コマンド入力


┌──────────────┐
│  CLI Client  │  Node.js ラッパー (bin/agent-browser.js)
│              │  → プラットフォーム固有の Rust バイナリを起動
└──────┬───────┘
       │ JSON over Unix Domain Socket (macOS/Linux)
       │ JSON over TCP (Windows)

┌──────────────┐
│  Rust Daemon │  バックグラウンドプロセス(常駐)
│              │  → コマンド間で起動オーバーヘッドゼロ
│  ┌─────────┐ │
│  │ Actions │ │  コマンドハンドラ群
│  │ Snapshot│ │  アクセシビリティツリー生成
│  │ Element │ │  要素参照管理 (@e1, @e2...)
│  │ Browser │ │  Chrome DevTools Protocol 通信
│  │ Network │ │  ネットワーク制御・HAR記録
│  │ Auth    │ │  認証情報の暗号化管理
│  └─────────┘ │
└──────┬───────┘
       │ WebSocket (CDP)

┌──────────────┐
│    Chrome    │  Chrome for Testing
└──────────────┘

セッション分離(重要)

agent-browser は単一デーモンを共有する設計のため、複数のClaude セッションやプロセスが同時にアクセスすると競合する。各クライアントは --session <name> フラグで独立した状態を持てる:

┌────────────────────────────────────────┐
│    agent-browser daemon (グローバル)    │
│                                        │
│  ┌──────────────┐  ┌──────────────┐   │
│  │ default      │  │ dev-workflow-│   │
│  │ session      │  │ issue-123    │   │
│  │              │  │              │   │
│  │ Chrome inst1 │  │ Chrome inst2 │   │
│  │ RefMap1      │  │ RefMap2      │   │
│  └──────┬───────┘  └──────┬───────┘   │
└─────────┼─────────────────┼───────────┘
          │                 │
          ▼                 ▼
┌──────────────────┐ ┌──────────────────┐
│ メインClaude環境  │ │ dev-workflow E2E │
│ (ユーザー操作)    │ │ (自動テスト)      │
└──────────────────┘ └──────────────────┘

セッション名なしで複数同時実行すると Resource temporarily unavailable (os error 35) が発生する。dev-workflow経由のE2Eテストでは必ず AB_SESSION 環境変数で独自セッション名を指定すること。

要素参照システム

agent-browser の最大の特徴は、アクセシビリティツリーベースの要素参照:

1. snapshot コマンド実行

2. Chrome のアクセシビリティツリーを取得

3. 各要素に決定論的な参照ID を割り当て (@e1, @e2, ...)

4. RefMap (HashMap) にキャッシュ

5. 以降のコマンドで @eN で要素を指定可能

Playwright との違い:

観点Playwrightagent-browser
要素指定CSSセレクタ / XPath参照ID (@eN)
取得方法DOM クエリアクセシビリティツリー
安定性DOM変更で壊れやすいロール・名前ベースで頑健
LLM親和性セレクタ文字列の生成が必要番号指定で簡潔

エンジン選択フロー

/issue-test 実行


config.toml の [browser].engine を確認

    ├── "agent-browser" → agent-browser を使用
    │    │
    │    ├── health-check 成功 → agent-browser で実行
    │    └── health-check 失敗 → フォールバック判定
    │         │
    │         ├── [fallback].playwright_fallback = true → Playwright で実行
    │         └── [fallback].playwright_fallback = false → エラー終了

    ├── "playwright" → Playwright を使用(従来動作)

    └── "auto" → agent-browser 優先、未インストールなら Playwright

データフロー

E2Eテスト実行時

1. PR変更内容を分析

2. テスト計画策定(テストシナリオ・キャプチャポイント定義)

3. agent-browser open <URL>

4. agent-browser snapshot -i  (アクセシビリティツリー取得)

5. 要素参照に基づく操作
   - agent-browser click @eN
   - agent-browser fill @eN "text"
   - agent-browser press Enter

6. agent-browser screenshot /tmp/test-captures/XX_name.png

7. (必要に応じて 4-6 を繰り返し)

8. agent-browser close

9. upload-evidence でエビデンスをアップロード

10. テスト結果コメントを PR/issue に投稿

ディレクトリ構成

agent-browser/
├── CLAUDE.md                      # プロジェクト指示
├── SKILL.md                       # スキル定義(発動条件・コマンド)
├── README.md                      # 概要
├── config.toml                    # デフォルト設定
├── package.json                   # VitePress依存
├── docs/                          # 設計書(VitePress)
│   ├── .vitepress/config.mts
│   ├── index.md                   # トップページ
│   ├── architecture/index.md      # アーキテクチャ
│   ├── api/index.md               # API仕様
│   ├── migration/index.md         # 移行ガイド
│   ├── config/index.md            # 設定仕様
│   ├── templates/index.md         # テンプレート
│   └── setup/index.md             # セットアップ
├── scripts/
│   ├── install.sh                 # インストール自動化
│   └── health-check.sh            # 環境チェック
├── templates/
│   ├── e2e-basic.sh               # 基本E2E
│   ├── e2e-interactive.sh         # 対話操作E2E
│   └── e2e-auth.sh                # 認証付きE2E
└── workflows/
    ├── e2e-capture.md             # E2Eキャプチャワークフロー
    └── migration-guide.md         # 移行ガイド(運用向け)