Biz∫のWEBアプリケーションのシナリオテストを自動化したい(1)

月曜日、火曜日とシナリオテストの自動化という調査を行っておりまして、とりあえず一段落したのでアップします。
Webのテストは、シナリオを作成して手動でシナリオをこなし、結果を記録していくわけです。
このシナリオ作成や、作成したシナリオを元に自動でテストを実行してくれるようなソフトウェアが世の中的には存在します。
うちの会社では、品質推進部がOracle application testing suite(http://wiki.oracle.com/page/Oracle+Application+Testing+Suite)という製品を選定しており、
社内パッケージのテストに使用できるようになっています。以前のSAPのWEBDYNPROを使用したプロジェクトでもお世話になりました。
さて、今回も同じように操作をキャプチャしてシナリオを作成してと...という段階で、画面中のボタンを押下しても操作がキャプチャされていないような...
いや、確かにキャプチャされていない、、、といった事象に出くわしました。
冷静に考えてみると、今回のBiz∫の画面はマスカットを使用していて、これってAJAXだから意図した操作がキャプチャされないのでは?ということで
どうやったら取得できるのか、サポートに問い合わせということになりました。Oracle Load TestingではFAQにAJAXについて書かれているのですが。。。。
サポートからの問い合わせ結果が帰ってきたら、またアップしたいと思います。

という訳で、AJAXを使用しているWEBアプリケーションのシナリオテストにはどんなツールがあるのかなということで調べました。
まあ極力低予算ということで、フリーのツールから調査することになるのですが、単体テストに関する書籍を読みあさっていた時からSeleniumについては
とても気になっていたので、これを機に調査することにしました。
Seleniumhttp://seleniumhq.org/)
サイトの情報(ちょっとだけ古い情報のような気もするのですけど。。。)によると、Seleniumは大きく分けて以下の3つの主要なツールに分かれているとのことです。

今回はシナリオ作成のために、Selenium-IDEを使用してBiz∫マスカット画面をキャプチャし、再現できるか検証します。

Selenium-IDEは、Firefoxのアドオンプログラムとなっています。
インストールは、http://seleniumhq.org/download/Selenium-IDEをクリックすることで、アドオンのインストールが始まります。

インストールが終了すると、Firefoxのツールメニューに、Selenium IDEが出現します。(下の図)

デフォルトの設定では、Selenium IDEを起動すると既にキャプチャするようになっていますので、FirefoxでWEBアプリケーションを操作すると自動的にその操作をキャプチャしてゆきます。
ここら辺の操作は沢山のサイトが既にありますので、ここでは省略したいと思います。
以下に私が参考にさせて頂きましたサイトを載せておきます。(とても参考になりました。ありがとうございます)

さて、マスカット画面で苦労したのは、ウェイト処理です。多分他のアプリケーションでもウェイト処理が一番厄介だとは思いますが。

  1. 左側のメニューをクリックしたあとに、画面が表示されるまで、どうやってウェイトするか
  2. マスカット画面のボタン押下でサーバと通信したあと、どうやってウェイトするか

幸いにも、上の2つの処理は以下のような「処理中です。」のダイアログが自動で組み込まれているので、これを利用することにしました。

処理中のダイアログのDOM上のIDは、dijit_Dialog_1という名前なので、SeleniumのwaitForElementPresentコマンドを使用して、DOMに現れるのを待ちます。その後、消えるときはStyle属性のdisplayを操作しているので、これがnoneにセットされるのをwaitForConditionで待ちます。

コマンド 対象
waitForElementPresent dijit_Dialog_1
waitForCondition selenium.browserbot.findElement('dijit_Dialog_1').style.display == 'none' 10000

これらを駆使して

  1. ログイン
  2. メニュークリック
  3. 画面描画までウェイト
  4. 検索ボタンクリック
  5. 検索結果表示までウェイト

という流れを作成してみたのが、以下の図になります。

さて、課題がのこりました。
waitForElementPresentの引数に指定できるロケータなのですが、テキストパターンや正規表現が指定できないのです。
処理中のダイアログは、画面操作を繰り返すたびにdijit_Dialog_1,dijit_Dialog_2,dijit_Dialog_3...と後ろの数字がインクリメントされていくようなのです。
さて、どうしたものか。。。