F.Ko-Jiの「一秒後は未来」

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 文を使ったテストが書ける。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など