selenium webdriverについてのメモ
業務のちょっとした都合でseleniumを結構触ったので、忘れないようにメモしておきます。Rubyでかきました。
ギョウミーなコードだったので、コード自体はアップ出来ていません。。。
事前準備
gem install selenium-webdriver
リファレンス
http://selenium.googlecode.com/svn/trunk/docs/api/rb/index.html
やったこと
ドライバーの取得
driver = Selenium::WebDriver.for :firefox
これでdriverが取得出来て、driverを使ってあれやこれやが出来ます。
リファレンスを見ると:profileの設定とかも出来るみたいですが、やっていないです。
ページ遷移
driver.navigate.to url
urlには適当なテキストを入れてください。ページ遷移します。
今いるページのURLを取得してあれこれ
これはselenium関係ないのですが、動作環境の違いでドメイン名だけ変えたい、というのがあったので作りました。
require 'url' scheme = URI(driver.current_url).scheme host = URI(driver.current_url).host url = "#{scheme}://#{host}/hoge/hoge/"
ページ内の要素への入力
find_elementメソッドでページ内の要素を見つけてテキスト入力
driver.find_element(:id,"text_box").send_keys "text input test"
find_elementメソッドでページ内の要素を取得してあれこれ出来るようになります。find_element内の指定はhtmlとかcssの要素を指定して結構色んなパターンが書けて、:idとか:classとか:cssとかを第1引数に書いた後、指定する要素の内容(idだったらid名)を第2引数に記載します。
ちゃんと要素が見つかれば要素のelementオブジェクトが返ってきて、見つからないとエラーが返されます。
ちゃんと要素が見つかった後は、今回はテキストボックスだとすると、elementの持つsend_keysメソッドにテキストを渡すと、その値をテキストボックスに入れてくれます。
テキスト入力はsend_keysですが、ボタンとかはclickで押せます。セレクトボックスは
Selenium::WebDriver::Support::Select.new(Element).select_by(:text,'hogehoge')
みたいな感じで選択します。リファレンス
※Elementはfind_elementとかで見つけることを想定しています
要素を見つけるのが結構めんどうくさい
私はHTMLが不得意なのでそのせいかもしれないですが、idで指定出来ないときのfind_elementの引数作りに結構苦戦しました。xpathを指定するとだいたい行けるのですが、xpathの作成に苦労したり。。。逃げ道として、IDEでサンプルを作ると要素の指定の方法が出力コードから結構分かるので、参考にしました。
pryがめちゃくちゃ便利
これに限ったことではまったくありませんが、上述のように要素を見つけるのに苦労したので、どの書き方でどの要素が見つかるのか、というのをtry-errorするのに、pryはめちゃくちゃ便利でした。
ポップアップした画面にdriverを移動させる
driver.switch_to.window driver.window_handles.last
windows_handlesメソッドでwindowハンドルの配列が取得出来るので、lastで最近開いたwindowハンドルを取得します。そこにswitchするように書くと、ポップアップした画面に移動して続きの操作が出来ました
その他
yamlを使いました
結構多くの要素に値を入れなくてはいけなかったのと、色々なパターンで値を設定したかったので、実行プログラムでは、yamlファイルに各要素に指定する内容を書いておいて、そのハッシュをループしてどんどん入力する感じで作りました。
driver.find_element(param[:selector],param[:value]).send_keys param[:text]
みたいな感じで書いておいて、yaml側でこつこつ設定を書くようにしました。
それなりに使えていますが、きっと改善の余地はたくさんあるのだろうと思います。