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/'