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側でこつこつ設定を書くようにしました。

それなりに使えていますが、きっと改善の余地はたくさんあるのだろうと思います。