2011年9月29日木曜日

Selenium IDEを使ってみる(その4 Ajax)

こんにちは,今回はSelenium IDE の一区切りとして, Ajax 対策についてです。

Selenium IDEを使ってみる(その1)
でも少し, 触れましたがWebページの全体をロードすることなく, request, response を繰り返すAjaxでは
少しテクニックが入ります。

通常のテストを行うとき, ページの遷移, 表示を待つには

コマンド対象
waitForPageLoadtimeout(ms)
といったように waitForPageLoad でページのロードを待ちます。
(タイムアウトを指定する)

※この場合, 表示というのは JavaScript でいうところの  window.load()
JQueryでは, $(function(){});  にあたる。

しかし, このページロードでは, 非同期通信で,ページの一部を変更したりする処理では, 無視されてしまいます(確認済み)。


そこで, Ajax の通信終了を待ってテストを実行したい場合は何かしらの方法で待たなければなりません。

そこで登場するのが, wait系コマンドです。 残念ながら,すべての非同期通信に対応するコマンドはいまのところありません。 Selenium IDEのコマンドは, JavaScript ですから, JavaScriptで実装できれば自作して追加してみてはいかがでしょうか?

それはさておき, wait 系の関数を利用して, 非同期通信終了後に起こる何かしらの変更を検出するまで待っているという処理を追加すればよいのです。

ケース1 )  非同期通信後, ページに  Hello が表示される

コマンド対象
waitForTextPresentHello

waitForTextPresent というテキストが出現するまで待つというコマンドで, Helloが表示されるまで待つ

ケース2)  非同期通信後  <input type="button" id="rena"/>  id=rena を持つボタンが出現

コマンド対象
waitForElementPresentid=rena

waitForElementPresent というElement が出現するまで待つというコマンドです。対象は前回説明した Locatorsを利用します。

wait 系のコマンドは 120 くらいあります(半分は Not がつくだけですが)
その中でも, waitForTextPresent,  waitForElementPresent,  JavaScript の命令を直接埋め込める waitForCondition とかをよく使います。

waitFor と Selenium IDEのコマンド欄にうつとリファレンスが参照できるので, 興味のある方は
調べてみてください。

※wait系のコマンドでタイムアウトがない場合, 一生待ち続けるのでテストがFailする場合, テストが続いていかないといった残念なケースもあります。

筆者は, WebDriverを利用した, JavaのJUnit を使っていますが, そこではWait 系の関数は少ないので, 自作しています。機会があればいつかこれについても書きたいと思います。

0 件のコメント:

コメントを投稿