phpのサイトをselenium-webdriverでrspec+guradする

phpのサイトですが、テストを自動化したら?とCTOに言われたのでselenium試してみました。seleniumからrspecファイルを吐き出せることがわかりましたので、rspecファイルを吐き出したところ、guardできるんじゃね?となり、カッとなって環境用意しました。
テスト書いたらブワーってブラウザが起動してすごくうざいです。でも気持ちいい。
調べているとheadlessなブラウザ使う方法もあるらしいですが、ブラウザが見れるというのも必要な気がしますよ、僕は。
ブラウザ起動しまくりなのでguardなTDDには向かないです。
rspecなので書きやすいです。
どんなサイトでもブラウザ巻き込んだテストがかけるのはかなり有効だと思いました。(今更)

seleniumIDEでひな形のマクロ記録する。

この辺り、試行錯誤してなんとなく作ったもので十分だと思います。

rspec吐き出す。

こんなのでます。

#Firefoxから吐き出された。
require "selenium-webdriver"
#Firefoxから吐き出された。
require "rspec"
#Firefoxから吐き出された。
include RSpec::Expectations

describe "テスト" do

  #Firefoxから吐き出された。
  before(:each) do
    @driver = Selenium::WebDriver.for :firefox
    @base_url = "http://localhost/frogs/"
    @accept_next_alert = true
    @driver.manage.timeouts.implicit_wait = 30
    @verification_errors = []
  end

  #Firefoxから吐き出された。 ブラウザを都度終了します。
  after(:each) do
    @driver.quit
    @verification_errors.should == []
  end

  # Firefoxから吐き出されたメソッド
  def element_present?(how, what)
    @driver.find_element(how, what)
    true
  rescue Selenium::WebDriver::Error::NoSuchElementError
    false
  end
  
  # Firefoxから吐き出されたメソッド
  def verify(&blk)
    yield
  rescue ExpectationNotMetError => ex
    @verification_errors << ex
  end
  
  # Firefoxから吐き出されたメソッド
  def close_alert_and_get_its_text(how, what)
    alert = @driver.switch_to().alert()
    if (@accept_next_alert) then
      alert.accept()
    else
      alert.dismiss()
    end
    alert.text
  ensure
    @accept_next_alert = true
  end
end

specディレクトリ切っったり

こんなディレクトリにしました。

test
   tmp guardが作ったファイル
   spec specファイル格納ディレクトリ
   ss スクリーンショット格納ディレクトリ
   .rspec
   Gemfile
   Guardfile

Gemfileとか

source "http://rubygems.org"

gem 'rspec'
gem 'selenium'
gem 'selenium-webdriver'
gem 'growl'
gem 'guard'
gem 'guard-rspec'
gem 'rb-fsevent', :require => false

guard initする

guard init

中身は特に変更せず

guardする

guard

specファイルの書き方

いろいろ調べながら書いてます。
http://selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver.html
いまのところ使っているのは下記の感じ

#クリック
@driver.find_element(:id, "spanselect_yesterday").click
#存在
@driver.find_element(:id, "spanselect_yesterday2")
#フォームに入力
@driver.find_element(:id, "mailbox").send_keys "aaaaaaaaaa"
#ロケーションを確認
@driver.current_url.include? "report"
#Ajax通信などを待つ elementが発生するまで待つ方法もあるらしい。
sleep(1)
#ページタイトルを確認
@driver.title.include? "xxxxx"
#confirmやalertを受け入れる
@driver.switch_to.alert.accept
#スクリーンショット撮影
#alertなどを含めたスクリーンショットは取れない。
@driver.save_screenshot('ss/トップページ.png')
#assert attributeとかtextとか使える
@driver.find_element(:id,"period_from").attribute(:value).should == '2013/'

テスト結果のhtml化

rspec -fh > rspec_report.html

頑張ってテストしよう!