Help us understand the problem. What is going on with this article?

複数バージョンのFirefoxをSeleniumでテストする

More than 5 years have passed since last update.

FirefoxがNew IEへの道をたどりつつある昨今いかがお過ごしでしょうか?

古いFirefoxを使って、テスト(CI)を走らせる必要があったのでその方法をまとめる
今回の環境はMacOSX上でのRailsのプロジェクトでCapyabra(Selenium)を使ってテストを動かす

古いFirefoxのインストール

過去のFirefoxダウンロード一覧
https://ftp.mozilla.org/pub/firefox/releases/
(今回必要だったのはバージョン25)

いったんデスクトップなどにコピーしFirefox25.appなどにリネームし/Applications/に移動

Seleniumの設定変更

設定を書くファイルはspec/spec_helper.rb, spec/support/env.rb, spec/support/selenium.rbなどで良いと思う

spec/support/env.rb
require 'selenium-webdriver'
firefox_path = '/Applications/Firefox25.app/Contents/MacOS/firefox-bin'
Selenium::WebDriver::Firefox::Binary.path = firefox_path

環境変数で切り替えられるようにする場合(例)

if ENV['FIREFOX25']
  ...
end

問題点

環境設定の自動更新をオフにする必要がある

メニュー > Firefox > 環境設定 > 詳細 > [更新] > 更新の確認は行わない

環境設定の自動更新をオフにしないと、次回以降の起動でいつのまにか更新されてたりするので要確認
テスト実行時もバージョンを良く確認するようにする

メニュー > Firefox > Firefoxについて

自動更新されてしまったら再度上書きでインストールし直す
(この辺の挙動は良くわからなくて、もともと入っている/Applications/Firefox.appと環境設定を共有している?かもしれない)

Firefoxの同時起動と警告

最新のFirefoxと古いものを同時に起動すると、警告が出たが、出ない時もあった
この辺の挙動も良くわからない

今は古いバージョンのFirefoxで走らせるプロジェクトは1つのみなので、Jenkinsのビルドがかぶらないように気をつけているだけ

プロファイルの切り替え

上記の問題点がプロファイルの切り替えで解決するかもしれないと考えて、やってみたが実際解決したかどうか良くわかっていない

デフォルトでSeleniumは毎回新しいプロファイルを使っている

プロファイルの追加

$ /Applications/Firefox.app/Contents/MacOS/firefox-bin -profilemanager

→ 新規プロファイルの作成...

もともとdefaultがあるはずで、これは普通に使っていてDockなどからFirefox.appを起動した場合のプロファイル

$ /Applications/Firefox25.app/Contents/MacOS/firefox-bin -profilemanager でも同じダイアログが出たので、プロファイルはFirefox間で共有しているっぽい

プロファイルを切り替える

環境変数で指定できるようにしている。無い場合はデフォルトの新しいプロファイル

spec/support/env.rb
firefox_path = '/Applications/Firefox25.app/Contents/MacOS/firefox-bin'
Selenium::WebDriver::Firefox::Binary.path = firefox_path
profile = if ENV['FIREFOX_PROFILE_NAME']
  Selenium::WebDriver::Firefox::Profile.from_name(ENV['FIREFOX_PROFILE_NAME'])
else
  Selenium::WebDriver::Firefox::Profile.new
end

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, :browser => :firefox, :profile => profile)
end

実行のコマンドは例えば

$ FIREFOX_PROFILE_NAME=selenium rspec

FIREFOX_PROFILE_NAME=defaultで通常使っているプロファイルも指定できる

その他

bundle update selenium-webdriver

Firefoxを常に最新にしている場合は、定期的にSeleniumが動かなくなる
Seleniumも最新にすることで直ることが多い

$ bundle update selenium-webdriver

firefoxとfirefox-binの違い

ls -al /Applications/Firefox.app/Contents/MacOS/firefox*
するとfirefoxとfirefox-binでファイルサイズが違うが調べても違いはあまり良く分からなかった

とりあえず動いているのでOK

-no-remote

コマンドラインでFirefoxを起動している例で、多くの場合-no-remoteオプションをつけている
ソース見るとSeleniumでは内部で自動的に付加されているっぽい

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした