Puppeteerとは?Chrome自動操作Nodeライブラリの仕組みと使い方【2026年最新】
Puppeteer(パペティア)は、ChromeやChromiumをDevToolsプロトコル経由でプログラムから操作する、Google(Chrome DevToolsチーム)製のNode.jsライブラリです。ページの読み込み・クリック・入力・スクリーンショット・PDF出力といったブラウザ操作をコードで再現でき、Webスクレイピングやエンドツーエンド(E2E)テストの自動化に使われます。この記事では、名前の意味と読み方、DevToolsプロトコルで動く仕組み、インストールと最小コード、SeleniumやPlaywrightとの使い分け、他言語での利用、そしてv20以降で大きく変わった仕様までを、公式ドキュメントの事実に沿って整理します。
まとめ:この記事の要点
- Puppeteerは「Chrome/ChromiumをDevToolsプロトコルで操作するNode.jsライブラリ」。GoogleのChrome DevToolsチームが開発するオープンソース(Apache-2.0)。
- 読み方はパペティアで、原義は「人形遣い(傀儡師)」。ブラウザを人形のように操る、という名前。
npm i puppeteerで本体と「Chrome for Testing」が自動ダウンロードされ、すぐ動く。ブラウザを同梱したくないならpuppeteer-coreを使う。- 用途はスクレイピング・E2Eテスト・PDF/スクショ生成・パフォーマンス計測。JavaScriptが生成する動的コンテンツも取得できる。
- クロスブラウザで選ぶならPlaywright、既存の言語・資産に合わせるならSeleniumが有利。ChromeのCDPを深く使うならPuppeteer。
- v20でChrome for Testing採用、v22で新ヘッドレスが既定、v23でWebDriver BiDi対応とFirefox正式サポート。
page.waitForTimeout()はv22.0.0で削除された。
Puppeteerとは何か:定義・読み方・仕組み
Puppeteerは、Chrome DevToolsプロトコル(CDP)を介してブラウザを制御する高レベルAPIを提供するNode.jsライブラリです。ブラウザを「ヘッドレス(画面非表示)」でも「ヘッドフル(画面表示)」でも動かせ、実際のブラウザエンジンでページを描画してから操作するため、JavaScriptで後から生成される要素も扱えます。ライセンスはApache-2.0で、商用利用を含めて無償で使えます。
読み方と名前の由来
「Puppeteer」の読み方はパペティア(英語の puppeteer =人形遣い、傀儡師)です。操作対象のブラウザを人形に見立て、それを糸で操る人形遣いになぞらえた命名です。検索では実験器具の「ピペッター(pipette)」と混同されやすいですが、両者は無関係です。
DevToolsプロトコル(CDP)で動く仕組み
Chrome DevToolsプロトコルは、ChromeやChromiumが公開する制御用インターフェースで、DOM操作・ネットワーク傍受・コンソールログ取得・パフォーマンス計測などをプログラムから実行できます。PuppeteerはこのプロトコルにWebSocketで接続し、コマンドを送ってブラウザを操作します。ブラウザ拡張やHTTPリクエスト単体では届かない「実際にレンダリングされた後のページ」を扱えるのが、CDPを土台にするPuppeteerの核心です。なお後述のとおり、v23以降はChromeに対するCDPに加えて、標準仕様のWebDriver BiDiにも対応しています。
Puppeteerでできること(主な用途)
Puppeteerの用途は、ブラウザ操作を伴う自動化に集約されます。代表的なものは次の4つです。
- Webスクレイピング:JavaScriptで生成される動的コンテンツを含め、レンダリング後のHTMLからデータを抽出する。単純なHTTP取得では取れないSPA(シングルページアプリ)のデータに強い。
- E2Eテスト:ログイン→操作→検証といった実ユーザーの流れを再現し、フロントとバックエンドが連携して動くかを確認する。MochaやJestなどのテストフレームワークと組み合わせる。
- PDF・スクリーンショット生成:請求書・レポートのPDF化や、UIの見た目を記録するビジュアルリグレッションテストに使う。
- パフォーマンス計測:ページ読み込み時間やリソース使用状況を収集し、ボトルネックを特定する。
逆に、静的なHTMLだけを取得すれば足りる用途では、ブラウザを起動しないHTTPクライアント(fetchやaxios)の方が速く軽いです。ブラウザを丸ごと立ち上げるコストに見合うのは、「JavaScript実行後の状態」や「実ユーザー操作の再現」が必要な場面に限られます。
インストールと最小コード(使い方の第一歩)
Node.js(v18以上が目安。対応版は公式で確認)が入っていれば、インストールはコマンド1つです。
npm i puppeteer
このコマンドでライブラリ本体に加え、動作確認済みのブラウザ「Chrome for Testing」が自動ダウンロードされます(以前のChromiumから、v20でChrome for Testingに変わりました)。CI環境などでダウンロードを避けたい場合は、環境変数 PUPPETEER_SKIP_DOWNLOAD でスキップし、既存のChromeを executablePath で指定します。次は、ページを開いてスクリーンショットを撮る最小例です。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch(); // 既定でヘッドレス起動
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({ path: 'example.png' });
await browser.close();
})();
ESM(import puppeteer from 'puppeteer')でも同様に書けます。要素の操作は page.click()・page.type()・page.select()、動的な要素の待機は page.waitForSelector() を使うのが基本です。
puppeteerとpuppeteer-coreの違い
パッケージは2種類あります。ブラウザを同梱してすぐ動かしたいなら puppeteer、ブラウザは自前で用意し軽く保ちたいなら puppeteer-core を選びます。
| 項目 | puppeteer | puppeteer-core |
|---|---|---|
| ブラウザ同梱 | あり(Chrome for Testingを自動DL) | なし(自分で用意) |
| すぐ動くか | インストール後すぐ | executablePath指定が必要 |
| 主な用途 | ローカル開発・学習・一般的な自動化 | Docker/サーバーレス等の軽量構成 |
ヘッドレスモードの指定方法
起動モードは launch() の headless オプションで切り替えます。v22以降は「新ヘッドレス」が既定で、通常のChromeと同じコードパスで動くため挙動のズレが減りました。
await puppeteer.launch({ headless: true }); // 新ヘッドレス(v22以降の既定)
await puppeteer.launch({ headless: 'shell' }); // 旧chrome-headless-shell(軽量・機能限定)
await puppeteer.launch({ headless: false }); // 画面表示あり(デバッグ向き)
スクレイピングやCIのバッチ処理はヘッドレス、UIの挙動を目視で追いたいデバッグ時は headless: false、という使い分けが基本です。
Playwright・Seleniumとの違いと選び方
ブラウザ自動化ツールは複数あり、Puppeteerが常に最適とは限りません。判断基準は「対応ブラウザの広さ」「使う言語」「Chrome依存の深さ」の3点です。
| 観点 | Puppeteer | Playwright | Selenium |
|---|---|---|---|
| 開発元 | Microsoft | OSSコミュニティ | |
| 主な対応ブラウザ | Chrome/Firefox | Chromium/Firefox/WebKit | 主要ブラウザ全般 |
| 対応言語 | JavaScript/TypeScript | JS/Python/Java/.NET | 多言語(Java/Python他) |
| 強み | ChromeのCDPに密着 | クロスブラウザと自動待機 | 実績と広い言語・環境対応 |
結論としては、Safari(WebKit)を含むクロスブラウザ検証や自動待機の手厚さを重視するならPlaywrightが有利で、新規のE2Eテストでは第一候補になります。既存資産がJava/Pythonにあり、多環境で動かす必要があるならSelenium。ChromeのDevToolsプロトコルを深く使う(詳細なネットワーク傍受やパフォーマンストレースなど)用途、あるいはNode.js中心の小回りの利く自動化ならPuppeteerが噛み合います。ブラウザ自動化全体の位置づけはBrowser Automationの解説も参考になります。
PythonやRubyなど他言語での利用
Puppeteer本体はNode.js専用です。他言語では非公式の移植版が存在しますが、扱いには注意が必要です。
- Python:非公式移植の「pyppeteer」がありますが、更新が停滞しており最新のChromeで不具合が出やすい状況です。PythonでPuppeteer相当のことをするなら、同じChromiumベースで公式にPython対応するPlaywright for Pythonを検討する方が現実的です。
- Ruby:「puppeteer-ruby」という非公式Gemがあり、PuppeteerのAPIをRubyから呼び出せます。ただし公式サポートではないため、本番運用では追随状況を確認してから採用してください。
いずれの移植版も「公式ではない」点が共通のリスクです。長期運用や重要なテスト基盤では、Node.jsでの公式Puppeteer、または各言語で公式サポートのある他ツールを優先するのが安全です。
最新版で押さえておく変更点(v20〜v25)
Puppeteerはバージョンで既定挙動が変わっています。古い記事のコードをそのまま使うと動かないことがあるため、次の点を押さえておきます(記事作成時点の最新はv25系。正確な最新版は公式で確認してください)。
| バージョン | 主な変更 |
|---|---|
| v20 | 同梱ブラウザがChromiumからChrome for Testingへ |
| v22 | 新ヘッドレスが既定に(旧ヘッドレスは'shell'指定) |
| v23 | WebDriver BiDiが実用段階に。Firefox安定版を正式サポート |
v24・v25では既定挙動を壊す大きな変更はなく、細かな改善とブラウザ追随が中心です。むしろ古い記事で注意したいのが page.waitForTimeout() で、これはv22.0.0で削除されました(現行では呼ぶとエラーになります)。固定時間の待機はテストを不安定にするため、条件が満たされるまで待つ page.waitForSelector() や、自動待機を備えたLocator API(page.locator())への置き換えが推奨されます。どうしても固定待機が必要な場合は new Promise(r => setTimeout(r, 1000)) で代替します。また、Chromeを操作するときの既定プロトコルはCDPのままですが、Firefoxを起動するとWebDriver BiDiが既定で使われる点も覚えておくと、ブラウザ差の挙動を理解しやすくなります。
よくある質問(FAQ)
Puppeteerの読み方は?
パペティアです。英語の puppeteer(人形遣い・傀儡師)が語源で、ブラウザを操る様子をなぞらえた名前です。実験器具の「ピペッター」とは無関係です。
PuppeteerはPythonで使えますか?
本体はNode.js専用です。Python向けには非公式のpyppeteerがありますが更新が停滞しているため、PythonではPlaywright for Pythonなど公式対応のツールを選ぶ方が安定します。
PuppeteerとSeleniumの違いは?
PuppeteerはChromeのDevToolsプロトコルに密着したNode.jsライブラリで、Chrome/Firefoxが対象です。Seleniumは多言語・多ブラウザに対応し実績が豊富で、既存資産や幅広い環境対応を重視する場合に向きます。
Puppeteerは無料で使えますか?
はい。ライセンスはApache-2.0のオープンソースで、商用利用を含めて無償で利用できます。
インストールするとChromiumがダウンロードされますか?
puppeteerを入れると、現在はChromiumではなく「Chrome for Testing」が自動ダウンロードされます。ダウンロードを避けたい場合はpuppeteer-coreを使うか、環境変数でスキップして既存のChromeを指定します。