Open37

Playwright で React の E2E テストをしたい

taichi fukumototaichi fukumoto

導入や初歩的な内容に関して参考になった記事

@playwright/test のインストールと初期設定コマンド、最低限覚えていた方がいい Playwright の関数についての説明がある。簡単なテスト例もあり参考になる。

https://zenn.dev/nappa/articles/243dda7d991860


こちらも初歩的な Playwright を用いた React のテスト例がわかる。step を用いてテストをステップ分けする方法などが参考になる。
サードパーティ製のレポート出力ライブラリについての紹介もある。

https://qiita.com/rikayoshimura/items/3807f7390fcc9b79cb6b

https://qiita.com/rikayoshimura/items/dc5d2a1c3a4a4c40ab5c


Playwirght の API について網羅的に紹介がある。重要なものはほとんど紹介があると思う。

https://zenn.dev/ryoka419319/articles/428ecee482a8ea

taichi fukumototaichi fukumoto

Assertions について

@playwright/test で使用可能なアサーションについては以下のドキュメントにまとめてある。
以下ドキュメントの和訳を行っていく。

https://playwright.dev/docs/test-assertions

Playwright Test は、テストアサーションに expect ライブラリを使用します。このライブラリは、toEqual, toContain, toMatch, toMatchSnapshot などの多くのマッチャーを提供します。

expect(success).toBeTruthy();

JEST の expect が使用されているようだ。

Playwright はまた、予想される条件が満たされるまで待機する便利な非同期マッチャーを使用して拡張します。次の例を検討してください。

await expect(page.locator('.status')).toHaveText('Submitted');

Playwright Test は、フェッチされたノードに "Submitted" テキストが含まれるまで、セレクター .status を使用してノードを再テストします。条件が満たされるまで、またはタイムアウトに達するまで、ノードを再取得して何度もチェックします。このタイムアウトを渡すか、テスト構成の testConfig.expect 値を介して一度構成することができます。

デフォルトでは、アサーションのタイムアウトは 5 秒に設定されています。さまざまなタイムアウトの詳細をご覧ください。

Playwright で使用できるアサーションを、以下に挙げる

  • Negating Matchers
  • Soft Assertions
  • Custom Expect Message
  • Polling
  • expect(locator).toBeChecked([options])
  • expect(locator).toBeDisabled([options])
  • expect(locator).toBeEditable([options])
  • expect(locator).toBeEmpty([options])
  • expect(locator).toBeEnabled([options])
  • expect(locator).toBeFocused([options])
  • expect(locator).toBeHidden([options])
  • expect(locator).toBeVisible([options])
  • expect(locator).toContainText(expected[, options])
  • expect(locator).toHaveAttribute(name, value[, options])
  • expect(locator).toHaveClass(expected[, options])
  • expect(locator).toHaveCount(count[, options])
  • expect(locator).toHaveCSS(name, value[, options])
  • expect(locator).toHaveId(id[, options])
  • expect(locator).toHaveJSProperty(name, value[, options])
  • expect(locator).toHaveScreenshot(name[, options])
  • expect(locator).toHaveScreenshot([options])
  • expect(locator).toHaveText(expected[, options])
  • expect(locator).toHaveValue(value[, options])
  • expect(locator).toHaveValues(values[, options])
  • expect(locator).not
  • expect(page).toHaveScreenshot(name[, options])
  • expect(page).toHaveScreenshot([options])
  • expect(page).toHaveTitle(titleOrRegExp[, options])
  • expect(page).toHaveURL(urlOrRegExp[, options])
  • expect(page).not
  • expect(apiResponse).toBeOK()
  • expect(apiResponse).not
  • expect(screenshot).toMatchSnapshot(name[, options])
  • expect(screenshot).toMatchSnapshot([options])
taichi fukumototaichi fukumoto

Negating Matchers

一般に、マッチャーの前に .not を追加することで、反対のことが真であると期待できます。

expect(value).not.toEqual(0);
await expect(locator).not.toContainText("some text");
taichi fukumototaichi fukumoto

Soft Assertions

デフォルトでは、アサーションに失敗するとテストの実行が終了します。ソフトアサーションに失敗してもテストの実行は終了しませんが、失敗したというマークはつきます。

// 失敗してもテストが止まらないようなチェックをいくつか作っておく
await expect.soft(page.locator('#status')).toHaveText('Success');
await expect.soft(page.locator('#eta')).toHaveText('1 day');

// さらにいろいろなことを確認するためにテストを続ける
await page.locator('#next-page').click();
await expect.soft(page.locator('#title')).toHaveText('Make another order');

テスト実行中のどの時点でも、ソフトアサーションの失敗があったかどうかを確認することができます。

// 失敗してもテストが止まらないようなチェックをいくつか作っておく
await expect.soft(page.locator('#status')).toHaveText('Success');
await expect.soft(page.locator('#eta')).toHaveText('1 day');

// ソフトアサーションに失敗した場合に、それ以上の実行を避ける
expect(test.info().errors).toHaveLength(0);
taichi fukumototaichi fukumoto

Custom Expect Message

次の例のように、expect 関数の 2 番目の引数としてカスタム エラー メッセージを指定できます。

await expect(page.locator('text=Name'), 'should be logged in').toBeVisible();

エラーは次のようになります。

Error: should be logged in

    Call log:
      - expect.toBeVisible with timeout 5000ms
      - waiting for selector "text=Name"


      2 |
      3 | test('example test', async({ page }) => {
    > 4 |   await expect(page.locator('text=Name'), 'should be logged in').toBeVisible();
        |                                                                  ^
      5 | });
      6 |

同じことがソフト アサーションでも機能します。

expect.soft(value, 'my soft assertion').toBe(56);
taichi fukumototaichi fukumoto

Polling

expect.pollを使えば、任意の同期型期待値を非同期型のポーリング型期待値に変換することができます。

以下のメソッドは、与えられた関数がHTTPステータス200を返すまでポーリングします。

await expect.poll(async () => {
  const response = await page.request.get('https://api.example.com');
  return response.status();
}, {
  // カスタムエラーメッセージ(オプション)
  message: 'make sure API eventually succeeds', // custom error message
  // 10秒間のポーリング。デフォルトは5秒。タイムアウトを無効にするには0を渡す。
  timeout: 10000,
}).toBe(200);
taichi fukumototaichi fukumoto

expect(locator).not

  • type: <LocatorAssertions>

アサーションが逆の条件をチェックするようにします。たとえば、このコードでは Locator が "error" というテキストを含んでいないことをテストします。

await expect(locator).not.toContainText('error');
taichi fukumototaichi fukumoto

expect(locator).toBeChecked([options])

  • options? <Object>
    • checked? <boolean>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout です。
  • returns: <Promise<void>>

Locator がチェックされた入力を指していることを確認する。

const locator = page.locator('.subscribe');
await expect(locator).toBeChecked();
taichi fukumototaichi fukumoto

expect(locator).toBeDisabled([options])

  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout です。
  • returns: <Promise<void>>

Locator が無効な要素を指していることを確認する。"disabled " 属性を持つか、'aria-disabled' によって無効にされた要素は無効になります。"disabled" 属性で無効にできるのは、HTML button, input, select, textarea, option, optgroup などのネイティブな制御要素だけであることに注意してください。その他の要素の "disabled" 属性は、ブラウザによって無視されます。

const locator = page.locator('button.submit');
await expect(locator).toBeDisabled();
taichi fukumototaichi fukumoto

expect(locator).toBeEditable([options])

  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout です。
  • returns: <Promise<void>>

Locator が編集可能な要素を指していることを確認する。

const locator = page.locator('input');
await expect(locator).toBeEditable();
taichi fukumototaichi fukumoto

expect(locator).toBeEmpty([options])

  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout です。
  • returns: <Promise<void>>

Locator が空の編集可能な要素またはテキストを持たないDOMノードを指していることを確認する。

const locator = page.locator('div.warning');
await expect(locator).toBeEmpty();
taichi fukumototaichi fukumoto

expect(locator).toBeEnabled([options])

  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout です。
  • returns: <Promise<void>>

Locatorが有効な要素を指していることを確認する。

const locator = page.locator('button.submit');
await expect(locator).toBeEnabled();
taichi fukumototaichi fukumoto

expect(locator).toBeFocused([options])

  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout です。
  • returns: <Promise<void>>

Locator がフォーカスされた DOM ノードを指すようにします。

const locator = page.locator('input');
await expect(locator).toBeFocused();
taichi fukumototaichi fukumoto

expect(locator).toBeHidden([options])

  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout です。
  • returns: <Promise<void>>

Locator が hidden DOM ノード (visible の反対) を指すことを保証する。

const locator = page.locator('.my-element');
await expect(locator).toBeHidden();
taichi fukumototaichi fukumoto

expect(locator).toBeVisible([options])

  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout です。
  • returns: <Promise<void>>

Locator が可視の DOM ノードを指していることを確認する。

const locator = page.locator('.my-element');
await expect(locator).toBeVisible();
taichi fukumototaichi fukumoto

expect(locator).toContainText(expected[, options])

  • expected <string|RegExp|Array<string|RegExp>> 期待される部分文字列またはRegExp、あるいはそれらのリストです。
  • options? <Object>
    • ignoreCase? <boolean> ignoreCase オプションが指定された場合、対応する正規表現フラグより優先されます。
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout です。
    • useInnerText? <boolean> DOMノードのテキストを取得する際に、element.textContent の代わりに element.innerText を使用するかどうか。
  • returns: <Promise<void>>

Locator が与えられたテキストを含む要素を指していることを確認します。値には正規表現を使用することもできます。

const locator = page.locator('.title');
await expect(locator).toContainText('substring');
await expect(locator).toContainText(/\d messages/);

array が期待値として渡される場合、要素のリスト全体がアサートされることに注意すること。

const locator = page.locator('list > .list-item');
await expect(locator).toContainText(['Text 1', 'Text 4', 'Text 5']);
taichi fukumototaichi fukumoto

expect(locator).toHaveAttribute(name, value[, options])

  • name <string> 属性名
  • value <string|RegExp> 期待される属性値。
  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
  • returns: <Promise<void>>

Locator が指定された属性の要素を指していることを確認する。

const locator = page.locator('input');
await expect(locator).toHaveAttribute('type', 'text');
taichi fukumototaichi fukumoto

expect(locator).toHaveClass(expected[, options])

  • expected <string|RegExp|Array<string|RegExp>> 期待されるクラスまたはRegExp、あるいはそれらのリスト。
  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout です。
  • returns: <Promise<void>>

Locator が指定されたCSSクラスを持つ要素を指していることを確認します。これは完全一致か、緩和された正規表現を使用する必要があります。

<div class='selected row' id='component'></div>
const locator = page.locator('#component');
await expect(locator).toHaveClass(/selected/);
await expect(locator).toHaveClass('selected row');

array が期待値として渡される場合、要素のリスト全体がアサートされることに注意すること。

const locator = page.locator('list > .component');
await expect(locator).toHaveClass(['component', 'component selected', 'component']);
taichi fukumototaichi fukumoto

expect(locator).toHaveCount(count[, options])

  • count <number> 予想されるカウント数
  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
  • returns: <Promise<void>>

Locator が正確な数の DOM ノードに解決されることを保証する。

const list = page.locator('list > .component');
await expect(list).toHaveCount(3);
taichi fukumototaichi fukumoto

expect(locator).toHaveCSS(name, value[, options])

  • name <string> CSS プロパティ名。
  • value <string|RegExp> CSS プロパティ値。
  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
  • returns: <Promise<void>>

Locatorが、与えられた計算されたCSSスタイルを持つ要素に解決されることを保証する。

const locator = page.locator('button');
await expect(locator).toHaveCSS('display', 'flex');
taichi fukumototaichi fukumoto

expect(locator).toHaveId(id[, options])

  • id <string|RegExp> エレメントの id。
  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
  • returns: <Promise<void>>

Locator が指定された DOM Node ID を持つ要素を指していることを確認する。

const locator = page.locator('input');
await expect(locator).toHaveId('lastname');
taichi fukumototaichi fukumoto

expect(locator).toHaveJSProperty(name, value[, options])

  • name <string> プロパティ名。
  • value <Object> プロパティ値。
  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
  • returns: <Promise<void>>

Locator が指定された JavaScript プロパティを持つ要素を指していることを確認します。このプロパティは、プリミティブ型でも、シリアライズ可能なJavaScriptオブジェクトでもよいことに注意してください。

const locator = page.locator('.component');
await expect(locator).toHaveJSProperty('loaded', true);
taichi fukumototaichi fukumoto

expect(locator).toHaveScreenshot(name[, options])

  • name <string|Array<string>> スクリーンショット名。

  • options? <Object>

    • animations? <"disabled"|"allow"> "disabled" に設定すると、CSS アニメーション、CSS トランジション、ウェブアニメーションを停止します。アニメーションは継続時間によって異なる扱いを受ける

      • 有限のアニメーションは、完了まで早送りされるので、transitionend イベントが発生します。
      • 無限アニメーションは、初期状態にキャンセルされ、スクリーンショット後に再生されます。
        デフォルトは "disabled" で、アニメーションを無効化される。
    • caret? <"hide"|"initial"> "hide" に設定すると、スクリーンショットのテキストキャレットが非表示になります。"initial" に設定すると、テキストキャレットの動作は変更されません。デフォルトは "hide" です。

    • mask? <Array<Locator>> スクリーンショット撮影時にマスクされるロケーターを指定します。マスクされた要素は、そのバウンディングボックスを完全に覆うピンクのボックス(#FF00FF)でオーバーレイされます。

    • maxDiffPixelRatio? <number> 総画素数に対する異なる画素の割合の許容値で、0 から 1 の間。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。#

    • maxDiffPixels? <number> 異なる可能性のあるピクセルの許容量。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。

    • omitBackground? <boolean> デフォルトの白い背景を隠し、透明度の高いスクリーンショットをキャプチャできるようにします。jpeg 画像には適用されません。デフォルトは false

    • scale? <"css"|"device"> "css" に設定すると、スクリーンショットは、ページ上の各 css ピクセルごとに 1 ピクセルずつ表示されます。高 dpi デバイスでは、スクリーンショットを小さく保つことができます。"device" オプションを使用すると、各デバイスのピクセルごとに 1 ピクセルが生成されるため、高 dpi デバイスのスクリーンショットは 2 倍またはそれ以上の大きさになります。デフォルトは "css".

    • threshold? <number> 比較した画像の同じピクセル間の、YIQ 色空間における許容可能な知覚的色差。デフォルトは 0.2。

    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout

  • returns: <Promise<void>>

この関数は、2つの連続したロケータのスクリーンショットが同じ結果を得るまで待機し、最後のスクリーンショットと期待値を比較します。

const locator = page.locator('button');
await expect(locator).toHaveScreenshot('image.png');
taichi fukumototaichi fukumoto

expect(locator).toHaveScreenshot([options])

  • options? <Object>

    • animations? <"disabled"|"allow"> "disabled" に設定すると、CSS アニメーション、CSS トランジション、ウェブアニメーションを停止します。アニメーションは継続時間によって異なる扱いを受ける

      • 有限のアニメーションは、完了まで早送りされるので、transitionend イベントが発生します。
      • 無限アニメーションは、初期状態にキャンセルされ、スクリーンショット後に再生されます。
        デフォルトは "disabled" で、アニメーションを無効化される。
    • caret? <"hide"|"initial"> "hide" に設定すると、スクリーンショットのテキストキャレットが非表示になります。"initial" に設定すると、テキストキャレットの動作は変更されません。デフォルトは "hide" です。

    • mask? <Array<Locator>> スクリーンショット撮影時にマスクされるロケーターを指定します。マスクされた要素は、そのバウンディングボックスを完全に覆うピンクのボックス(#FF00FF)でオーバーレイされます。

    • maxDiffPixelRatio? <number> 総画素数に対する異なる画素の割合の許容値で、0 から 1 の間。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。#

    • maxDiffPixels? <number> 異なる可能性のあるピクセルの許容量。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。

    • omitBackground? <boolean> デフォルトの白い背景を隠し、透明度の高いスクリーンショットをキャプチャできるようにします。jpeg 画像には適用されません。デフォルトは false

    • scale? <"css"|"device"> "css" に設定すると、スクリーンショットは、ページ上の各 css ピクセルごとに 1 ピクセルずつ表示されます。高 dpi デバイスでは、スクリーンショットを小さく保つことができます。"device" オプションを使用すると、各デバイスのピクセルごとに 1 ピクセルが生成されるため、高 dpi デバイスのスクリーンショットは 2 倍またはそれ以上の大きさになります。デフォルトは "css".

    • threshold? <number> 比較した画像の同じピクセル間の、YIQ 色空間における許容可能な知覚的色差。デフォルトは 0.2。

    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout

  • returns: <Promise<void>>

この関数は、2つの連続したロケータのスクリーンショットが同じ結果を得るまで待機し、最後のスクリーンショットと期待値を比較します。

const locator = page.locator('button');
await expect(locator).toHaveScreenshot();

1つ上のやつと何が違うのかわからない。引数が違うけど使い分けがあるのだろうか?

taichi fukumototaichi fukumoto

expect(locator).toHaveText(expected[, options])

  • expected <string|RegExp|Array<string|RegExp>> 期待される部分文字列またはRegExp、あるいはそれらのリスト。
  • options? <Object>
    • ignoreCase? <boolean> ignoreCase オプションが指定された場合,対応する正規表現フラグより優先される。
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
    • useInnerText? <boolean> DOMノードのテキストを取得する際に、element.textContent の代わりに element.innerText を使用するかどうか。
  • returns: <Promise<void>>

Locator が与えられたテキストを持つ要素を指していることを確認する。値には正規表現を使用することもできます。

const locator = page.locator('list > .component');
await expect(locator).toHaveText(['Text 1', 'Text 2', 'Text 3']);

array が期待値として渡される場合、要素のリスト全体がアサートされることに注意すること。

const locator = page.locator('list > .component');
await expect(locator).toHaveText(['Text 1', 'Text 2', 'Text 3']);
taichi fukumototaichi fukumoto

expect(locator).toHaveValue(value[, options])

  • value <string|RegExp> 期待値。
  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
  • returns: <Promise<void>>#

Locatorが与えられた入力値を持つ要素を指していることを確認する。値には正規表現を使用することもできます。

const locator = page.locator('input[type=number]');
await expect(locator).toHaveValue(/[0-9]/);
taichi fukumototaichi fukumoto

expect(locator).toHaveValues(values[, options])

  • values <Array<string|RegExp>> 現在選択されている期待されるオプション。
    • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
  • returns: <Promise<void>>#

Locator が multi-select / combobox(つまりmultiple属性を持つ選択)を指し、指定された値が選択されることを確認する。

例えば、次のような要素があるとする。

<select id="favorite-colors" multiple>
  <option value="R">Red</option>
  <option value="G">Green</option>
  <option value="B">Blue</option>
</select>
const locator = page.locator("id=favorite-colors");
await locator.selectOption(["R", "G"]);
await expect(locator).toHaveValues([/R/, /G/]);
taichi fukumototaichi fukumoto

expect(page).not

  • type: <PageAssertions>

アサーションが逆の条件をチェックするようにします。たとえば、このコードではページの URL に "error" が含まれていないことをテストします。

await expect(page).not.toHaveURL('error');
taichi fukumototaichi fukumoto

expect(page).toHaveScreenshot(name[, options])

  • name <string|Array<string>> スクリーンショット名。
  • options? <Object>
    • animations? <"disabled"|"allow"> "disabled" に設定すると、CSS アニメーション、CSS トランジション、および Web アニメーションを停止します。アニメーションは、その継続時間によって異なる扱いを受けます。
      • 有限のアニメーションは、完了まで早送りされるので、transitionend イベントが発生します。
      • 無限アニメーションは、初期状態にキャンセルされ、スクリーンショット後に再生されます。
        デフォルトは "disabled "で、アニメーションを無効化する。
    • caret? <"hide"|"initial"> "hide"に設定すると、スクリーンショットのテキストキャレットが非表示になります。"initial" に設定すると、テキストキャレットの動作は変更されません。デフォルトは "hide" です。
    • clip? <Object> 結果画像のクリッピングを指定するオブジェクト。以下のフィールドを持つ必要がある。
      • x <number> クリップ領域の左上隅の x 座標。
      • y <number> クリップ領域の左上隅の y 座標。
      • width <number> クリップ領域の幅。
      • height <number> クリップ領域の高さ。
    • fullPage? <boolean> true の場合、現在表示されているビューポートではなく、スクロール可能なページ全体のスクリーンショットを取得します。デフォルトは false です。
    • mask? <Array<Locator>> スクリーンショット撮影時にマスクされるロケーターを指定します。マスクされた要素は、そのバウンディングボックスを完全に覆うピンクのボックス #FF00FF でオーバーレイされます。
    • maxDiffPixelRatio? <number> 総画素数に対する異なる画素の割合の許容値で、01 の間。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。
    • maxDiffPixels? <number> 異なる可能性のあるピクセルの許容量。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。
    • omitBackground? <boolean> デフォルトの白い背景を隠し、透明度の高いスクリーンショットをキャプチャできるようにします。jpeg 画像には適用されません。デフォルトは false です。
    • scale? <"css"|"device"> "css" に設定すると、スクリーンショットは、ページ上の各 css ピクセルごとに 1 ピクセルずつ表示されます。高 dpi デバイスでは、スクリーンショットを小さく保つことができます。"device" オプションを使用すると、各デバイスのピクセルごとに 1 ピクセルが生成されるため、高 dpi デバイスのスクリーンショットは 2 倍またはそれ以上の大きさになります。デフォルトは "css".
    • threshold? <number> 比較した画像の同じピクセル間の、YIQ 色空間における許容可能な知覚的色差。デフォルトは 0.2。
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
  • returns: <Promise<void>>

この関数は、2つの連続したページのスクリーンショットが同じ結果になるまで待機し、最後のスクリーンショットと期待値を比較します。

await expect(page).toHaveScreenshot('image.png');
taichi fukumototaichi fukumoto

expect(page).toHaveScreenshot([options])

  • options? <Object>
    • animations? <"disabled"|"allow"> "disabled" に設定すると、CSS アニメーション、CSS トランジション、および Web アニメーションを停止します。アニメーションは、その継続時間によって異なる扱いを受けます。
      • 有限のアニメーションは、完了まで早送りされるので、transitionend イベントが発生します。
      • 無限アニメーションは、初期状態にキャンセルされ、スクリーンショット後に再生されます。
        デフォルトは "disabled "で、アニメーションを無効化する。
    • caret? <"hide"|"initial"> "hide"に設定すると、スクリーンショットのテキストキャレットが非表示になります。"initial" に設定すると、テキストキャレットの動作は変更されません。デフォルトは "hide" です。
    • clip? <Object> 結果画像のクリッピングを指定するオブジェクト。以下のフィールドを持つ必要がある。
      • x <number> クリップ領域の左上隅の x 座標。
      • y <number> クリップ領域の左上隅の y 座標。
      • width <number> クリップ領域の幅。
      • height <number> クリップ領域の高さ。
    • fullPage? <boolean> true の場合、現在表示されているビューポートではなく、スクロール可能なページ全体のスクリーンショットを取得します。デフォルトは false です。
    • mask? <Array<Locator>> スクリーンショット撮影時にマスクされるロケーターを指定します。マスクされた要素は、そのバウンディングボックスを完全に覆うピンクのボックス #FF00FF でオーバーレイされます。
    • maxDiffPixelRatio? <number> 総画素数に対する異なる画素の割合の許容値で、01 の間。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。
    • maxDiffPixels? <number> 異なる可能性のあるピクセルの許容量。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。
    • omitBackground? <boolean> デフォルトの白い背景を隠し、透明度の高いスクリーンショットをキャプチャできるようにします。jpeg 画像には適用されません。デフォルトは false です。
    • scale? <"css"|"device"> "css" に設定すると、スクリーンショットは、ページ上の各 css ピクセルごとに 1 ピクセルずつ表示されます。高 dpi デバイスでは、スクリーンショットを小さく保つことができます。"device" オプションを使用すると、各デバイスのピクセルごとに 1 ピクセルが生成されるため、高 dpi デバイスのスクリーンショットは 2 倍またはそれ以上の大きさになります。デフォルトは "css".
    • threshold? <number> 比較した画像の同じピクセル間の、YIQ 色空間における許容可能な知覚的色差。デフォルトは 0.2。
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
  • returns: <Promise<void>>

この関数は、2つの連続したページのスクリーンショットが同じ結果になるまで待機し、最後のスクリーンショットと期待値を比較します。

await expect(page).toHaveScreenshot();
taichi fukumototaichi fukumoto

expect(page).toHaveTitle(titleOrRegExp[, options])

  • titleOrRegExp <string|RegExp> 期待されるタイトルまたは RegExp.
  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
  • returns: <Promise<void>>

ページが与えられたタイトルを持つことを確認する。

await expect(page).toHaveTitle(/.*checkout/);
taichi fukumototaichi fukumoto

expect(page).toHaveURL(urlOrRegExp[, options])

  • urlOrRegExp <string|RegExp> 期待されるURLの文字列またはRegExp
  • options? <Object>
    • timeout? <number> アサーションを再試行する時間。デフォルトは TestConfig.expecttimeout
  • returns: <Promise<void>>

ページが与えられたURLにナビゲートされることを保証する。

await expect(page).toHaveURL(/.*checkout/);
taichi fukumototaichi fukumoto

expect(apiResponse).not

  • type: <APIResponseAssertions>

アサーションが逆の条件をチェックする。たとえば、このコードではレスポンスステータスが成功でないことをテストする。

await expect(response).not.toBeOK();
taichi fukumototaichi fukumoto

expect(screenshot).toMatchSnapshot(name[, options])

  • name <string|Array<string>> スクリーンショット名。
  • options? <Object>
    • maxDiffPixelRatio? <number> 総画素数に対する異なる画素の割合の許容値で、01 の間。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。
    • maxDiffPixels? <number> 異なる可能性のあるピクセルの許容量。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。
    • threshold? <number> 比較した画像の同じピクセル間の、YIQ 色空間における許容可能な知覚的色差。デフォルトは 0.2。
  • returns: <void>

渡された値(文字列またはBuffer)が、test snapshots ディレクトリに保存されている期待されるスナップショットに一致することを確認します。

// 基本的な使い方
expect(await page.screenshot()).toMatchSnapshot('landing-page.png');

// スナップショット比較をカスタマイズし、生成された名前を持つようにオプションを渡す。
expect(await page.screenshot()).toMatchSnapshot('landing-page.png', {
  maxDiffPixels: 27, // allow no more than 27 different pixels.
});

// 画像マッチングの閾値を設定する。
expect(await page.screenshot()).toMatchSnapshot('landing-page.png', { threshold: 0.3 });

// ファイルパス・セグメントを渡すことで、スナップショット・ファイルに構造を持たせることができます。
expect(await page.screenshot()).toMatchSnapshot(['landing', 'step2.png']);
expect(await page.screenshot()).toMatchSnapshot(['landing', 'step3.png']);
taichi fukumototaichi fukumoto

expect(screenshot).toMatchSnapshot([options])

  • options? <Object>
    • maxDiffPixelRatio? <number> 総画素数に対する異なる画素の割合の許容値で、01 の間。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。
    • maxDiffPixels? <number> 異なる可能性のあるピクセルの許容量。デフォルトは TestConfig.expect で設定可能。デフォルトでは未設定。
    • threshold? <number> 比較した画像の同じピクセル間の、YIQ 色空間における許容可能な知覚的色差。デフォルトは 0.2。
  • returns: <void>

渡された値(文字列またはBuffer)が、test snapshots ディレクトリに保存されている期待されるスナップショットに一致することを確認します。

// 基本的な使い方で、ファイル名はテスト名に由来。
expect(await page.screenshot()).toMatchSnapshot();

// スナップショット比較をカスタマイズし、生成された名前を持つようにオプションを渡す。
expect(await page.screenshot()).toMatchSnapshot({
  maxDiffPixels: 27, // allow no more than 27 different pixels.
});

// 画像マッチングの閾値とスナップショット名を設定する。
expect(await page.screenshot()).toMatchSnapshot({
  name: 'landing-page.png',
  threshold: 0.3,
});