chromedpとは?GoでChromeを自動操作する使い方・比較・エラー対処【2026年版】
chromedpは、Chrome DevTools Protocol(CDP)を通じてGoogle ChromeやChromiumを操作するGo言語向けのライブラリです。WebDriverもSeleniumサーバーも外部ランタイムも要らず、Goのコードだけでページ遷移・クリック・入力・スクリーンショット取得・JavaScript実行を記述できます。この記事では、chromedpのインストールから基本操作、Selenium・Puppeteer・Playwrightとの違い、ヘッドレスモードの正しい理解、そして実務で必ず踏む「context deadline exceeded」などのエラー対処までをまとめます。まず全体像は次のまとめで確認してください。
まとめ:chromedpの要点
- 正体:CDPでChrome/Chromiumを直接叩くpure Goライブラリ(最新はv0.15.1、2026年4月1日リリース)。WebDriver不要。
- 導入:
go get -u github.com/chromedp/chromedpの1行。動作にはChrome本体(またはchrome-headless-shell)が必要。 - 基本形:
chromedp.NewContextでセッションを作り、chromedp.RunにNavigate/Click/Text/Evaluateなどのアクションを順に渡す。 - ヘッドレスは既定:chromedpは初期状態でヘッドレス起動する。画面を出したいときだけ
Flag("headless", false)を指定する(多くの記事が逆に説明している点に注意)。 - 選定:Chromeだけで完結し軽量に動かしたいならchromedp。複数ブラウザや自動待機が要るならPlaywrightが有利。
chromedpとは|CDPで動くGo製ブラウザ自動化ライブラリ
chromedpは、ブラウザ操作をChrome DevTools Protocolという低レベルのプロトコルに変換してChromeへ送るライブラリです。SeleniumのようにブラウザとGoの間にWebDriver(chromedriver等)を挟まず、CDPのWebSocketへ直接コマンドを流します。この経路の短さが、起動の速さとメモリ消費の小 ささにつながっています。実装は完全にGoで、外部プロセスはChrome本体だけです。
Chrome DevTools Protocol(CDP)との関係
CDPは、Chrome DevToolsが内部で使っている操作用APIで、ページ遷移・DOM取得・ネットワーク傍受・スクリーンショットなどをコマンドとして提供します。chromedpは Navigate や Click といったGoの関数呼び出しを、対応するCDPコマンド(Page.navigate など)へ翻訳して送る薄い層です。PuppeteerがJavaScriptで同じCDPを叩くのと構造は同じで、chromedpはそのGo版にあたります。「chrome cdp」で探している開発者が最短で使える実装がchromedpだと言えます。
chromedpが向く場面・向かない場面
操作対象がChrome/Chromiumだけで、GoのバックエンドやCLIにブラウザ操作を組み込みたいなら、依存が少ないchromedpが第一候補です。逆に、FirefoxやWebKit(Safari)も回すクロスブラウザテストや、要素の出現を自動で待つ仕組みを前提にしたいケースでは、後述のPlaywrightのほうが実装量が減ります。chromedpは待機を明示的に書く設計なので、「とりあえず動かす」より「挙動を握って書く」用途に合います。
chromedpと主要ツールの比較(Selenium・Puppeteer・Playwright・go-rod)
ブラウザ自動化の選択肢は複数あり、chromedpの位置づけは「Go・Chrome専用・ドライバ不要」です。主要ツールを軸ごとに整理します。
| ツール | 主な言語 | 対応ブラウザ | ドライバ | 特徴 |
|---|---|---|---|---|
| chromedp | Go | Chrome/Chromium | 不要(CDP直接) | pure Go・軽量 |
| go-rod | Go | Chrome/Chromium | 不要(CDP直接) | Goの別実装 |
| Puppeteer | JS/TS | Chrome/Firefox | 不要(CDP直接) | DevTools班製 |
| Playwright | 多言語 | Chromium/Firefox/WebKit | 内蔵 | 自動待機対応 |
| Selenium | 多言語 | 主要全ブラウザ | 要(WebDriver) | グリッド対応 |
Goで書くなら候補はchromedpとgo-rodに絞られ、どちらもCDP直結です。既存のWebDriver資産やブラウザグリッドがあるならSeleniumを使ったWebアプリケーションのテストを、複数ブラウザ対応や自動待機を重視するならPlaywrightの実務ガイドを検討してください。chromedpを選ぶ理由は、Go単体で完結し、余計な依存を持たずChromeを最短経路で叩ける点にあります。
chromedpのインストールと環境構築
chromedp実行の前提環境(Go・Chrome本体)
Goのモジュール環境(go mod 初期化済み)と、操作対象のChrome/Chromium本体が必要です。GUIのないサーバーやCIでは、Chrome全体の代わりに軽量な chrome-headless-shell(DockerイメージはchromedpチームがDocker Hubで配布)を使うと、依存を抑えたまま動かせます。
インストール手順
モジュール配下で次を実行します。
go get -u github.com/chromedp/chromedp
コード側では context と本体パッケージをインポートします(以降の各例で使う標準パッケージもまとめて示します)。
import (
"context"
"fmt"
"log"
"os"
"time"
"github.com/chromedp/chromedp"
)
chromedpの基本的な使い方と主要アクション
chromedpの操作は「セッションを作る→アクションを並べて実行する」の2段階です。chromedp.NewContext でChromeを起動するコンテキストを作り、chromedp.Run に Navigate などのアクションを順序どおり渡します。
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
var title string
if err := chromedp.Run(ctx,
chromedp.Navigate("https://example.com"),
chromedp.Title(&title),
); err != nil {
log.Fatal(err)
}
fmt.Println(title)
アクションは Run に渡した順に実行され、結果はポインタ渡しでGoの変数に受け取ります。よく使うアクションは次のとおりです。
| アクション | 役割 |
|---|---|
| Navigate | 指定URLへ移動 |
| Click | 要素をクリック |
| SendKeys | フォームへ入力 |
| Text / Value | 要素のテキスト・値を取得 |
| WaitVisible / WaitReady | 要素の表示・準備を待つ |
| Evaluate | 任意のJavaScriptを実行 |
| Screenshot / FullScreenshot | スクリーンショット取得 |
chromedpでのスクリーンショット取得
「chromedp screenshot」で調べられるとおり、スクリーンショットはchromedpの定番用途です。ページ全体を撮るなら FullScreenshot、表示領域だけなら CaptureScreenshot、特定要素なら Screenshot を使い分けます。取得結果は []byte で受け取り、そのままPNGとして保存できます。
var buf []byte
if err := chromedp.Run(ctx,
chromedp.Navigate("https://example.com"),
chromedp.FullScreenshot(&buf, 100),
); err != nil {
log.Fatal(err)
}
os.WriteFile("screenshot.png", buf, 0644)
FullScreenshot の第2引数は画質(0〜100)です。chromedpは100を指定するとPNG、100未満だとJPEGでエンコードするため、上のように .png で保存するなら100を渡します。容量を抑えたいときは90前後(JPEG)にして拡張子も .jpg に合わせます。動的に描画されるページでは、撮影前に WaitVisible で描画完了を待たないと、白紙や途中状態が写る点に注意してください。
chromedpのヘッドレスモードとchrome-headless-shell
ここは誤解が多い部分です。chromedpは 初期状態でヘッドレス起動します(DefaultExecAllocatorOptions にヘッドレス設定が含まれる)。つまり「ヘッドレスにするために Flag("headless", true) を足す」という説明は不要で、実際に必要なのは逆――デバッグ時にブラウザ画面を表示したいときに headless を false にする操作です。
opts := append(chromedp.DefaultExecAllocatorOptions[:],
chromedp.Flag("headless", false),
)
allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
defer cancel()
ctx, cancel := chromedp.NewContext(allocCtx)
defer cancel()
サーバーやCIで動かす場合は、Chrome全体を入れる代わりに chrome-headless-shell を使うと軽量です。chromedpのプログラムをchromedp配布のheadless-shell用Dockerイメージ内で実行すると、shellを自動で見つけて動くため、GUIライブラリの依存で詰まる事故を避けられます。
chromedpでの動的ページ・SPAスクレイピング
chromedpが真価を発揮するのは、JavaScriptで後からDOMが生成されるSPAや、AJAXで遅延ロードされるページです。素のHTTPリクエストでは取れないレンダリング後の内容を、実ブラウザとして取得できます。要点は「要素が出るまで待ってから読む」ことです。
var text string
if err := chromedp.Run(ctx,
chromedp.Navigate("https://example.com/spa"),
chromedp.WaitVisible(`#app .item`, chromedp.ByQuery),
chromedp.Text(`#app .item`, &text, chromedp.NodeVisible),
); err != nil {
log.Fatal(err)
}
WaitVisible や WaitReady を挟まずに Text を呼ぶと、描画前の空要素を読んで空文字が返る、というのが最頻の失敗パターンです。Goでの静的サイト収集や設計全体の考え方はGolangでのウェブスクレイピングの方法と注意点、収集の可否や法務・robots.txtの判断はスクレイピングとクローリング・APIの違いと法務の判断も併せて確認してください。取得先の利用規約とアクセス頻度の配慮は、chromedpを使う場合も同じく前提になります。
chromedpのよくあるエラーと対処
chromedpの実務で詰まりやすいのは、インストールより実行時のエラーです。頻出する4つを挙げます。
context deadline exceeded
最も多いエラーです。待機している要素が現れないまま制限時間に達すると出ます。まず context.WithTimeout で明示的に上限を設け、タイムアウトとセレクタ不一致を切り分けます。
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
ctx, cancel = context.WithTimeout(ctx, 30*time.Second)
defer cancel()
時間を延ばしても直らないなら、待っているセレクタが実際のDOMと一致していないケースがほとんどです。WaitVisible のセレクタと、ブラウザのDevToolsで確認した実DOMを突き合わせます。
exec: “google-chrome”: executable file not found
chromedpがChrome本体を見つけられていません。サーバー環境で多く、Chromeをインストールするか、前述のchrome-headless-shellを使います。パスが特殊な場合は chromedp.ExecPath で明示できます。
要素は見えているのにClickが効かない
アニメーションや遅延で要素がまだ操作可能になっていない状態です。WaitVisible に加え、必要なら WaitEnabled や短い Sleep を挟み、要素が確定してから操作します。chromedpはPlaywrightのような全面的な自動待機を持たないため、この待機は自分で設計する前提です。
ヘッドレスだと結果が変わる/弾かれる
サイト側がヘッドレスを検知して内容を変える場合があります。User-Agent の設定やウィンドウサイズの指定で通常ブラウザに寄せると改善することがありますが、明確にボットを拒否しているサイトの回避を目的にした利用は避けるべきです。
よくある質問
chromedpとは何ですか?
Chrome DevTools Protocolを使ってChrome/ChromiumをGoから操作するライブラリです。WebDriverや外部サーバーを介さず、Goのコードだけでブラウザ操作を書けます。
chromedpのインストール方法は?
Goモジュール配下で go get -u github.com/chromedp/chromedp を実行します。加えて動作環境にChrome本体かchrome-headless-shellが必要です。
chromedpはデフォルトでヘッドレスですか?
はい。初期状態でヘッドレス起動します。画面を表示したい場合のみ Flag("headless", false) を指定します。
chromedpとSeleniumはどちらを使うべきですか?
Chrome/Chromiumだけを軽量に操作したいならchromedp、複数ブラウザや既存のWebDriver資産・グリッドを活かすならSeleniumが向きます。
chromedpでSPAのデータは取れますか?
取れます。実ブラウザとしてJavaScript実行後のDOMを読めるため、WaitVisible や WaitReady で要素の描画を待ってから Text や Evaluate で取得します。