用語

Puppeteer

Puppeteerは、Googleが開発するオープンソースのNode.jsライブラリです。高水準APIからChromeとFirefoxを操作し、スクリーンショット自動化、テスト、Webスクレイピングなどに広く使われます。

Puppeteerでできること

Puppeteerは、Chrome DevTools ProtocolとWebDriver BiDiを通じて対応ブラウザを操作します。人がブラウザで行う操作の多くに加え、自動化向けの処理もAPIから実行できます。

主な機能は次のとおりです。

  • ページ移動: URLを開き、指定したネットワーク状態やDOM要素を待ち、リダイレクトと認証を処理します
  • スクリーンショット撮影: ページを描画し、PNG、JPEG、WebPで保存します。表示中のビューポートまたはスクロールできるページ全体を撮影できます
  • PDF生成: 描画したページをPDFへ書き出し、用紙サイズ、余白、ヘッダー、フッターを設定します
  • DOM操作: 要素のクリック、フォーム入力、ドロップダウンの選択、文字入力を行います。撮影前に利用者の操作が必要なワークフローも自動化できます
  • ネットワークのインターセプト: ネットワークリクエストを監視、変更、遮断します。エラー状態のテスト、広告の遮断、リソースサイズの測定などに使えます
  • JavaScriptの評価: ページのコンテキストで任意のJavaScriptを実行し、データを抽出したり、撮影前にDOMを変更したりします

実際のブラウザエンジンを操作するため、CSSレイアウト、Webフォント、アニメーション、JavaScriptで生成する内容を含め、対応ブラウザで利用者が見るものに近い結果を描画できます。OS、フォント、GPUなど実行環境による差は考慮してください。

Puppeteerによるスクリーンショット撮影

スクリーンショットはPuppeteerでよく使われる機能です。page.screenshot()メソッドから細かく制御できます。

ビューポート寸法とデバイススケール係数を指定し、スマートフォンから4Kモニターまで任意の画面サイズを再現できます。fullPageオプションでは、表示領域だけでなく、スクロールできる書類全体を撮影します。クリップ領域を指定すれば、ページ内の長方形の範囲だけを撮れます。

遅延読み込みを使うページでは、撮影前にPuppeteerのスクリプトでページをスクロールし、延期された画像を読み込ませます。Cookieバナーやポップアップをプログラムで閉じ、独自CSSを挿入して不要な要素を隠すこともできます。

スクリーンショットツールやAPIの内部では、Puppeteerまたは同種のライブラリが使われることがあります。これらの機能を簡単な画面で包み、ブラウザ自動化のコードを書かなくてもページを撮影できるようにします。

実務では、Chromeを使ってページを撮影するスクリプトを短時間で作りやすい選択肢です。ビューポート、待機処理、出力形式を1か所で設定し、監査、レポート、定期撮影へ同じスクリプトを使い回せます。

PuppeteerとPlaywrightの違い

PuppeteerとPlaywrightは、ヘッドレスブラウザ自動化で広く使われる2つのライブラリです。Playwrightチームの複数のメンバーは、以前Puppeteerの開発に携わっていました。

ブラウザ対応: 現在のPuppeteerはChrome for Testingと安定版Firefoxに対応します。Playwrightは1つのAPIでChromium、Firefox、WebKitを扱うため、WebKitの撮影とテストも対象にできます。

API設計: 共通点は多いものの、Playwrightには標準の自動待機、分離セッション用のブラウザコンテキスト、複数ページやフレームへの組み込み対応などがあります。Puppeteerでも対応できる機能がありますが、APIと標準動作が異なります。

性能: 多くの処理では同程度です。Chromeだけを扱う場合は、DevTools Protocolへ直接つながるPuppeteerがわずかに有利な場合があります。Playwrightの複数ブラウザ抽象化による負荷は小さいものです。

コミュニティと周辺ツール: Puppeteerは提供期間が長く、プラグインやチュートリアルが豊富です。Playwrightも継続して成長し、複数ブラウザを必要とする新しいプロジェクトでよく選ばれます。

よくある失敗

  • ページの内容を待たない: page.goto()の直後にpage.screenshot()を呼ぶと、読み込み途中のページを撮る場合があります。waitUntil: 'networkidle0'を使うか、特定のセレクターを待って、必要な内容が描画されたことを確認します
  • 標準のビューポート寸法を使う: Puppeteerの標準ビューポートは800×600で、実際によく使う画面とは異なります。目的の出力に合わせてビューポート寸法とデバイススケール係数を明示します
  • Cookie同意バナーを無視する: 自動撮影は新規訪問者としてページを開きます。同意オーバーレイを閉じなければ、ページ内容よりバナーが目立つ画像になります
  • サーバーでヘッド付きモードを使う: Puppeteerは標準でヘッドレスですが、スクリプトが明示的にヘッド付きへ変えると、ディスプレイのないサーバーで失敗します。サーバーとCIではヘッドレスモードを使います
  • ページ移動のエラーを処理しない: ページはタイムアウト、エラー応答、予期しないリダイレクトを起こす場合があります。1ページの失敗でスクリプト全体が停止しないよう、移動と撮影をエラー処理で囲みます

よくある質問

Puppeteerは無料ですか?

はい。PuppeteerはApache 2.0ライセンスで公開されたオープンソースソフトウェアです。GoogleのChrome DevToolsチームが保守し、npmから無料でインストールできます。

Puppeteerでフルページスクリーンショットを撮れますか?

はい。`page.screenshot()`メソッドの`fullPage`オプションを使うと、表示中のビューポートだけでなく、スクロールできるページ全体を撮影できます。PNG、JPEG、WebPで出力できます。

PuppeteerはFirefoxでも動きますか?

はい。現在のPuppeteerはChrome for Testingと安定版Firefoxに対応します。WebKitには対応しないため、そのエンジンでも比較する場合はPlaywrightのほうが広い範囲を扱えます。

PuppeteerとSeleniumの違いは?

Puppeteerは、ChromeではChrome DevTools Protocol、対応するChromeとFirefoxの自動化ではWebDriver BiDiを使います。Seleniumは、より広いブラウザと古い環境に対応します。必要なブラウザと既存のテスト基盤に合わせて選びます。

画面のないサーバーでもPuppeteerを実行できますか?

はい。Puppeteerは標準でChromeをヘッドレスモードで動かすため、ディスプレイサーバーは必要ありません。Linuxサーバー、Dockerコンテナ、GUIのないCI環境で利用できます。ただし、ブラウザの実行に必要なシステムライブラリは環境へ用意します。

出典

関連資料

Puppeteerとは | 用語集 | Shotomatic