ちょっとした技術メモを忘れないうちに書いていく

playwrightでブラウザのキャプチャ取得、録画

2025-06-18

修正前後のエビデンス取得にどうぞ


E2EテストツールであるPlaywrightの使用して、ブラウザの操作のキャプチャを録画を行う。

公式ページはこちら

node.jsだけではなくPython、Java、.NETのライブラリもあるみたい。

環境構築&インストール

playwrightをE2Eテストとして使用するときは
yarn create playwright
でインストールするとテスト用ディレクトリ・設定ファイルが作成される。

今回はライブライだけ使用したのでyarn addでインストール。

# 環境初期化
yarn init

# インストール
yarn add ts-node typescript @types/node playwright

# tsconfig.jsonを作成
npx tsc --init

サンプルプログラム

プログラムのポイント

  • goto:画面遷移
  • screenshot:キャプチャ
  • locator:ページ内の要素をセレクタを使用して取得(今回はキャプチャを取得)
  • evaluate:ヘッドレズブラウザ(ページを表示しているブラウザ)に対する処理を記述
index.ts
import { chromium } from "playwright";

(async () => {

  // ブラウザの高さ(スクロールなどに使用するので変数で定義)
  const viewHeight = 1080;

  // ヘッドレスブラウザを起動
  const browser = await chromium.launch();
  const context = await browser.newContext({
    recordVideo: {
      dir: "./videos/",size: { width: 1920, height: viewHeight },}, // 動画の保存先を指定
  });

  // ヘッドレスブラウザのページを開く
  const page = await context.newPage();
  await page.setViewportSize({ width: 1920, height: viewHeight });
  await page.goto("https://playwright.dev/");
  // ページの読み込みを待つ
  await page.waitForLoadState("load");
  // 画面全体をキャプチャ
  await page.screenshot({ path: "img/top.png", fullPage: true });
  // ヘッダー部分をキャプチャ
  await page.locator(".hero--primary").screenshot({ path: "img/header.png" });
  // 録画用に2秒待機
  await page.waitForTimeout(2000);

  await page.goto("https://playwright.dev/docs/intro");
  await page.waitForLoadState("load");

  // 表示している画面の高さを取得
  const maxScrollHeight = await page.evaluate(() => {
    return document.body.scrollHeight;
  });

  // ページ全体を録画できるように、画面の高さを超えるまでスクロール
  let newScrollHeight = 0;
  while (newScrollHeight < maxScrollHeight) {
    await page.evaluate(
      ({ newScrollHeight, viewHeight }) => {
        window.scrollTo(0, newScrollHeight + viewHeight);
      },
      { newScrollHeight, viewHeight }
    );
    await page.waitForTimeout(2000);
    newScrollHeight = newScrollHeight + viewHeight - 100;//100px分余白として
  }

  const video = await page.video();
  await context.close();

  if (video) {
    // 動画ファイルに名前を付けて保存、元の動画ファイルは削除
    await video.saveAs("videos/playwright_video.webm");
    await video.delete();
  }

  await browser.close();
})();

実行

npx ts-node index.ts

実行結果

実行後、imgフォルダとvideosフォルダにファイルが作成されていることを確認。

実行中はvideosに録画中の仮ファイルが作成される。

playwright_2.png

左:top.pngと右:header.pngと

top.pngはサイズが大きいので縮小

playwright_1.png

録画した動画ファイル

webm形式なのでvideoタグなどに指定して再生できる

    <video controls width="1280" height="720">
        <source src="./videos/playwright_video.webm" type="video/webm">
        お使いのブラウザは動画再生に対応していません。
    </video>

目次