Selenium WebDriverの基礎的な使い方

少し前からSeleniumをしばしば触っているのですが、最近社内で初めて使う人向けにQiita:Teamで記事を書いたので、それの転用でブログ記事を書いてしまおうという魂胆になります。

リファレンス

Selenium Design Patterns and Best Practices

Selenium Design Patterns and Best Practices

仕組みのイメージ

あくまでもイメージで、正確ではないかもしれませんが、Browserを動かすものとしてDriverがあって、DriverをProgramで動かすことで、Browser操作が自動化できる、みたいに考えています。

program -> selenium-webdriver -> browser

(私は最初の頃、Driverって言われてもピンと来なかったので、Browserを動かす何かのことをDriverと言うことが分かれば捗る人が少しはいらっしゃるのではないかと思ってます)

HelloWorld的なもの

まず、webdriverを生み出します 参考ドキュメント

driver = Selenium::WebDriver.for :firefox

driverを使ってブラウザを操作をします 参考ドキュメント

# 特定のURLにアクセス
driver.navigate.to 'http://genius.hateblo.jp/'

## driver.navigateでNavigationクラスが取得されます。
## Navigationクラスはブラウザ操作と似た感じのことが出来るみたいで、
## 特定のURLに遷移したり、ブラウザバックしたり、というような操作ができます

# titleを取得する
driver.title

# ページのソースを取得する
driver.page_source

# ブラウザを閉じる
driver.quit

もっと色々な操作を行う

これも正確性には欠けるかもしれませんが、ページ内のボタンを押したり、プルダウンを選んだり、というような操作は、以下のようなイメージだと考えています。

driver.find_element -> Element#action

Driverがいるページから、ボタンだったりプルダウンだったり(=Element)を見つけます。そのためのメソッドfind_elementです。find_elementで見つかったElementに対して、clickなどのElementが持つメソッドを実行して、具体的な操作を行います。

  • find_elementはSearchContextというモジュールで実装されていますので詳しくはこちらを参照してください

  • find_elementで見つかったElementで実施出来る操作はElementのドキュメント を参照してください

ちなみに、Element自身もfind_elementを継承していますので、一回のfind_elementで特定しきれない要素などを複数回find_elementを実行することで特定する、というようなこともできます

実装例

# ボタンをクリック
driver.find_element(:id,'hogehoge').click

# テキストボックスに入力
driver.find_element(:id,'hogehoge').send_keys 'HELLO WORLD'

# テキストボックスを空にする
driver.find_element(:id,'hogehoge').clear

# ラジオボタンを選択する、チェックボックスをクリックする(elementが特定されている場合)
driver.find_element(:id,'hogehoge').click

# ラジオボタンを選択する、チェックボックスをクリックする(値などでクリックするものを選びたい場合)

driver.find_elements(:name,'hogehoge').each do |element|
  element.click if element.attribute('value') == 'fugafuga'
end

## radioやcheckboxの要素がidなどで特定される場合には、
## そのidでfind_elementしてクリックすれば良いだけです。
## そうではなくて、「値で判断してクリックするものを選びたい」場合などは、
## find_elementsメソッドを使い、いったんradioやcheckboxを構成するelementを一通り取得してしまい、
## それらのループの中で期待する値と同じだった場合にクリックする、というようなことをしています。

# セレクトボックスから選択する
Selenium::WebDriver::Support::Select.new(driver.find_element(:id,'hogehoge')).select_by(:value,'list value1')

## リストの選択は、Selectクラスにelementを渡してnewした後、Selectクラスのメソッドを使って選択などの処理を実施します

補足

重複している内容もありますが、過去にもSeleniumについての内容を書いていますので、そちらのリンクも貼っておきます

genius.hateblo.jp genius.hateblo.jp

システムテスト自動化 標準ガイド CodeZine BOOKS

システムテスト自動化 標準ガイド CodeZine BOOKS