TestCaseでSelenium Web Driverを使う

最近仕事でJavaSelenium Web Driverを使う機会があったので、Rubyでも使ってみました。
さらに、せっかくテストに使うならやっぱりテストフレームワーク使いたいよねってことで、TestCaseクラスを使うことに。

TestCaseを使う

JavaJUnitは使ったことがあり、基本的に使い方は同じです。

#test/unit/search_test.rb

#encoding: utf-8
require 'test_helper'
class SearchTest < Test::Unit::TestCase

  def setup
    #各テスト実行前が呼び出される初期処理
  end
  
  def teardown
    #各テスト実行後に呼び出される後処理
  end

  def test001
    #テスト処理
  end
end

Test::Unit::TestCaseを継承したクラス内にメソッドを定義するだけ。
メソッドの役割は各コメントに書いてある通り。
「test」から始まるメソッドがテスト実行対象として、自動実行されます。

実行するには、

ruby test/unit/search_test.rb

コマンドラインから叩けばOK。
が、僕の環境ではtest_helperがLoadErrorとなってしまったので・・・

ruby -Itest test/unit/search_test.rb

としました。
ちなみにrubyのIオプションは直後のパスをロードパスに指定(追加)するというものです。

Selenium Web Driverを使う

Seleniumは言わずと知れたブラウザ自動操作を実現するフレームワークです。
Selenium Web Driverは各言語のソースコードにより、ブラウザ操作を定義・実行させることができます。

Rubyで利用する場合はGemパッケージとして提供されているselenium-webdriverを使います。

#Gemfile

gem 'selenium-webdriver'  #これを追加

bundle install

しましょう。

実装方法はリファレンスを参照。

TestCaseとSelenium Web Driverを組み合わせるとこんなかんじ。
かんけんで検索を実行してスクリーンショットを取るテスト)

#test/unit/search_test.rb

#encoding: utf-8
require 'test_helper'
require 'rubygems'
require 'selenium-webdriver'

class SearchTest < Test::Unit::TestCase

  #初期処理
  def setup
    @driver =  Selenium::WebDriver.for :firefox        #firefox用のインスタンス生成
    @driver.navigate.to "http://kanken.wackwack.net"   #テストサイトを開く
    @timestamp =  Time.now.strftime("%Y%m%dT%H%M%S")
  end
  
  #後処理
  def teardown
    @driver.quit  #画面を閉じる
  end

  def test001
    keyword = @driver.find_element(:name,"keyword")    #タグのname属性による要素取得
    keyword.send_keys "オライリー"                     #文字を入力する
    keyword.submit                                     #フォームの実行
    
    sleep(2)
    #スクリーンショットを撮る
    @driver.save_screenshot("./test/unit/#{@timestamp}-001.png")
    assert true
  end
end

sleepは重要。ここで画面遷移を待たないと、遷移前画面のスクリーンショットを撮ってしまう。
しかしここがやっぱり不便ですね・・・
遷移後の画面が表示されるまでの時間は常に同じでは無いので。
何か良い方法はないのだろうか。