Webアプリケーションテスト は何をしますか?
ローカルWebアプリケーションをテストするには、ネイティブのPython Playwrightスクリプトを作成してください。
利用可能なヘルパースクリプト:
scripts/with_server.py- サーバーのライフサイクルを管理します(複数サーバー対応)
スクリプトはまず --help を付けて実行し、使い方を確認してください。カスタマイズした解決策が絶対に必要だと分かるまでは、ソースを読まないでください。これらのスクリプトは非常に大きくなる可能性があり、コンテキストウィンドウを汚染します。これらはコンテキストウィンドウに取り込むのではなく、ブラックボックスとして直接呼び出すために存在します。
意思決定ツリー:アプローチの選択
ユーザータスク → 静的HTMLか?
├─ はい → HTMLファイルを直接読み取り、セレクターを特定する
│ ├─ 成功 → セレクターを使用してPlaywrightスクリプトを作成
│ └─ 失敗/不完全 → 動的(以下)として扱う
│
└─ いいえ(動的Webアプリ)→ サーバーは既に実行中か?
├─ いいえ → 実行: python scripts/with_server.py --help
│ その後、ヘルパーを使用し、簡略化したPlaywrightスクリプトを作成
│
└─ はい → 偵察→行動パターン:
1. 移動し、networkidleを待機
2. スクリーンショットを撮るかDOMを検査
3. レンダリングされた状態からセレクターを特定
4. 特定されたセレクターでアクションを実行
例:with_server.pyの使用
サーバーを起動するには、最初に --help を実行し、次にヘルパーを使用します:
単一サーバー:
python scripts/with_server.py --server "npm run dev" --port 5173 -- python your_automation.py
複数サーバー(例:バックエンド+フロントエンド):
python scripts/with_server.py \
--server "cd backend && python server.py" --port 3000 \
--server "cd frontend && npm run dev" --port 5173 \
-- python your_automation.py
自動化スクリプトを作成するには、Playwrightロジックのみを含めてください(サーバーは自動管理されます):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True) # 常にchromiumをヘッドレスモードで起動
page = browser.new_page()
page.goto('http://localhost:5173') # サーバーは既に実行中で準備完了
page.wait_for_load_state('networkidle') # 重要:JavaScriptの実行を待機
# ... あなたの自動化ロジック
browser.close()
偵察→行動パターン
-
レンダリングされたDOMを検査:
page.screenshot(path='/tmp/inspect.png', full_page=True) content = page.content() page.locator('button').all() -
検査結果からセレクターを特定
-
特定されたセレクターを使用してアクションを実行
よくある落とし穴
❌ やってはいけない:動的アプリで networkidle を待機する前にDOMを検査する
✅ やるべき:検査の前に page.wait_for_load_state('networkidle') を待機する
ベストプラクティス
- バンドルされたスクリプトをブラックボックスとして使用 - タスクを達成するために、
scripts/で利用可能なスクリプトが役立つかどうかを検討してください。これらのスクリプトは、共通の複雑なワークフローを確実に処理し、コンテキストウィンドウを乱雑にしません。--helpで使い方を確認し、直接呼び出してください。 - 同期的なスクリプトには
sync_playwright()を使用 - 終了時は必ずブラウザを閉じる
- 説明的なセレクターを使用:
text=、role=、CSSセレクター、またはID - 適切な待機を追加:
page.wait_for_selector()またはpage.wait_for_timeout()
リファレンスファイル
- examples/ - 一般的なパターンを示す例:
element_discovery.py- ページ上のボタン、リンク、入力フィールドを発見するstatic_html_automation.py- ローカルHTMLにfile:// URLを使用するconsole_logging.py- 自動化中のコンソールログをキャプチャする