全国オンライン対応受付 平日 9:00-18:00
お問い合わせ

開発記録 / DX経営ゲーム制作記 / Vol.8 検証・品質管理編

記事 31

Playwrightで4デバイス同時UI検証を自動化した——「動いているかどうか」を証明する仕組み

4デバイスで44項目を自動検証。テーブルの実幅をJSで測定し崩れを自動判定する仕組みの構築。

2026-06-05 公開

# Playwrightで4デバイス同時UI検証を自動化した——「動いているかどうか」を証明する仕組み

「動いてます」と言っても、それはどのデバイスで確認したのか。

開発者はMacやWindowsのブラウザでテストする。でも実際のユーザーはiPhone SEで使っていたり、Galaxy S21で使っていたりする。

DX経営ゲームは研修で使う。参加者が持ち込む端末はバラバラだ。PCで崩れなくてもiPhoneで崩れては意味がない。

この問題を解決するために、Playwrightを使った自動UI検証を組み込んだ。

検証対象デバイス

DEVICES = [
    {"name": "Desktop_1280",  "width": 1280, "height": 800,  "mobile": False},
    {"name": "iPhone_SE_375", "width": 375,  "height": 667,  "mobile": True},
    {"name": "Galaxy_S21_360","width": 360,  "height": 800,  "mobile": True},
    {"name": "iPad_768",      "width": 768,  "height": 1024, "mobile": True},
]

4つのビューポートを設定した。デスクトップ・iPhone SE(最小クラス)・Galaxy S21(Androidスマホ)・iPad。

この4つをカバーすれば、研修参加者の大半のデバイスに対応できる。

テストの核心:テーブルの実幅を測る

UIテストで最も難しいのは「崩れているかどうか」の判定だ。

画面のスクリーンショットを目視確認するアプローチもあるが、自動化が難しい。そこでJavaScriptで直接DOMの幅を測定することにした。

comp_w = await page.evaluate("""() => {
    const t = document.getElementById('comp-table');
    if (!t) return null;
    const scroll = t.parentElement;
    return {
        tableScrollWidth: t.scrollWidth,
        containerClientWidth: scroll ? scroll.clientWidth : null,
        overflowing: scroll ? t.scrollWidth > scroll.clientWidth : null
    };
}""")

scrollWidthはコンテンツの実際の幅、clientWidthはコンテナの表示幅。scrollWidth > clientWidthなら横スクロールが発生している——つまり崩れている。

これでPASSかFAILかを自動判定できる。

実際に見つかったバグ

この検証スクリプトを書いたことで、2つのことが明確になった。

  1. comp-tableは修正前、iPhoneで527pxまで展開されていた
[iPhone_SE_375] comp-table: tableW=527, containerW=319, overflow=True ❌

テーブルが画面より208px広い。右端が大きくはみ出している。

  1. 修正後も残る問題:会社名列の展開

テーブルのmin-widthを320pxに下げてもまだ崩れた。原因を追うと、会社名列にwhite-space:nowrapが設定されており、長い会社名が列を展開していた。

/* 追加したCSS */
@media (max-width: 400px) {
  #comp-table td:first-child { 
    max-width: 80px !important; 
    overflow: hidden !important; 
    text-overflow: ellipsis !important; 
  }
}

会社名を80pxで切り捨て、はみ出た部分は「…」で表示する。

この修正後:

[iPhone_SE_375] comp-table: tableW=319, containerW=319, overflow=False ✅
[Galaxy_S21_360] comp-table: tableW=304, containerW=304, overflow=False ✅

完全に収まった。

44項目の自動テスト

最終的なUIテストは44項目になった。

検証完了  PASS=44  FAIL=0  総計=44
✅ 全44項目 PASS

4デバイス×複数チェック項目の組み合わせだ。主なチェック内容:

Playwrightを使った理由

SeleniumでもCypressでも良かったが、Playwrightを選んだ理由は2つある。

async/awaitで書ける:非同期処理が直感的で、ページのロード待ちや要素の表示待ちが書きやすい。

ブラウザを複数持てる:chromiumfirefoxwebkit(Safari相当)を同一テストで実行できる。

実際のテストはChromiumのみで動かしているが、必要に応じてFirefox/Safariの確認も簡単に追加できる。

「動いている」の定義を変えた

このテストを書く前の「動いている」は、開発者が手元で確認した状態だった。

テストを書いた後の「動いている」は、4デバイス×44項目を全てPASSした状態だ。

基準が変わると、品質が変わる。 研修で使うシステムは、参加者がどんな端末を持ってきても崩れてはいけない。その基準をコードで表現したのがこのテストだ。

デプロイの前にこのテストを実行する習慣がつくと、「本番で崩れていた」という後悔が減る。