【おことわり】
この情報は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
に以下の設定を追加する。
# 適当な場所(ファイルの最後など)に以下の設定を追加する
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, browser: :chrome)
end
Capybara.javascript_driver = :chrome
これでRSpecを実行すると、Firefoxの代わりにChromeが起動するようになる。
参考
- selenium - Set Chrome as Default Browser for RSpec/Capybara - Stack Overflow
- Rails 5.1のSystemTestCaseを試してみた - Qiita
Special thanks
Everyday Railsを読んでいる最中に問題を見つけて報告してくれた森塚さん(@9gmotonari)、どうもありがとうございました。
@jnchito 1つ目は、selenium-webdriverの最新バージョンに更新したのですが最新のFireFox49.0.1ではうまく動作しませんでした。この場合、FireFoxをダウングレードする以外の方法はありますでしょうか?(47.0.1での動作は確認しました)
— 森塚 真年 (@9gmotonari) September 27, 2016
@jnchito 返信ありがとうございます。issueはfirefox48の場合ですが既に挙がっていました。https://t.co/w5C2GAoBIu
— 森塚 真年 (@9gmotonari) September 28, 2016