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](https://github.com/SeleniumHQ/selenium/issues/2559)

> 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を使うことができる。

https://ftp.mozilla.org/pub/firefox/releases/47.0.1/

![Screen Shot 2016-10-01 at 11.54.05.png](https://qiita-image-store.s3.amazonaws.com/0/7465/7033ab56-4a2c-3a6a-1652-28b1529ca0d8.png "Screen Shot 2016-10-01 at 11.54.05.png")

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

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

[teampoltergeist/poltergeist: A PhantomJS driver for Capybara](https://github.com/teampoltergeist/poltergeist)

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

- [PhantomJS](http://phantomjs.org/)のインストールが必要（Poltergeistの場合）
- WebドライバのAPIを直接呼び出すようなコードを書いている場合は、互換性がない可能性がある
- 画面が見えないので、ブラウザの動きが分かりづらい（ただし、スクリーンショットは保存できる→[参考](http://qiita.com/take/items/779747e0981355e569ad#%E3%81%82%E3%82%8B%E7%8A%B6%E6%85%8B%E3%81%A7%E3%81%AE%E7%94%BB%E9%9D%A2%E3%81%AE%E7%8A%B6%E6%85%8B%E3%81%8C%E7%9F%A5%E3%82%8A%E3%81%9F%E3%81%84)）

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

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

https://github.com/everydayrails/rails-4-1-rspec-3-0/issues/73#issuecomment-250974042

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

[Switching from Selenium to Poltergeist in RSpec feature specs \| Everyday Rails](http://everydayrails.com/2015/01/27/rspec-switch-selenium-poltergeist.html)

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

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

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

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

https://sites.google.com/a/chromium.org/chromedriver/

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

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

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

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

```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が起動するようになる。

### 参考

- [selenium \- Set Chrome as Default Browser for RSpec/Capybara \- Stack Overflow](http://stackoverflow.com/questions/21445164/set-chrome-as-default-browser-for-rspec-capybara)
- [Rails 5\.1のSystemTestCaseを試してみた \- Qiita](http://qiita.com/jnchito/items/4d01f2faa1deee36bd27)

## Special thanks

[Everyday Rails](https://leanpub.com/everydayrailsrspec-jp)を読んでいる最中に問題を見つけて報告してくれた森塚さん（[@9gmotonari](https://twitter.com/9gmotonari/)）、どうもありがとうございました。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/jnchito">@jnchito</a> 1つ目は、selenium-webdriverの最新バージョンに更新したのですが最新のFireFox49.0.1ではうまく動作しませんでした。この場合、FireFoxをダウングレードする以外の方法はありますでしょうか？(47.0.1での動作は確認しました)</p>&mdash; 森塚　真年 (@9gmotonari) <a href="https://twitter.com/9gmotonari/status/780603899187109888">September 27, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none" data-cards="hidden" data-lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/jnchito">@jnchito</a> 返信ありがとうございます。issueはfirefox48の場合ですが既に挙がっていました。<a href="https://t.co/w5C2GAoBIu">https://t.co/w5C2GAoBIu</a></p>&mdash; 森塚　真年 (@9gmotonari) <a href="https://twitter.com/9gmotonari/status/781036990271725569">September 28, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>