puppeteerメモ
概要
puppeteerはDevToolsプロトコルを使ってChromiumもしくはChromeを管理する高レベルAPIを提供するNodeライブラリ。
Puppeteer APIは階層的でブラウザ構造を反映する。
https://user-images.githubusercontent.com/746130/40333229-5df5480c-5d0c-11e8-83cb-c3e371de7374.png
上の図の各種説明。
PuppeteerはDevToolsプロトコルを使用してブラウザと通信する。
Browserインスタンスは複数のブラウザコンテキストを所有することができる。
BrowserContextインスタンスはブラウジングセッションを定義して、複数ページを所有することができる。
Pageは1つのフレームを持つ:メインフレーム。iframeもしくはframeタグによって作られた他のフレームがある。
FrameはフレームのJavaScriptが実行される1つの実行コンテキスト(デフォルトの実行コンテキスト)を持つ。フレームは拡張と関連する追加の実行コンテキストを持つ。
Workerは単一実行コンテキストを持ち、WebWorkersとの対話を容易にする。
puppeteer vs puppeteer-core
puppeteerはブラウザ自動化のプロダクト。インストールされると、Chromiumのバージョンがダウンロードされ、puppeteer-coreを使用して駆動される。エンドユーザープロダクトであること、puppeteerは振る舞いを微調整するための便利なPUPPETEER_*環境変数の束をサポートする。
puppeteer-coreはDevToolsプロトコルをサポートするものを駆動するためのライブラリ。puppeteer-coreはインストールするときにChromiumをダウンロードしない。ライブラリであるために、puppeteer-coreはプログラマ的なインターフェースを通して駆動させ、すべてのPUPPETEER_*環境変数を無視する。
puppeteer-coreを使うべきところ:
その他のエンドユーザープロダクトもしくはDevToolsプロトコルの上のライブラリをビルドしている。たとえば、puppeteer-coreを使ってPDFジェネレータをビルドして、ディスクスペースに保存するためにChromiumのかわりにheadless_shellをダウンロードするカスタムされたinstall.jsスクリプトを書き込むとき。
追加のChromiumバイナリをダウンロードする必要がないDevToolsプロトコルによってChrome拡張/ブラウザで使うためにPuppeteerをビルドしている。
puppeteer-coreが材料の一つでChromiumが使われるまでにinstall.jsスクリプト拡張を延期したいツールのセットをビルドするとき。
Puppeteer module
PuppeteerモジュールはChromiumインスタンスを立ち上げるためのメソッドを提供する。
puppeteer.devices
puppeteer.errors
Puppeteerメソッドはリクエストをいっぱいにすることができないならエラーを投げる。例えば、page.waitForSelector(selector[, options])はセレクタが与えられたタイムフレームの間にノードと一致しないなら失敗する。
puppeteer.product
プロダクトはPUPPETEER_PRODUCT環境変数もしくはpuppeteer.launch([options]) とchromeのデフォルトでのプロダクトオプションによってセットする。Firefoxサポートは実験的。
puppeteer.connect(options)
このメソッドは存在しているブラウザのインスタンスにPuppeteerを付ける。
puppeteer.createBrowserFetcher(options) デフォルトはChromiumが立ち上げられたフラグ。
puppeteer.executablePath()
デフォルト引数から--mute-audioをフィルターするためにignoreDefaultArgsを使うことができる。
Browser Class
puppeteer.launchもしくはpuppeteer.connectのどちらかで、BrowserはPuppeteerがChromiumインスタンスにつながるときに作られる。
参考文献