Selenium ver.0.5  勝手にまとめサイト by madknight [ blog ]


2005.10.4 update!

・version 0.6でました。Selenium Recorderの紹介も含め、詳しくはコチラ


Selenium って何?

 これっていわゆる、Webアプリケーションのテストツールというらしいです。例えばPerlとかで組んだCGIとか、PHP・ASP・JSPとか、ブラウザで動くプログラムを作ると必ず動作テストやりますよね(やらない?) プログラムをちょっと修正するたびに「あれーどっか壊れてないかなー」と何回も同じような操作をチェックするために、ブラウザでポチポチやらなきゃいかんわけです。面倒でしょ?

 それを簡略化してくれるのがSelenium。自動化したい操作を、HTMLのテーブルタグにちょいちょい、と書いてあげれば後はガシガシ動いてくれるわけ。便利そうじゃない? 「おっ?スッゲーっ!!」と思ったヒトは、とりあえずもう少し先まで読んでみてくれ。


さっそく試してみたいんだけどー。

 Seleniumを動かすのに最低限HTMLとJavaScriptは分かってほうがいいと思う。Webアプリ組めるヒトならある程度大丈夫かな?んじゃ早速。えーっと、とりあえず公式サイトから Selenium をDLしてくれ。デモみたい人はコチラからどうぞー。

・Selenium オフィシャル
http://selenium.thoughtworks.com/index.html

解凍するとreadmeとdocフォルダ、seleniumフォルダが展開されるはず。seleniumフォルダの中にはテストを走らせる為に必要な色んなファイルが入ってるけど、とりあえずデモを見てみましょう。/selenium/index.html をブラウザで開くと上の画面みたいなのが開くはず。とりあえず何も考えずに右上の「All Tests」ボタンを押してみよう。おおおおっっ!?

とまぁ、こういうことが出来るのだ。なんとなーく動き見てると設定ファイルの書き方わかるっしょ(w こういうことしたいなーと思ったときはとりあえずサンプルのテストを見てみると良さげ。

じゃあ、早速自作のプログラムもテストしてみようよ。seleniumフォルダをテストしたいプログラムがアップされてるディレクトリに放り込もう。例えば /cgi-bin/bbs.cgi をテストしたいんだったら /cgi-bin/selenium/ みたいに。

んで、次は自動化させたいブラウザ操作を設定ファイルに書いていこう。設定ファイルっつってもただのHTMLファイルなので気構えなくてよし。Dreamweaverとかでサクサク書いてしまおう。

1)テストを書いて /tests に放り込む。例えば TestTest.html など。
2)/tests/TestSuite.html のテーブルに新しい行を作って、TestTest.htmlへのリンクを貼る。
3)TestRunner.html をブラウザで開くとTestTest.htmlへのリンクが見えているのでクリック。
4)「Selected Test」ボタンを押すと、お!動いてる〜

相対パスやフォームの名前付けなんかで苦労する場合があるけど、そのときはDOMモデルを思い浮かべながら記述を見直してトライ。


気がついたら書き込むコーナー

・RunしたときXxxAndWaitだとうまく動かないですよ?

複数のフレームを読ませたりしてるとガチャることがあるっぽい。そんな時はいちいち pause 300 とか指定してマス。

・idも何も振ってないimageボタンをクリックする、という暴挙

全くSeleniumを知らない世代に生まれたWebアプリには、idなぞ知らぬ!というフォームオブジェクトが居らっしゃってウゼー。そういう訳で勢い余って Xpath で指示してみた。上から数えて3番目のテーブルの8行目7列目の画像をクリックさせる場合、例えばこんな指定になる。

xpath=//table[2]//tr[7]/td[6]//img

テストを走らせてる際に、最初のxpath指定のテスト行を通過すると ウントコドッコイショ とxpathパーサを起動するために否応ナシに5秒ほど待たされる(ペンティアム4デスヨ!)のがナニですが、どうしても押したいプッシュしたい!って方はどぞー。

⇒FUJITSU 技術情報 XPath
http://xml.fujitsu.com/jp/tech/xpath/

⇒XML Path Language (XPath)バージョン 1.0 和訳
http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm


思いつきで言ってみる

・SQLとか使えないよねー?

 例えばショッピングカート作ってて新しいお客さんを登録させたいとき、新規IDをDBから引っ張ってこなきゃ無理な場合とか。力技でAjaSQL(http://ajasql.org/)という手もあるけど、PHPを動かせないとイカンのでやや面倒かも。あー!TestTest.htmlとかに直にサーバサイドで書いちゃえばいいじゃん!えーと.htmlでCGI/PHP/ASP/JSPが起動するようにサーバを設定(.htaccessとかで)し直してやって、DB繋いてSQL発行して新規IDゲットしたら、javascriptの変数にゴリっと代入文にダイレクトに

var jsNewID = <%=新規ID %>;

みたいな。あとは

type - newID - javascript{ jsNewID }

とかでイけるんじゃなかろうか? 今度暇なときにやってみよう、このコンボは使えるかも?

・入れ子のフレームからPOPウィンドウってどう捕まえるの?

POPウィンドウの中までテスト処理を追っかけてやりたい場合、selectWindowでウィンドウ名を指定しなきゃいけないんだけど、入れ子のフレームだとマジ面倒くさい。結局こんな感じで書いて解決しました。

selectWindow - mainFrame.leftFrame.popWindow -

window.focus()使ったりしてたんで正直Seleniumが追っかけてくれるかどうか微妙だったけど、何食わぬ顔でテスト処理を続行してくれた。すごいぞSelenium。

・テスト書くのが....ダルイです

んーWebStoryUnitみたいにサーバのフィルタに記録用のルーチン差し込んでリクエストを横取りしてテストを生成・・・という訳にはいかないのだよなぁ。なんかこう録画ボタン一発でなんか出来ないかね、マックロード万歳。録画したい画面を子フレームに表示させてevalとかでオブジェクト監視して状態変わったらとか・・・・えーと、考えます(;´Д`)


情報源

・Selenium オフィシャル
http://selenium.thoughtworks.com/index.html

・川o・-・)<2nd life - webアプリケーションテストツール seleniumがヤバすぎる
http://d.hatena.ne.jp/secondlife/20050525/1116947520

・プチツール - selenium Processor
http://www.iburiworks.com/petittools/slp.html


Selenium Reference

コマンドはSelenium に何をするのかを知らせるものです。Selenium のコマンドは[Action]と[Assertion]の二種類に分類されます。

コマンド 目標

[Action]は一般に、アプリケーションの状態を操るコマンドです。 これらは「このリンクをクリックする」とか「そのオプションを選択する」といった動作をします。 アクションが失敗するか、エラーが発生すると、現在のテストの実行が止まります。

チェックは予想されるケースでのアプリケーションの状態について確かめます。例えば「ページタイトルが確かに××であること」とか「このチェックボックスがマークされていることを確かめる」などを含みます。 [Assertion]が失敗するときのテストを止めるか、もしくは単に失敗を記録してテストを継続するように、Seleniumを設定することができます。

Element Locatorは、コマンドがどのHTML要素を指すかをSeleniumに指示します。 多くのコマンドがtagert属性としてElement Locatorを必要とします。 Element Locatorsに関する例は"elementId"と「document.forms0.element」を含んでいます。 これらは次のセクションでより明確に説明されます。


Element Locators

Element Locatorsは、コマンドがどのHTML要素を示すかをSeleniumを特定させます。Element Locatorsにはいくつか種類があります。

・id
要素のIDか、またはname属性に基づいている要素を指定します。ある要素にIDがマッチしたものが見つかればそれが選ばれます。

id=TheElementId

・name
要素のname属性に基づいている要素を指定します。ある要素にname属性がマッチしたものが見つかればそれが選ばれます。

name=TheElementName

・identifier(識別子)
要素のIDか、またはname属性に基づいている要素を指定します。ある要素にIDがマッチしたものが見つかればそれが選ばれます。そうでなければ、ある要素にname属性がマッチしたものが見つかったものが選ばれます。

name=TheElementName

・dom
HTML構文を構造解析する内蔵DOMを使って要素を探します。DOMの構造解析ロケータは「document」で始めなければなりません。

dom=document.forms['myForm'].myDropdown
dom=document.images[56]

・xpath
定義されたXPath表現を使用することで要素の場所を見つけます。 「XPathロケータは」 //で始まらなければなりません。

xpath=//img[@alt='The image alt text']
xpath=//table[@id='table1']//tr[4]/td[2]

・link
指定されたテキストとのリンクを見つけます。

link=The link text

ロケータ接頭語がなければ、ロケータのデフォルトセットが使用されます。ロケータのデフォルトセットは以下の通りです。

identifier
dom
xpath

 


SelectOption指示子

SelectOption指示子はHTMLのSelect要素(例えば、特定のオプションを選択するか、または選択されたオプションが正しい位置に選択されているのを確かめるなど)のオプションを指定するいくつかの手段を提供します。 SelectOption指示子のいくつかの種類があります。

・label
SelectOptionのラベル(つまり、目に見えるテキスト)をベースにしてマッチングを行います。例えば「fo*r」と記述すると <option>foobar</option> に合うようにglobマッチングを行います。

label=TheLabel

・value
SelectOptionの値をベースにしてマッチングを行います。例えば「fo*r」と記述すると <option value="foobar">Some Text</option> に合うようにglobマッチングを行います。

value=TheValue

・id
SelectOptionのラベル(つまり、目に見えるテキスト)をベースにしてマッチングを行います。例えば「fo*r」と記述すると <option>foobar</option> に合うようにglobマッチングを行います。

id=option1

・index
SelectOptionのインデックスをベースにしてマッチングを行います(オフセットゼロから)

index=2

接頭語がなければ、デフォルトではラベルに対してマッチングを行います。



Selenium Actions

アクションはアプリケーションに対して何か動作を行うようにSeleniumに知らせるものです。一般にこれらはユーザが行う何らかの動作を表します。

多くの Actionsは"AndWait"接尾語を付けてコールできます。この接尾語は「アクションを起動させてブラウザがサーバに通信を行い新しいページがロードされるのを(次のコマンドに移る前に)待つべきである」とSeleniumに知らせるためのものです。 このパターンへの例外は「open」と「click」です。これらはデフォルトの動作でページがロードされるのを待ちます。


command taget value function
open 開くURL 無視 テストフレームで相対/絶対URLを開く。ブラウザにおける(XSS)セキュリティ制限のため、URLはSeleniumと同じサイトになければならない
click クリックされる要素ID 無視 リンク、ボタン、チェックボックスまたはラジオボタンのtargetをクリック
clickAndWait     targetをクリックすると次ページをロードする場合はこちら
type 入力フィールドの要素ID タイプされるテキスト、または選択されたオプションのvalue値 テキストフィールド、コンボボックス、チェックボックスなどにテキストをタイプ(入力)する
typeAndWait     targetをクリックすると次ページをロードする場合はこちら
select 選択される要素ID オプション識別子 オプション識別子に基づいてドロップダウンからオプションを選択。1つ以上のオプションがマッチする場合(例えば「f*b*」のようなグロブを使う、または同じラベルか値を持っている1つ以上のオプションが存在する)には、最初にマッチしたものが選択される。
selectAndWait     選択されると次ページをロードする場合はこちら
selectWindow 選択するウィンドウの要素ID 無視 ポップアップウィンドウを選択する。ポップアップウィンドウが一旦選択されると、以後のすべてのコマンドがそちらのウィンドウで実行。再びメインウィンドウを選択するには、targetに「null」を使用
pause 一時停止するミリ秒数 無視 指定された時間の間、テストスクリプトの実行を一時停止する
waitForValue 入力フィールドの要素ID 指定フィールドに格納されるべき値 指定されたフィールド(text,hidden,etc...)に、指定された値が入力されるまで待機する。入力に指定された値がこない場合は永遠に待機する
goBack 無視 無視 ブラウザ上の「戻る」ボタンをクリックする
close 無視 無視 タイトルバーの「閉じる」ボタンをクリック
store 格納する値 値を格納する変数名 引数で渡された値を変数に格納する。targetにSeleniumの代替変数やjavascriptによる評価式のいずれかを使用可能
storeValue 入力フィールドの要素ID フィールドの値を格納する変数名 入力フィールドの値を変数に格納
storeText 要素ID 要素の文字列を格納する変数名 要素の文字列を変数に格納


Selenium Checks

チェックは、アプリケーションの状態について確認するために使用されます。フォームの各フィールド値や何らかのテキストの状態、または現在のページのURLをチェックするためにこれらを使用します。Selenium チェックには「assert」および「verify」の2つのモードがあります。「assert」チェックが失敗するとテストが中止されることを除いては、これらは同様に振る舞います。「verify」チェックが失敗した場合、テストは実行を続行します。「assert」の単独チェックによって正しいページにあることを保証された後に「verify」チェックによるフォームのフィールド値やラベルなどのテストが続きます。


verify/assert taget value function
verifyLocation assertLocation 予想されるページの相対的位置 無視 テストされる現在のページの位置についてチェック
verifyTitle assertTitle 予想されるページタイトル 無視 現在のページのタイトルについてチェック
verifySelected assertSelected チェックするドロップダウンの場所 選択されたオプションがマッチすると予想されるオプション識別子 ドロップダウンの選択されたオプションが、指定されたオプション識別子を満足するかをチェック
verifySelectOptions assertSelectOptions チェックするドロップダウンの場所 オプションラベルのコンマ区切りのリスト コンマ区切りのリストを参照しながらドロップダウンにおけるすべてのオプションのラベルについてチェック
verifyText assertText チェックする要素ID 予想されるテキスト 要素のテキストについてチェック
verifyAttribute assertAttribute チェックする 要素ID@属性値 予想される属性値 要素の属性値についてチェック。属性値は<element-locator>@<attribute-name>で特定する。
verifyTextPresent assertTextPresent 予想される文字列 無視 指定されたテキストがページ内に存在するかをチェック
verifyTextNotPresent assertTextNotPresent 予想される文字列 無視 指定されたテキストがページ内に存在しないことをチェック
verifyElementPresent assertElementPresent 予想される要素ID 無視 指定された要素がページ内に存在するかをチェック
verifyElementNotPresent assertElementNotPresent 予想される要素ID 無視 指定された要素がページ内に存在しないことをチェック
verifyTable assertTable テーブル名.行.列 指定されたセルの中に、予想されるテキスト テーブルのセル内のテキストについてチェック。特定のセルは テーブル名.行.列 で指定する。
verifyVisible assertVisible 目に見えるべき要素ID 無視 指定された要素がページ内に存在し、可視状態であることをチェック
verifyNotVisible assertNotVisible 見えてはいけない要素ID 無視 指定された要素が可視状態でないをチェック
要素が存在しない場合は可視状態でないとみなす
verifyEditable assertEditable 編集可能であるべき要素 無視 指定された要素が編集可能であることをチェック
verifyNotEditable assertNotEditable 編集不可能であるべき要素 無視 指定された要素が編集可能でないことをチェック
verifyAlert assertAlert アラートウィンドウ内で予想されるテキスト 無視 javascriptアラートが発生して、アラートのテキストが指定されるものであることをチェックする。このチェックはアラートが発生するタイミングが同じでなければならない。Seleniumによるチェックが完了すると自動的に「OK」ボタンがクリックされる。
verifyConfirmation assertConfirmation ダイアログウィンドウ内で予想されるテキスト 無視 javascriptによるダイアログが表示されたとき、そのダイアログ内のテキストが指定されるものであることをチェックする。このチェックはダイアログが発生するタイミングが同じでなければならない。Seleniumによるチェックが完了すると自動的に「OK」ボタンがクリックされる。
chooseCancelOn
NextConfirmation
無視 無視 このコマンドを実行後、次回javascriptによるダイアログが表示されたとき、Seleniumによるチェックが完了すると自動的に「チャンセル」ボタンがクリックされように設定する。


■ パラメータ構成と値

 すべてのSeleniumコマンドの引数は、単純な置換変数?と完全なjavascriptの両方を使って構成することができます。したがって、異なった構文を使用することでアクセスする場合を除いて、以前に格納された変数に、これらのメカニズムの双方からアクセスすることができます。

・ 格納された変数

 コマンド「storeValue」「storeText」「store」を使うと、後からアクセスするための変数を格納することができます。内部的には値が変数名によって合わせられている状態で、これらの変数は「storedVars」と呼ばれるマップに格納されます。これらのコマンドはコマンドリファレンスを参照してください。

・ 置換変数?

置換変数?はコマンドパラメタに以前に格納された変数への簡単なアクセスを提供します。このメカニズムは簡単なもので、代入する変数は $variableName で示されます。静的なテキストと共に複数の変数を代入して、混在させることができます。

・ Javascriptによる演算値

コマンドの引数にJavascriptによる演算値を用いることで、javascriptの出力をコマンドの引数に指定することできます。このメカニズムを使用するにはコマンドの引数に、以下のように記述します。

javascript{ (Javascriptの演算) }

ブラケット({ })の中のテキストがjavascript表現として評価されます。また上で述べたstoredVarsマップを使うことで、以前に格納された変数として使うことでアクセスすることができます。なお、置換変数?をJavascriptによる再演算と結合ができないことに注意してください。


Seleniumの拡張

あなた自身が作成したAction/Check/LocatorStrategyiesを追加することで、とても簡単にSeleniumを拡張できます。これにはSeleniumオブジェクトやPageBotオブジェクトのプロトタイプが記述されたJavascriptにメソッドを加える作業が必要です。Seleniumの起動時に、これらのプロトタイプのメソッドを自動的に走査し、名前パターンを使って Actions/Checks/LocatorStrategyies を認識します。

Action

Seleniumのプロトタイプに定義された do××× と名付けられる全てのメソッドはActionとして追加されます。また、それぞれのActionには ×××AndWait もメソッドとして登録されます。Actionメソッドは最大2つまでの引数を、テストを定義したテーブルの2列目・3列目から取得できます。

例:
Seleniumに Action "typeRepeated" を追加すると、Seleniumがテキストボックスにテキストを「二度」タイプします。

Checks

Seleniumのプロトタイプに定義された assert××× と名付けられるメソッドは全てCheckとして追加されます。また、それぞれのCheckには assert××× もメソッドとして登録されます。Checkメソッドは最大2つまでの引数を、テストを定義したテーブルの2列目・3列目から取得できます。

例:
確実に「検証したいテキストが繰り返し入力」されるかをチェックする"valueRepeated"を追加します。この場合テストで利用可能なコマンドは、assertValueRepeatedとverifyValueRepeatedとなります。

LocatorStrategyies

PageBotのプロトタイプに定義された locateElementBy××× と名付けられる全てのメソッドはロケータ定義として追加されます。 ロケータ定義は2つの引数を取ります。最初の引数は与えられた文字列から接頭語を除いた文字列に、次の引数は探索するドキュメント名?になります。

例:
"valuerepeated="指示子を追加すると、与えられた値と等しい属性値が繰り返されたときの最初の要素を検索します。


user-extensions.js

デフォルトでは、Seleniumは "user-extensions.js" というファイルを探して、その中のjavascriptコードを読み込みます。このファイルはSeleniumのコアを変更することなく新たな機能を追加するのに便利です。なお、標準のディストリビューションではこのファイルは存在していません。ユーザーは一般的な位置にこのファイルを作成することで、Seleniumソースを変更する必要無く、独自の拡張コードを置くことができます。これはまた、アップグレード作業の際にも有望となる手助けになるでしょう。