サーバ的環境から JavaScript が必要なブラウザアクセスする場合はいままでずっと PhantomJS を使ってきたわけですが、残念ながら PhantomJS は2017年6月ごろで開発を終了したそうです*1。
ということで遅まきながら Headless Chrome を使ってみることにしましたのでメモ書きします。
更新すべきもの
- chromedriver
これが一番のネックでした。Chrome に内蔵されていないと思ってなかったので、古いバージョンのまま使っていました。その際のエラーはこんな感じ。
browser = Watir::Browser.new(:chrome, headless: true) Selenium::WebDriver::Error::UnknownError: unknown error: unrecognized Chrome version: HeadlessChrome/64.0.3282.186 (Driver info: chromedriver=2.27.440174 (e97a722caafc2d3a8b807ee115bfb307f7d2cfd9),platform=Mac OS X 10.12.6 x86_64) from /Users/riocampos/.anyenv/envs/rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.9.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok'
chromedriver=2.27
ってちゃんと出てますよね。気付けよ>俺。
で。chromedriver の更新を今後も継続的に行うため、今回は Homebrew でインストールすることにしました。現時点のバージョンは2.35。
$ brew info chromedriver chromedriver: stable 2.35 Tool for automated testing of webapps across many browsers https://sites.google.com/a/chromium.org/chromedriver/ Not installed From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/chromedriver.rb ==> Caveats To have launchd start chromedriver now and restart at login: brew services start chromedriver Or, if you don't want/need a background service you can just run: chromedriver $ brew install chromedriver ==> Downloading https://chromedriver.storage.googleapis.com/2.35/chromedriver_mac64.zip ######################################################################## 100.0% Error: The `brew link` step did not complete successfully <==ここでエラー出ていることに気付こう… The formula built, but is not symlinked into /usr/local Could not symlink bin/chromedriver Target /usr/local/bin/chromedriver already exists. You may want to remove it: rm '/usr/local/bin/chromedriver' To force the link and overwrite all conflicting files: brew link --overwrite chromedriver To list all files that would be deleted: brew link --overwrite --dry-run chromedriver Possible conflicting files are: /usr/local/bin/chromedriver ==> Caveats To have launchd start chromedriver now and restart at login: brew services start chromedriver Or, if you don't want/need a background service you can just run: chromedriver ==> Summary 🍺 /usr/local/Cellar/chromedriver/2.35: 4 files, 11.3MB, built in 16 seconds
インストールは終わったので確認。
$ which chromedriver /usr/local/bin/chromedriver $ chromedriver Starting ChromeDriver 2.27.440174 (e97a722caafc2d3a8b807ee115bfb307f7d2cfd9) on port 9515 <==バージョンが以前のものになっていることに気付こうよ… Only local connections are allowed. ^C
ということで古いものを削除。
$ rm '/usr/local/bin/chromedriver' $ brew link chromedriver Linking /usr/local/Cellar/chromedriver/2.35... 1 symlinks created
- selenium-webdriver gem
現時点のバージョンは3.9.0。ちなみに3.6.0から「PhantomJS は deprecated」と出るようになりました。
$ gem update selenium-webdriver Updating installed gems Updating selenium-webdriver Fetching: selenium-webdriver-3.9.0.gem (100%) Successfully installed selenium-webdriver-3.9.0 Gems updated: selenium-webdriver
- Watir gem
現時点のバージョンは6.10.3。Headless Chrome が使えるようになったのは6.6からだそうです。
インストールログを消しちゃいましたが、まあ selenium-webdriver と同様に gem update
しちゃえばいいわけで。
Headless Chrome実行時の注意
Headless Chrome を先に起動した状態から Chrome も起動しようとしたのですが、起動しませんでした。どうやら先に画面ありのふつうの Chrome を起動しておかないとダメみたいですね。まあ普段は Mac の起動と同時に Chrome も立ち上げますから問題無いでしょう。
実行してみる
$ pry [1] pry(main)> require 'watir' => true [2] pry(main)> browser = Watir::Browser.new(:chrome, headless: true) => #<Watir::Browser:0x..fbfcb7aab4783eb70 url="data:," title=""> [3] pry(main)> browser.goto "www.yahoo.co.jp" => "http://www.yahoo.co.jp" [4] pry(main)> browser.screenshot.save("yahoo.jpg") 2018-03-01 16:07:06 WARN Selenium name used for saved screenshot does not match file type. It should end with .png extension => #<File:yahoo.jpg (closed)>
スクリーンショットは png じゃないと怒られるようです(以前はそんなことなかったのに。
ではこの記事のサイトを撮影しましょう。
[5] pry(main)> browser.goto('http://d.hatena.ne.jp/riocampos+tech/20180301/watir_with_headless_chrome') => "http://d.hatena.ne.jp/riocampos+tech/20180301/watir_with_headless_chrome" [6] pry(main)> browser.screenshot.save('htd.png') => #<File:htd.png (closed)>
こんなスクリーンショットが撮れました。
*1:とはいえ最新の PhantomJS は http://phantomjs.org/release-2.1.3.html を見ると2018年1月リリースなんだよね。