WatirでHeadless Chromeを使うまでのメモ

サーバ的環境から 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
&#127866;  /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

現時点のバージョンは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

現時点のバージョンは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月リリースなんだよね。