Cypressでスクリーンショットを撮る:Cypress.Screenshot API徹底解説

2024-04-02

Cypressでスクリーンショットを撮る:Cypress.Screenshot API徹底解説

Cypress.Screenshot APIの使い方

手動でスクリーンショットを撮る

cy.screenshot('my-screenshot'); // スクリーンショットを撮って 'my-screenshot.png' という名前で保存
  • 引数にファイル名を指定することで、保存するファイル名を指定できます。
  • ファイル名は .png 形式で自動的に拡張されます。
  • オプションで、selector を指定して特定の要素のみをキャプチャすることもできます。

テスト失敗時に自動的にスクリーンショットを撮る

Cypress はデフォルトで、テスト失敗時に自動的にスクリーンショットを撮ります。

describe('My tests', () => {
  it('should fail', () => {
    // テストが失敗するコード
    expect(true).to.be.false;
  });
});

上記のコードを実行すると、テストが失敗した際に screenshots フォルダに my-tests-should-fail.png という名前でスクリーンショットが保存されます。

Cypress.Screenshot API は、スクリーンショットのキャプチャ方法を細かくカスタマイズするための様々なオプションを提供しています。

  • screenshotOnRunFailure: テスト失敗時に自動的にスクリーンショットを撮るかどうかを指定します。
  • trashAssetsBeforeRuns: テスト実行前に screenshots フォルダをクリアするかどうかを指定します。
  • defaultScreenshotWidth: スクリーンショットのデフォルト幅を指定します。
  • blackout: スクリーンショットから特定の要素を隠すかどうかを指定します。

これらのオプションは、cypress.json ファイルまたは Cypress.Screenshot.defaults() メソッドを使用して設定できます。

Cypress.Screenshot APIの利点

  • テストの失敗原因を視覚的にデバッグするのに役立ちます。
  • テスト結果を分かりやすく報告することができます。
  • アプリケーションのUIの変更を記録することができます。

Cypress.Screenshot APIの注意点

  • スクリーンショットのキャプチャは、テストの実行速度を遅らせる可能性があります。
  • 大量のスクリーンショットを保存すると、ディスク容量を圧迫する可能性があります。

Cypress.Screenshot APIのサンプルコード

// cypress.json

{
  "screenshotOnRunFailure": true,
  "defaultScreenshotWidth": 1024,
  "defaultScreenshotHeight": 768,
  "blackout": ["#my-secret-element"]
}

// テストコード

cy.screenshot('my-screenshot');

cy.get('#my-element').screenshot('my-element-screenshot');

Cypress.Screenshot.defaults({
  screenshotOnRunFailure: false,
  blackout: []
});

Cypress.Screenshot API は、Cypress テストでスクリーンショットを簡単にキャプチャするための強力なツールです。テストのデバッグ、報告、UI変更の記録などに役立ちます。



Cypress.Screenshot API サンプルコード集

基本的なスクリーンショットキャプチャ

// テストコード

cy.screenshot('my-screenshot'); // スクリーンショットを撮って 'my-screenshot.png' という名前で保存

cy.get('#my-element').screenshot('my-element-screenshot'); // 特定の要素のみをキャプチャ

// cypress.json

{
  "screenshotOnRunFailure": true, // テスト失敗時に自動的にスクリーンショットを撮る
  "defaultScreenshotWidth": 1024, // スクリーンショットのデフォルト幅
  "defaultScreenshotHeight": 768  // スクリーンショットのデフォルト高さ
}

オプションの使用

// テストコード

cy.screenshot({
  blackout: [".my-secret-element"], // 特定の要素を隠す
  clip: {
    x: 100,
    y: 100,
    width: 500,
    height: 500,
  }, // スクリーンショットの範囲を指定
  captureElement: document.querySelector('#my-element'), // 特定のDOM要素をキャプチャ
  delay: 1000, // スクリーンショットを撮る前に1秒待機
  overwrite: true, // 既存のファイルがあれば上書きする
  scale: 0.5, // スクリーンショットを縮小
  type: 'jpeg', // スクリーンショットのファイル形式
});

高度なテクニック

// テストコード

// テスト完了後にスクリーンショットを撮る
Cypress.on('test:after:run', (test) => {
  if (test.state === 'failed') {
    cy.screenshot('my-screenshot-' + test.title);
  }
});

// スクリーンショットをギャラリーとして表示する
Cypress.Screenshot.defaults({
  screenshotOnRunFailure: false,
  blackout: [],
  onBeforeScreenshot: (screenshot) => {
    // スクリーンショットを加工する
  },
  onAfterScreenshot: (screenshot) => {
    // スクリーンショットをギャラリーに追加する
  },
});


Cypressでスクリーンショットを撮る:その他の方法

cy.get().then() を使用

cy.get('#my-element').then(($element) => {
  const screenshot = $element.screenshot();
  // スクリーンショットデータを処理
});

この方法では、cy.get() で要素を取得してから、screenshot() メソッドを使用してスクリーンショットをキャプチャします。

cy.exec() を使用

cy.exec('npx cypress-image-snapshot --input-file screenshots/my-screenshot.png --output-file screenshots/my-screenshot-diff.png');

この方法では、cy.exec() を使用して cypress-image-snapshot コマンドを実行し、スクリーンショットの差分画像を作成することができます。

これらのライブラリは、Cypress.Screenshot API よりも高度な機能を提供することができます。

  • シンプルで簡単な方法: Cypress.Screenshot API
  • 特定の要素のみをキャプチャしたい場合: cy.get().then()
  • スクリーンショットの差分画像を作成したい場合: cy.exec() または 3rd party ライブラリ
  • フルページスクリーンショットを撮りたい場合: 3rd party ライブラリ
  • 視覚テストを行いたい場合: 3rd party ライブラリ

Cypress でスクリーンショットを撮る方法はいくつかあります。要件に合わせて適切な方法を選択してください。




Cypressのtriggerコマンドを使いこなしてテストコードを効率的に記述しよう!

triggerコマンドの利点:テストコードを簡潔かつ分かりやすく記述できる複雑なユーザー操作を自動化できる特定のイベントに対する要素の反応を検証できるtriggerコマンドの使い方:triggerコマンドの詳細:イベントの種類は、Cypressドキュメント: URL Cypress triggerを参照



Cypress コマンド "reload" を使う

基本的な使い方:この例では、#some-element をクリックした後、ページをリロードし、#some-element が表示されていないことを確認しています。オプションの指定:cy. reload() コマンドは、オプションを指定して呼び出すことができます。


Cypressで要素操作をレベルアップ!prevUntilコマンドの活用術

prevUntilコマンドは、現在の要素から指定された条件を満たす要素までのすべて前の兄弟要素を取得します。取得した要素は、テストや操作の対象として使用できます。構文引数<selector>:現在の要素を取得するためのセレクター<selector>:取得を終了する要素を指定するためのセレクター


Cypress テストをデバッグ・速度制御: pause コマンド活用術

pause()コマンドは、単独で使用することも、引数と組み合わせて使用することもできます。単独で使用する場合:テストの実行を一時停止します。画面中央に「Cypress Paused」というメッセージが表示されます。実行を再開するには、EnterキーまたはSpaceキーを押します。


Cypress テストコードを劇的に改善! "within" の使い方をマスターしよう

上記の例では、selector で指定された要素内でのみ click と type コマンドが実行されます。要素間の切り替えを簡略化: テスト対象の要素階層が深い場合、within を使用することで、各要素へのアクセスを簡潔に記述できます。



Cypress テストをデバッグ・速度制御: pause コマンド活用術

pause()コマンドは、単独で使用することも、引数と組み合わせて使用することもできます。単独で使用する場合:テストの実行を一時停止します。画面中央に「Cypress Paused」というメッセージが表示されます。実行を再開するには、EnterキーまたはSpaceキーを押します。


Cypress clock コマンドのサンプルコード

cy. clock() コマンドは、Cypress テスト内で時間を操作するための強力なツールです。テストの特定の時点をシミュレートしたり、時間経過に依存する機能を検証したりするのに役立ちます。使用方法cy. clock() コマンドは、以下の 2 つの方法で使用できます。


Cypress "closest" コマンド:Web テストのデバッグを強力にサポート

Cypress の "closest" は、要素とその親要素を検索し、一致する最初の親要素を見つけるコマンドです。これは、特定の条件に合致する要素の親要素を取得したい場合に役立ちます。使い方"closest" コマンドは、以下の形式で使用します。


CypressでJavaScriptコードを使用して状態をリセットする

Cypressで利用可能なクリアコマンド:cy. clear() - テキスト入力フィールドの値をクリアします。cy. clearCookies() - ブラウザのすべてのクッキーを削除します。cy. clearAllSessionStorage() - セッションストレージに保存されているすべてのデータを削除します。


Cypressで要素操作をレベルアップ!prevUntilコマンドの活用術

prevUntilコマンドは、現在の要素から指定された条件を満たす要素までのすべて前の兄弟要素を取得します。取得した要素は、テストや操作の対象として使用できます。構文引数<selector>:現在の要素を取得するためのセレクター<selector>:取得を終了する要素を指定するためのセレクター