2011年8月28日日曜日

Rails 3でSeleniumを使う

最近開発しているRailsアプリでUIレベルの自動テストも行うことになり、Seleniumの使い方について調べてみた。
(あくまでも投稿時時点での、私が調べられた限りの情報です。)

  1. とりあえず動かす
現時点での最新はSelenium Client Driverが2.5.0。
2.0以降構成が変わっている。
Rubyの場合、gemでインストールするとのこと。
gem install selenium-webdriver 
でインストールできる。

以前少し調べたときは、これとは別にサーバ側のインストールが必要だったはず。ダウンロードのページにはSelenium Serverがしっかり載っているので、どこかでサーバの設定をするのだろうと思ったが、サンプルコード(例えばこのチュートリアル)を見たところ全くサーバ設定に該当するようなコードがない。

後でわかったが、Selenium Serverが必要なのはリモートPCでテストする場合などだけみたい。
私のところの場合、開発はCentOS(仮想マシン)で行う一方、IE8対応をテストするためWindowsマシン上で動かさないといけないから、結局必要だということになった。

新しい構成のSeleniumを使うとなると、WebratよりCapybaraのほうがよさそうなので、Capybaraを入れる。インストールはSelenium Client Driverと同様にgemで。
gem install capybara
チュートリアルにしたがってRSpecもインストールする。
gem install rspec
先ほどのチュートリアルにあるように、Gemfileでgemを指定して
bundle install
を実行したり、helperに
require 'rspec/rails'
 
# Add this to load Capybara integration:
require 'capybara/rspec'
require 'capybara/rails'
などの設定を入れたり。

これでvisitやclick_onなどの設定が使えるのかと思ったら、エラー。


undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_4:0x748aab0>
などと出てくる。
requireだけでは不十分なのか。結局、ココでのコメントにあるとおり
include Capybara::DSL
でエラーが出なくなった。
解決したのはよいが、調べてもあまりこのことは載っていなかった。特殊な環境だけで起こる事象なのだろうか。

  1. リモートで動かす
開発環境内では動くことが確かめられたので、次はリモートPCでIE8上でSeleniumを実行したい。
どう考えても何も設定しなければローカルで実行されるに決まっているので、設定方法を調査。

CapybaraやRails関係のところではなく、Seleniumのドキュメントに説明があった

driver = Selenium::WebDriver.for(:remote, :url => "http://myserver:4444/wd/hub", :desired_capabilities => :ie)
などとすればよいみたい。
動かしたいPCにSelenium Serverをダウンロード、起動した状態で
rake spec
 などとして実行すればよいはず…
今度はvisitなどができない。

APIを見てみると、先ほど取得したdriverオブジェクトに対してfind_elementなどのメソッドを取得している。メソッドもCapybaraに備わっているものとは異なる。

できるだけブラウザエンジンに依存しないスクリプトを書いて、用途に応じてブラウザエンジンを切り替える、という運用を考えていたが、しばらく調べたのち、リモートで動かす前提だと無理だ、という結論に。

Selenium IDEからrubyのスクリプトをエクスポートしたときも、visitやclick_onなどのシンプルなものではなく、ドライバに対するメソッドで、かなり複雑なことをやっていると思ったが、それはFirefoxブラウザを使ったり、リモートで動かしたりするときにはこの形のスクリプトを書かなければいけないから、ということみたいだ。

このSelenium特有の記法を使ってスクリプトを書いたら実行できた。なお、2.4にはバグがあってIEでは実行できないようなので要注意。私もはまりました。
次はSeleniumのコードを書く中で動かないところとか出てくるはず。