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'

まとめ

  • Capybaraの開発版を使うとSeleniumを使ったテストが簡単に使えます。
  • テストに使うブラウザを変えたかったらspec_helper.rbで設定を変えられます。
  • iPhoneAndroidに対応したドライバもあるようです。