Capybara+Seleniumのユニットテストで使うブラウザを変更する方法
昨日 の続きです。
最新版(まだ開発版)のCapybaraを使うと簡単にSelenium経由でFirefoxを使ったユニットテストができると書きましたが、その仕組みが謎だったので調べました。
Seleniumで使うブラウザをFirefoxからChromeに変える
spec/spec_helper.rb に以下の設定を書きます。
require 'capybara/rspec' Capybara.register_driver :selenium_chrome do |app| Capybara::Driver::Selenium.new(app, :browser => :chrome) end Capybara.javascript_driver = :selenium_chrome
- Configuring and adding driversのところに書いてあります。
- Sporkを使う場合、Spork.each_run do ... end の中に書いても、sporkプロセスを再起動しないと反映されないみたいです。
新しいSeleniumはどうやって動いているか
以前のSelenium (Selenium RC)の場合、RCのプロセスを先に立ちあげておく必要があったと思いますが(うろ覚え)、新しいSelenium (Selenium 2.0 and WebDriver)では特に面倒な設定・準備なしで使えるようです。
以下、CapybaraがどのようにSeleniumを起動しているか調べた事をまとめます。
まず、JavaScriptの試験をCapybara+Seleniumを使って行いたい場合、:js => true オプションを渡します。
describe "POST /articles", :js => true do # ... end # または it "JSのテスト", :js => true do # ... end
Capybaraはこのオプションを見るとテストを実行するドライバを入れ替えます。javascript_driverのデフォルトは:seleniumです。
# capybara/lib/capybara/rspec.rb Capybara.current_driver = Capybara.javascript_driver if example.metadata[:js]
CapybaraのSelenium driverは、selenium-webdriverというライブラリを使ってSeleniumを操作します。これはSeleniumの新しいAPIを使ったライブラリのようです。詳しくはSeleniumの本家にいろいろ書いてあります。
ここで、Seleniumで使うブラウザのデフォルトは:firefoxになっています。
# capybara/lib/capybara/driver/selenium_driver.rb require 'selenium-webdriver' class Capybara::Driver::Selenium < Capybara::Driver::Base DEFAULT_OPTIONS = { :resynchronize => true, :resynchronization_timeout => 10, :browser => :firefox }
ついでに selenium-webdriver を眺めてみると、他にもいろいろなブラウザに対応したドライバがあります。
# selenium-webdriver/lib/selenium/webdriver.rb module Selenium module WebDriver Point = Struct.new(:x, :y) Dimension = Struct.new(:width, :height) autoload :Android, 'selenium/webdriver/android' autoload :Chrome, 'selenium/webdriver/chrome' autoload :IE, 'selenium/webdriver/ie' autoload :IPhone, 'selenium/webdriver/iphone' autoload :Remote, 'selenium/webdriver/remote' autoload :Firefox, 'selenium/webdriver/firefox'