[index]
[top]
[bottom]

Robotによる、Webアプリケーションの自動テスト

JavaのRobot

Webアプリケーションのクライアント側のテストといえば、JsUnit等が使われていますが、イベントに関するテストはなかなか自動化が難しいものです。特に、様々な環境でテストを行う必要があるWebアプリケーションでは、環境毎にツールを用意しなければならないとすると、かなりの負担になります。

しかし、うれしいことに、JavaにはRobotという、GUIのテストを行うためのクラスが用意されており、このクラスはネイティブのイベントを発行することが出きるのです。要するに、Javaを実行できる環境であれば、Webブラウザ上のアプリケーションに対し、マウスやキーボードのイベントを発生させて自動実行することが出来るということです。

但し...

もちろん(というか残念ながら)、こういう便利な代物には、但し書きが付き物です。

マウスイベントを発生させてボタンを押そうとしても、そのボタンがどこにあるかが分からなければいけません。マウスカーソルをボタンの上に移動させて、左ボタンを押して放すというイベントを発生させることになりますが、カーソルの移動時に指定するポジションは、当然スクリーン上のポジションとなるため、Webブラウザ上のボタンが、スクリーン上でどのポジションにあるかを、何らかの方法で算出する必要があります。

解決策として、当コンテンツではJava Appletを使用しています。Java Appletはjavascriptからアクセスできるため、Webブラウザ上の要素の位置をjavascriptにより特定し、その位置をJavaのメソッドに渡すことが出来るのです。

しかし、キーボードやマウスのイベントを自由に発生させることが出来るということは、デスクトップを自由に操作出来るということに他なりません。もし、Java Appletで自由にRobotが使えるとすると、これは危険極まりないセキュリティホールです。

そこで、Javaの開発者は、特別な許可が無い限り、Robotクラスのインスタンスを作成できない様に設計しました。そして、標準では、Java Appletにこの許可はありません。

テストを実行するには、お使いのjvmにセキュリティポリシを追加する必要があります。そのため、当サイトで動作するサンプルページを公開するということが出来ません(当サイトからロードしたクラスに、Robotクラスのインスタンス作成権限を与える必要があるためです。そこまで私を信じてくれというほど図々しくは...)。

ということで、動作に必要なファイルをまとめたアーカイブを用意しました。ダウンロードして、ローカルで実行してみてください。動作に必要な前提環境は以下のとおりです。

動作を確認したWebブラウザとOS
WebブラウザOSバージョン備考
FirefoxLinux43.5は動作しません(将来サポートする予定です)。
FirefoxWindow XP3.6, 4
ChromeLinux11
ChromeWindows XP11
IEWindows XP6, 7
IEWindows 78TABの動作を変更する必要があります。
その他の必要な環境
環境詳細備考
Java実行環境java6が必要ですセキュリティポリシの変更を行う必要があります。
Webサーバ確認済みのサーバは、Apache2.2必ずローカルマシンかローカルネットワーク内に、Webサーバを用意してテストしてください。
キーボードキー配列が106か109記号の入力で制限があります

WebブラウザでJava Appletが動作出きるように設定する

お使いの環境でJava Appletを動作させるためには、JavaのインストールとWebブラウザの設定が必要です(設定の不要な場合も有ります)。

ダウンロードとインストール

下記URLからzipファイルをダウンロードしてください。

ダウンロード 2011/10/30 Update

ダウンロードしたzipファイルを解凍してください。以下のようなディレクトリ構成となります。

解凍後のディレクトリ構成
webtest/
  +-com/
  | +-yscjp/
  |   +-webtools/
  |     +-robot/
  +-jslib/
  | +-20110703/
  | +-20110806/
  +-robot.html

webtestディレクトリを、Webサーバがアクセスできる位置にコピーしてください。以降の説明は、ユーザディレクトリの直下にコピーした場合を想定しています。

Webサーバ上のディレクトリ構成
public_html/
  +-cgi-bin/
  +-webtest/

http://localhost/~[ユーザID]/webtest/robot.htmlにアクセスすると、テスト画面が表示されしばらくしてJavaのコンソールが表示されます(コンソールを開く指定となっている場合)。Javaのコンソールが表示されない場合、Webブラウザの設定を見直してください。

Javaのセキュリティポリシーを設定していない場合、コンソールに例外が表示されます。

Javaのセキュリティポリシー設定

<<<<重要な警告>>>>

Javaのセキュリティポリシーの設定変更は、一つ間違えるとローカルマシンに、巨大なセキュリティホールを開けることになります。このコンテンツの指定通りに設定しても動作しないような場合に、適当に設定して動作させるというようなことは、絶対にしないでください。

 

ポリシーの設定は、ユーザ個別で設定する場合、以下のファイルに行います。

Linuxの場合

[ユーザHome]/.java.policy

Windowsの場合

c:/Documents and Settings/[ユーザID]/.java.policy

基本機能とイメージキャプチャで、設定する必要が有るセキュリティポリシーが異なります。

基本機能で必要なポリシー設定
ポリシー内容備考
java.awt.AWTPermission"createRobot";
イメージキャプチャで必要なポリシー設定
ポリシー内容備考
java.awt.AWTPermission"readDisplayPixels";
java.util.PropertyPermission"user.home", "read";
java.io.FilePermission"${user.home}${/}-", "read, write, delete";

ポリシーの設定は、classファイルをロードするURLに対して行います。上記の例では下記URLに対して設定することになります。

http://localhost/~[ユーザID]/webtest/-

操作方法

<<<<重要な警告>>>>

このプログラムは、マウスやキーボードを操作します。何らかの原因で意図しない動作をした場合、ご利用のコンピュータに重大な影響を与える可能性が有ります。

ファイラ(エクスプローラ等)やその他マウスやキーボードの操作で重大な問題を引き起こす可能性のあるプログラムは、必ず終了した状態で実行してください。

作者は、このプログラムが引き起こした問題について、責任をとることが出来ませんので、自己責任の元実行してください。

サンプルテストの実行方法

サンプルを実行する、簡単な操作方法です。詳細な操作方法に関しては、今後拡充していきます。

サンプルは、WebブラウザのWindowサイズが1000x800ピクセル程度あることを前提としています。Windowサイズが小さい場合、正しく動作しない可能性が有りますので、注意してください。新しくWindowをオープンする場合(Tabブラウザでは無い場合)、「テストケース実行時の設定」の高さや幅を指定してください。

Webブラウザで、http://localhost/~[ユーザID]/webtest/robot.htmlにアクセスします。

テストケースで、test001.xmlを選択し、実行ボタンをクリックします。マウス操作により、リンクをたどってページ遷移をするサンプルです。

同様に、test006.xmlを実行すると、キーボードからテキストを入力させることが出来ます。また、このサンプルは、最後に表示した画面のキャプチャイメージを[HOME]/capture/に出力します。

test001.xml

単純にリンクをたどるサンプルです。同じ処理を3回繰り返し終了します。

test006.xml

フォームを操作するサンプルです。

環境によっては、正常に動作しない場合も有ります。

test008.xml

要素の各位置にマウスを移動するサンプルです。IE6では、正しく表示できないようです。

canvas_test.xml

マウスドラッグで、要素を移動させるサンプルです。IE6では、正しく表示できないようです。

イベントキャプチャ

イベントキャプチャは、FireFox4でのみ実行できます。

コンテンツURLに"index1.html"と入力し、読み込みボタンをクリックしてください。Window(または新しいタブ)がオープンし、index1.htmlがロードされます。"リンク先が存在する"をクリックし、ページが遷移した時点で再び"リンク先が存在する"をクリックしてください。

Robotでテスト画面で、キャプチャの終了をクリックし、キャプチャ結果の実行をクリックします。キャプチャしたイベントが再現できれば成功です。この時、キャプチャの終了をクリックする前に、オープンしたWindow(またはタブ)を閉じるとエラーとなってしまいます。

現時点のバージョンでは、キャプチャしたとおりにイベントが再現できるのは、単純なマウスクリックだけです。特にキーボードからの入力は、殆ど思ったとおりになりません。

また、キャプチャの結果にjsRobot.mouseXXXXPress()jsRobot.mouseXXXXRelease()がある場合は注意してください。

jsRobot.mouseXXXXPress()のあと何らかの理由によりjsRobot.mouseXXXXRelease()が発行出来なかった場合、デスクトップ上でマウスの操作が出来なくなる危険性が有ります。この様な事象は起きたときには、キーボードを使うなどして「Robotでテスト」画面を表示し、“マウスボタンリリース”ボタンを押下してください(Tabキーでフォーカスを当ててEnter)。

キーボードでも同様の事象が発生することが有りますが、この場合はキーボードのキーを押すことで、通常は正常に戻ります。