Firefox 48以降でselenium-webdriverが動作しない問題とその回避策


【おことわり】

この情報は2016/10/1時点のものです。
将来的には状況が変わっている可能性もあるため、適宜最新の情報を参照してください。

問題

Firefox 48以降だと、2016/10/1時点の最新版であるselenium-webdriver 2.53.4を使っても動作しない。(Firefoxが起動するだけで、そこで固まってしまう)

原因

Firefox 48からはサイン済みのエクステンションしか動作しなくなった。SeleniumのFirefoxエクステンションはサインを拒否されているため、動かなくなってしまったとのこと。

Firefox driver in 2.53.4 not working with Firefox 48 · Issue #2559 · SeleniumHQ/selenium

In Firefox 48, Mozilla requires extensions to be signed. They have refused to sign Selenium's Firefox driver extension (webdriver.xpi). Feel free to contact them and/or log an issue for them at https://bugzilla.mozilla.org

Selenium 3.0からはGeckoDriverを使ってこの問題を回避しようとしているようだが、2016/10/1時点では正式版がリリースされていない。
また、後方互換性が維持されている保証がないため、単純にバージョンを上げるだけでは動かない可能性が高い。
(実際、selenium-webdriver 3.0.0.beta3.1を試しにインストールしてみたが、RSpec + Capybaraの環境ではエラーが発生して動作しなかった)

回避策

その1. Firefox 47以前のバージョンに戻す

あえてバージョン47以前のFirefoxにダウングレードし、自動更新を停止すればselenium-webdriverを使うことができる。

その2. Poltergeist等の別のWebドライバに切り替える

最新版のFirefoxをインストールしないとセキュリティ面が心配だ、という場合は、Poltergeist等のWebドライバ(ヘッドレスブラウザ)に切り替えるのも一つの方法。(個人的にはこれがオススメ)

teampoltergeist/poltergeist: A PhantomJS driver for Capybara

ただし、以下のような注意点がある。

  • PhantomJSのインストールが必要(Poltergeistの場合)
  • WebドライバのAPIを直接呼び出すようなコードを書いている場合は、互換性がない可能性がある
  • 画面が見えないので、ブラウザの動きが分かりづらい(ただし、スクリーンショットは保存できる→参考

参考:Everyday Railsの作者もPoltergeistへの移行を推奨している

電子書籍「Everyday Rails - RSpecによるRailsテスト入門」の中でもselenium-webdriverが使われているため、書籍の記述通りにチュートリアルを進めるとこの問題に遭遇する。
この件を著者に報告したところ、「Poltergeistに移行することを推奨する」という回答が返ってきた。

Poltergeistに移行する方法は以下のブログ記事(英語)でも紹介されている。

Switching from Selenium to Poltergeist in RSpec feature specs | Everyday Rails

このほかにも日本語の情報がネット上にたくさんあるので、それらを参考にされたい。

その3. FirefoxではなくChromeを使う

Firefoxの代わりにChromeを使うことも可能。
Chromeを使う場合はまず、ChromeDriverをインストールする。

下記のページにアクセスして、自分のマシンにインストールされているChromeのバージョンに対応したChromeDriverをダウンロードする。

ChromeDriverはPATHの通ったディレクトリに配置する必要がある。
以下はchromedriverを配置する例。

# PATHの設定を確認
$ echo $PATH
/usr/local/bin:...

# ChromeDriverをPATHの通ったディレクトリへコピー
$ cp chromedriver /usr/local/bin

続いて、spec/rails_helper.rbに以下の設定を追加する。

spec/rails_helper.rb
# 適当な場所(ファイルの最後など)に以下の設定を追加する
Capybara.register_driver :chrome do |app|
  Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.javascript_driver = :chrome

これでRSpecを実行すると、Firefoxの代わりにChromeが起動するようになる。

参考

Special thanks

Everyday Railsを読んでいる最中に問題を見つけて報告してくれた森塚さん(@9gmotonari)、どうもありがとうございました。