Chrome DevTools 開発チームによる puppeteer なる Headless Chrome を操作するライブラリがでたので、もろもろ試したことをメモっておく。
試したやつのリポジトリ:cyokodog/puppeteer_study
puppeteer とは
- Headless Chrome をNode.jsで操作しやすくしたライブラリ
- Chrome DevTools 開発チームがメンテナンスしてる
- Node v7.10以降が必要
Headless Chrome のおさらい
puppeteer 位置づけを確認する意味で Headless Chrome をどう動かしてたかをおさらい(via Headless Chrome をさわってみた | CYOKODOG)。
Node.js で Headless Chrome を起動する
- Headless Chrome を操作するには DevTools プロトコルを有効にして chrome を起動する必要がある
- --remote-debugging-port フラグつきで実行すると、DevTools Protocol が有効になった状態でインスタンスが起動する
- child_process で chrome を起動するには以下のとおり
- Lighthouse の chromeLauncher で起動する方法もある
- chrome がインストールされてる場所を探してくれる
Node.js で Headless Chrome を操作するには
- DevTools プロトコルと対話する
- リファレンス -> chrome DevTools Protocol Viewer
- 公式サイトでは chrome-remote-interface (DevTools Protocol をベースとしたハイレベルな API を提供) による操作方法を紹介している
- より利用しやすくした chrome-remote-interface の ラッパーライブラリがいろいろある
- puppeteer の場合
- chrome-remote-interface を介さず直接 DevTools プロトコルと対話する
- chromiumもダウンロードされるので、chromeのインストールが不要
インストール
- puppeteer を npm i するのみ
API をさわってみる
- 公式ページにコピペで動くサンプルが載ってるので拝借して試す
chrome インスタンスの起動とwebページへの遷移
iPhone6をエミュレートする
スクリーンショットを撮る
PDFを生成する
ページ内でscriptを評価する
page.evaluate(pageFunction, ...args)
ページ内で実行したconsole.log()をターミナルに出力する
Node.js上の関数をブラウザ内で利用する
- Node.jsのライブラリ crypto をブラウザ内から利用する
- /etc/hosts をブラウザ内から読み込む
page.exposeFunction(name, puppeteerFunction)
ググった結果のスクショを撮る
E2E テストしてみる
適当なTODOアプリを用意
手軽なイメージのある mocha でテストしてみる
- プログラム内で mocha を制御する
- mocha.addFile() でテストファイルを指定
- mocha.run() でテストを実行してエラー件数を得られる
テストファイル
- chromeの起動でモサって mocha がタイムアウトしちゃうので、this.timeout(5000) でタイムアウト時間を変更
- おそらく puppeteer.launch() が重いので実用時は、テストファイル単位でこれをしない工夫が必要そう
- CI で puppeteer を起動する場合は {args:['--no-sandbox', '--disable-setuid-sandbox']} の指定が必要
- ローカルの場合は動作が低速で見れるように {headless: false, slowMo: 250} を指定
こんな感じで動く
CircleCIでもテストしてみる
- CircleCI 2.0 のように Docker 系の CI の場合以下が必要
- SUID Sandbox の無効化(['--no-sandbox', '--disable-setuid-sandbox'])
- libxcb パッケージのインストール
- これしないと chromium が見つからない的なエラーがでる
.circleci/config.yml
- なので .circleci/config.yml を次のように設定する
- chmod で setup_libxcb.sh に実行権限与えてから実行する
setup_libxcb.sh
- setup_libxcb.sh は以下、sudo 付けないとパーミッションエラーになるので注意
めでたし!
参考サイト
- GoogleChrome/puppeteer: Headless Chrome Node API
- Getting started with Puppeteer and Chrome Headless for Web Scraping
- Dockerで日本語対応のHeadless Chrome + puppeteerを立ち上げ | 酒と涙とRubyとRailsと
- Headless Chromeでファイルをダウンロードする - sambaiz-net
- Chrome Headless ブラウザでテストを実行する
- PuppeteerでヘッドレスChromeを操ってみる - Qiita
- Feature request: debugging inside test runners · Issue #699 · GoogleChrome/puppeteer
- --headless時代の本命? Chrome を Node.jsから操作するライブラリ puppeteer について - Qiita
- Quramy/angular-puppeteer-demo: A demonstration repository explains how to using Puppeteer in unit testing
- Quramy/puppeteer-example
- Linux SUID Sandbox Development
- Chrome Headless doesn't launch on Debian · Issue #290 · GoogleChrome/puppeteer
- charlieduong94/mocha-puppeteer: Run your mocha tests in headless chrome using puppeteer
- A Mocha test runner for RequireJS
- Using mocha programmatically · mochajs/mocha Wiki
- javascript - Change default timeout for mocha - Stack Overflow
- Run test from string code · Issue #2638 · mochajs/mocha
- The same test suite won't run twice when using mocha programmatically · Issue #995 · mochajs/mocha
- ScalaプロジェクトをCircleCI 2.0に対応させてみた話 - Qiita
- cordovaアプリをCircleCI上でe2eテストする - Aqutras Members' Blog
- Headless Chrome instances is reported as Safari 0.0.0 · Issue #2603 · karma-runner/karma