Seleniumでif文的なテストをstoreEvalを使って書いてみる
Seleniumでは if / else 文のような条件分岐は定義されていないらしい。
Selenese, by itself, does not support condition statements (if-else, etc.) or iteration (for, while, etc.).
» Sequence of Evaluation and Flow Control | Selenium Commands — Selenium Documentation
で、ドキュメントによると以下の3通りの解決方法が提示されている。
- Selenium-RCを使う
- storeEvalコマンドを使って JavaScript を実行する
- goto_sel_ide.js というSelenium IDEの拡張を使う
Selenium-RCやSelenium IDEは使ってないので、今回はstoreEvalを使ってやってみることに。
テストケース
たとえば「ログインしていなければログインする」というテストを書くことにする。
画面のHTML
ログインしていない場合は以下のようなフォームが表示されるとする。
<form id="login" method="post" action="/login"> <input type="submit" value="ログイン" /> </form>
また、ログインすると id=”mypage” という要素が画面に表示されるとする。
<div id="mypage">マイページ</div>
なお、この要素はログアウト状態では表示されないものとする。
Seleniumのテスト
<tr> <td>storeEval</td> <td>javascript{ var _window = this.browserbot.getCurrentWindow(); if (_window.document.getElementById("login")) { _window.document.getElementById("login").submit(); } 1; }</td> <td>dummy</td> </tr> <tr> <td>waitForElementPresent</td> <td>id=mypage</td> <td></td> </tr>
解説
最初の storeEval で JavaScript が実行される。Seleniumテスト内でアプリケーションの window オブジェクトを取得するには this.browserbot.getCurrentWindow(); を使えばいいので、それを利用して id=”login” の要素があれば id=”login” を submit するようにしている。
storeEval では最後に評価される値を変数に格納する。何も評価されないとエラーになるのでエラー回避のために 1; を記述していて、ダミーの変数に格納している。
2番目の waitForElementPresent は、ログインの submit 後にマイページがきちんとロード完了するのを待って次のテストに進むために必要。JavaScript 内で Selenium の clickAndWait が使えるのかどうか分からなかったのでとりあえずの措置。
という感じで storeEval を使って Selenium で簡単な if 文を使ったテストが書ける。
コメントを残す