Skip to main content
ExodeUI

EXODEUI DESKTOP

A little space for good ideas.

Choose your platform to get the official ExodeUI installer.

Looking for Intel Mac or other builds? Explore the web studio or check all download options.

Prefer the browser? Try for free in your browser →
チュートリアル・テスト7 分で読めます·Updated 2026年10月·ExodeUI チーム

Playwright を使用した UI 状態とアニメーションのテスト

Playwright を使用してアニメーション UI の安定したテストを作成する方法: page. Clock で時間を制御し、モーションを減らしてダーク モードをエミュレートし、アニメーションを無効にしたスクリーンショットを作成します。

要点まとめ

核心

アニメーション テストを決定論的にします。タイマー、requestAnimationFrame、パフォーマンスをカバーする page. Clock で時間を制御します。 page.emulateMedia({ ReduceMotion, colorScheme }); でユーザー設定をエミュレートします。アニメーション中のピクセルではなく状態をアサートします。アニメーションを無効にしてスクリーンショットを撮ります。動きを減らしたパスを第一級のケースとしてテストします。

アニメーションのテストが不安定な理由

アニメーションは時間に依存し、実時間は実行とマシンによって異なります。 10 ミリ秒早くまたは遅く撮影されたスクリーンショットには、別のフレームが表示されます。修正方法は、時間と設定を制御し、アニメーションが個々のフレームではなくフレーム間で移動する状態をテストすることです。

4 つのステップ: 状態の設定、page. Clock による時間の制御、モーションの削減などの設定のエミュレート、DOM チェックとスクリーンショットによるアサート
固定時間と固定設定により、アニメーション UI をテスト可能になります。

制御時間

Playwright の Clock API を使用すると、テストで偽の時計をインストールし、設定した期間の一時停止、早送り、または実行時間を実現できます。 setTimeout、setInterval、requestAnimationFrame、およびパフォーマンスについて説明しているため、たとえば、読み込み遅延を過ぎて早送りし、成功状態が表示されることを確認できます。

ユーザー設定をエミュレートする

page.emulateMedia() は、reduceMotion を「reduce」に、colorScheme を「dark」または「light」に設定できます。モーションを減らしてキー フローを実行して、アニメーションに依存する重要なものがないことを確認し、両方のテーマでコントラストの問題を見つけます。

安定したスクリーンショット

Playwright テストは、expect(page).toHaveScreenshot() を使用してスクリーンショットを比較できます。また、スクリーンショット オプションには、キャプチャの CSS アニメーションとトランジションを停止するアニメーション「無効」が含まれています。最終状態については視覚的な比較を使用し、動作については DOM またはアクセシビリティ アサーションを使用します。

キャンバスベースのコンポーネントのテスト

Lottie、Rive、または ExodeUI ランタイムによって描画されるようなキャンバス アニメーションは、DOM では表示されません。コードが送信する入力と受信するイベントをテストし、実際にアクセス可能な要素をキャンバスの横に保持し、時間が制御された後にスクリーンショットを使用して視覚的なチェックを行います。

実装コード例

インタラクティブコンポーネントの実装
import { test, expect } from '@playwright/test';

test('save button shows success, also with reduced motion', async ({ page }) => {
  await page.clock.install();                         // fake timers + rAF
  await page.emulateMedia({ reducedMotion: 'reduce' }); // test the calm path
  await page.goto('/settings');

  await page.getByRole('button', { name: 'Save' }).click();
  await expect(page.getByRole('status')).toHaveText('Saving…');

  await page.clock.runFor(2000);                      // skip the wait deterministically
  await expect(page.getByRole('status')).toHaveText('Saved');

  await expect(page).toHaveScreenshot('saved.png', { animations: 'disabled' });
});

覚えておきたい原則

  • page.クロックで時間を制御(タイマー、requestAnimationFrame、パフォーマンス)
  • page.emulateMedia を使用して、reduceMotion と colorScheme をエミュレートします。
  • アニメーション中のピクセルではなく、状態とアクセス可能なテキストに対してアサートします。
  • アニメーション付きのスクリーンショット: 「無効」
  • 動きを減らしたパスを第一級のケースとしてテストする

よくある質問

出典

  1. Clock — Playwright ドキュメント
  2. Page.emulateMedia and screenshot options — Playwright ドキュメント
  3. Visual comparisons — Playwright ドキュメント

関連ガイドと事例

テスト可能な状態を中心に構築されたコンポーネント

ExodeUI コンポーネントは名前付き入力によって駆動されるため、コードからコンポーネントの状態を簡単にテストできます。

React ガイドを読む
Exode を無料で試す