モバイルエミュレーションの概要
Playwright は ブラウザの「デスクトップ⇔モバイル差」を構成オプションだけで再現 できるため、物理端末を用意せずにスマートフォン/タブレット向けの UI・挙動を検証できます。エミュレーションでは以下の属性が一括して切り替わります。 playwright.dev
| 属性 | 例 | 説明 |
|---|---|---|
viewport |
390 × 844 | 論理ピクセルサイズ(CSS ピクセル) |
screenSize |
1170 × 2532 | 物理ピクセルサイズ(デバイススクリーン) |
deviceScaleFactor |
3 | ピクセル密度 (DPR) |
userAgent |
iPhone 15 Safari | UA によるモバイル判定を再現 |
isMobile / hasTouch |
true |
タッチイベント・モバイルメディアクエリを有効化 |
| 追加オプション | timezone, geolocation, colorScheme など |
位置・ダークモード・各種権限 |
1. 標準デバイスプロファイルを使う
公式がメンテナンスする デバイスディスクリプタ を playwright.devices から取得し、browser.newContext() に渡すだけで主要機種を再現できます。 playwright.dev
利点
-
信頼性: UA、DPR、タッチイベントなど相互依存する値を一貫性のある組み合わせで設定。
-
保守性: Playwright のバージョンアップ時に新機種が追加・更新される。
-
可読性: テストコード上に「iPhone 15」と残るため意図が明確。
2. カスタム端末を定義する
標準リストにない 最新機種や折りたたみ端末 を試す場合は、コンテキスト生成時に個別プロパティを指定します。 checklyhq.com
Tips
UA の書式は実機 Chrome の文字列をコピーすると判定精度が高い。
screenSizeを省略すると一部 CSS メディア特性が PC 扱いになるため、折りたたみ端末では必ず指定。
3. 実機ブラウザとの連携
| シナリオ | アプローチ | ポイント |
|---|---|---|
| Android Chrome 実機 | chromium.connectOverCDP('ws://<device-ip>:9222') |
端末側で リモートデバッグを有効化 |
| iOS Safari 実機 | webkit.launchServer() → connect() |
macOS + Xcode が必要。iOS 17 以降は iOS WebKit Debug Proxy なしで接続可能 (Playwright 1.44〜) playwright.dev |
| クラウド端末 (BrowserStack 等) | サービス提供の WebSocket URL | デバイスプールを CI から並列利用 |
実機接続は センサー API·メディアキャプチャ·Push 通知 など、エミュレーションでは再現しにくい領域の E2E テストに有効です。
4. 方向・ジェスチャ・マルチタッチ操作
-
画面回転: コンテキスト生成前に
orientation: 'landscape'を設定。 -
ピンチ/スワイプ:
page.locator(selector).pinch()/page.touchscreen.swipe()で再現。 -
マルチタッチ: Playwright は 2 本指・3 本指 同時のタッチ操作をサポートし、ズーム・回転・スクロールの複合操作をスクリプト化可能。 dev.to
5. 限界と注意点
-
ブラウザエンジン差異
-
iOS の全ブラウザは WebKit 固定。Chromium ベースのエミュレーションでは Safari 固有バグを捕捉できない。
-
-
ハードウェア API
-
Web NFC・Bluetooth 等はエミュレーション不可。実機か WebDriver-BiDi の実験的プロトコルが必要。
-
-
パフォーマンス計測
-
エミュレーションは PC ハードウェアで実行されるため、FPS やレイテンシの絶対値 が実機と乖離する。
tracing.start({ screenshots: true })で CPU/ネットワーク負荷を合わせ込みながら比較。
-
-
メディアクエリ
-
@media (hover: none)など入力デバイス特性も検証対象。hasTouch: trueを忘れると PC 判定になる場合がある。
-
6. ベストプラクティス
| 項目 | 推奨手順 |
|---|---|
| 中央設定管理 | playwright.config.ts の projects 配列に端末ごとのプリセットを定義し、CI では npx playwright test --project=iPhone15 のように絞り込む |
| ビジュアル回帰 | expect(page).toHaveScreenshot() で UI 差分を自動検出。DPR 倍数が異なる端末は baseline を個別管理 |
| ネットワーク制約 | context.setOffline(true) または context.route('**/*', route => route.fulfill(...)) で 3G/4G レイテンシやパケットロスをシミュレート |
| アクセシビリティ | モバイル特有のフォーカス順・スクリーンリーダーナビゲーションを page.accessibility.snapshot() で確認 |
| パラレル実行 | CPU コア数×端末数でスケールさせると高負荷。fullyParallel ではなく workers 数を適切に制限 |
まとめ
Playwright のモバイルエミュレーションは 「デバイスディスクリプタで一発再現」「カスタム構成で最新端末を追従」「実機接続でセンサーまで検証」 という 3 階層で活用できます。標準プロファイルで UI を網羅的に確認しつつ、実機接続でエッジケースを補完する戦略が最もコスト対効果に優れます。
ChatGPT4o 生成日:2025/06/22