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 | バージョン | 備考 |
|---|---|---|---|
| Firefox | Linux | 4 | 3.5は動作しません(将来サポートする予定です)。 |
| Firefox | Window XP | 3.6, 4 | |
| Chrome | Linux | 11 | |
| Chrome | Windows XP | 11 | |
| IE | Windows XP | 6, 7 | |
| IE | Windows 7 | 8 | TABの動作を変更する必要があります。 |
| 環境 | 詳細 | 備考 |
|---|---|---|
| Java実行環境 | java6が必要です | セキュリティポリシの変更を行う必要があります。 |
| Webサーバ | 確認済みのサーバは、Apache2.2 | 必ずローカルマシンかローカルネットワーク内に、Webサーバを用意してテストしてください。 |
| キーボード | キー配列が106か109 | 記号の入力で制限があります |
お使いの環境でJava Appletを動作させるためには、JavaのインストールとWebブラウザの設定が必要です(設定の不要な場合も有ります)。
下記URLからzipファイルをダウンロードしてください。
ダウンロード 2011/10/30 Update
ダウンロードしたzipファイルを解凍してください。以下のようなディレクトリ構成となります。
webtest/ +-com/ | +-yscjp/ | +-webtools/ | +-robot/ +-jslib/ | +-20110703/ | +-20110806/ +-robot.html
webtestディレクトリを、Webサーバがアクセスできる位置にコピーしてください。以降の説明は、ユーザディレクトリの直下にコピーした場合を想定しています。
public_html/ +-cgi-bin/ +-webtest/
http://localhost/~[ユーザID]/webtest/robot.htmlにアクセスすると、テスト画面が表示されしばらくしてJavaのコンソールが表示されます(コンソールを開く指定となっている場合)。Javaのコンソールが表示されない場合、Webブラウザの設定を見直してください。
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/に出力します。
単純にリンクをたどるサンプルです。同じ処理を3回繰り返し終了します。
フォームを操作するサンプルです。
環境によっては、正常に動作しない場合も有ります。
要素の各位置にマウスを移動するサンプルです。IE6では、正しく表示できないようです。
マウスドラッグで、要素を移動させるサンプルです。IE6では、正しく表示できないようです。
イベントキャプチャは、FireFox4でのみ実行できます。
コンテンツURLに"index1.html"と入力し、読み込みボタンをクリックしてください。Window(または新しいタブ)がオープンし、index1.htmlがロードされます。"リンク先が存在する"をクリックし、ページが遷移した時点で再び"リンク先が存在する"をクリックしてください。
Robotでテスト画面で、キャプチャの終了をクリックし、キャプチャ結果の実行をクリックします。キャプチャしたイベントが再現できれば成功です。この時、キャプチャの終了をクリックする前に、オープンしたWindow(またはタブ)を閉じるとエラーとなってしまいます。
現時点のバージョンでは、キャプチャしたとおりにイベントが再現できるのは、単純なマウスクリックだけです。特にキーボードからの入力は、殆ど思ったとおりになりません。
また、キャプチャの結果にjsRobot.mouseXXXXPress()やjsRobot.mouseXXXXRelease()がある場合は注意してください。
jsRobot.mouseXXXXPress()のあと何らかの理由によりjsRobot.mouseXXXXRelease()が発行出来なかった場合、デスクトップ上でマウスの操作が出来なくなる危険性が有ります。この様な事象は起きたときには、キーボードを使うなどして「Robotでテスト」画面を表示し、“マウスボタンリリース”ボタンを押下してください(Tabキーでフォーカスを当ててEnter)。
キーボードでも同様の事象が発生することが有りますが、この場合はキーボードのキーを押すことで、通常は正常に戻ります。