画像の検索
Eggplant Functionalは画像ベースのテストツールであり、あなたがテストを作成する際にキャプチャする画像に大いに依存しています。最も信頼性の高い画像は、画像キャプチャのベストプラクティスを使用してキャプチャしたものとなります。
このセクションでは、一般的な画像マッチング問題と、上記のベストプラクティスを使用して既にキャプチャされた画像をどのように扱うかについて説明します。
最も一般的な画像マッチング問題
最も一般的な画像マッチング問題とその解決策は次の通りです:
### 問題 | ### 解決策 |
---|---|
画面の要素が、その画像がキャプチャされたときと異なる状態になっています。 | 複数の可能な状態を持つ画像を見つけるた めに、画像コレクションを使用します。 |
画面の要素が十分に早く表示されず、Eggplant Functionalがそれを検索した後に表示されます。 | タイミング問題を避けるためのベストプラクティスを使用します。 |
同じ画像の複数のインスタンスが画面に表示され、Eggplant Functionalが間違ったものと対話しています。 | EveryImageLocation()関数を使用するか、画面の特定の部分を検索します。これらのアプローチは、同じ画像の複数のインスタンスを扱う方法で説明されています。 |
画面の要素が、画像がキャプチャされたときと異なるサイズで表示されています。これは、モバイルアプリケーションでのクロスデバイステストのように、テストが作成時に使用したSUTと異なるSUTに対して実行されている場合、またはSUTの解像度が変更された場合などの理由で生じる可能性があります。 | Adaptive to Image検索タイプ、Image Scaling、または両方を使用して画像を検索します。 |
複数の可能な状態を持つ画像の検索
スクリプティングを行っているとき、SUT上の画像があなたがそれらをキャプチャした後も同じままであることを常に期待することはできません。たとえば、ウィンドウの閉じるボタンをクリックしたい場合、そのウィンドウがアクティブな状態であるかどうかは定かではありません。Windowsでは、ウィンドウがアクティブかどうかによって、閉じるボタンが赤く表示されるか灰色に表示されるかが変わります。
このような状況に対応するためには、画像コレクションを作成することができます。画像コレクションを使用すると、Eggplant Functionalは単一の画像検索で複数の画像を検索することができます。その後、コレクション内のどの画像が存在しているかに関係なく、同じコード行を実行することができます。これはEggplant Functionalが同じスクリプトを複数のブラウザ、プラットフォーム、デバイス間で実行することができるユニークな能力の一部です。
タイミング問題を避ける方法
スクリプトが何度も成功した後に突然、Viewerウィンドウで画像が見つからないと報告することがあります。これは、画像認識の問題ではなく、タイミングの問題であることがほとんどです。
タイミング問題かどうかを判断する簡単なテストがあります:失敗した行を選択し、スクリプトエディターの「選択した行を実行」ボタンをクリックします。行が正常に実行された場合、Eggplant Functionalが画像が画面に表示される前に画像を検索しようとした可能性が高いです。これはタイミングの問題です。画像がまだ見つからない場合は、画像に変更がないかViewerウィンドウを確認するか、保存した画像の検索タイプを変更してみてください。
以下のヒントは、タイミング問題の防止に役立つでしょう:
WaitFor コマンド
WaitFor
コマンドは、指定した画像が見つかるまでスクリプトの次の行を実行しないようにします。これは、前のステップで新しいアプリケーションやウェブページを開くときに特に役立ちます。(すでに開いているアプリケーションの他の部分を開くときには通常必要ありません。)
例: WaitFor
コマンドの使用
Click "SaveAs"
WaitFor 5, "SaveDialog"
// SaveDialogが表示されるのを最大5秒間待ちます。
TypeText "FileName"
この例では、スクリプトはSaveダイアログが表示されるのを最大5秒間待ち、それから入力を試みます。(Saveダイアログが5秒以内に表示されない場合、スクリプトは失敗します。)
WaitFor
の時間を十分に設けることを心掛けてください。待ち時間を正確に予測しようとする必要はありません。スクリプトは画像が見つかったらすぐに進むので、成功時に時間を失うことはありません。良い経験則は、MaxWait
時間を合理的なユーザーが待つと思われる時間に設定することです。それが十分でない場合、おそらくアプリケーションの問題を見つけたということです。
WaitFor
では、searchRectangle
のような時間以外のプロパティを渡すこともできます:
WaitFor 2, {ImageName:"MyImage",searchRectangle:[0,0,1920,540]}
WaitFor vs. Wait
Wait
コマンドは、スクリプトを指定した時間だけ一時停止します:(数字だけの場合は秒を表し、minutes
やmilliseconds
といった単語も入力できます。)
Wait
コマンド中、Eggplant Functionalは何も行いません。特定のポイントでスクリプトを一時停止したいだけの場合に便利ですが、SUT上で何かが起こるのを待っている場合は、WaitFor
コマンドを使用した方が結果が信頼性があり(そして潜在的には速い)です。
WaitFor
コマンドを使用すると、指定する時間は「最大」時間であり、絶対的な時間ではありません。画像が最大時間前に表示されると、スクリプトはすぐに続行します。
例: Wait
コマンドとWaitFor
コマンドの比較
Wait 8
// スクリプトを8秒間一時停止します 。
WaitFor 8.0,"OK Button"
// 画像が見つかるまで、または最大8秒間スクリプトを一時停止します。
リモートワークインターバル
SUTで頻繁にランダムなタイミングの問題が発生している場合、Eggplant Functionalの動作を少し遅くする必要があるかもしれません。これは、コマンドがSUTに送信される間にEggplant Functionalが待機する時間、リモートワークインターバルを増やすことで行うことができます。これを行う方法は2つあります:実行オプションの設定でリモートワークインターバルを変更するか、またはthe RemoteWorkInterval
グローバルプロパティを設定します。
リモートワークインターバル設定
もしほとんどの
SUTで頻繁にタイミング問題が発生している場合は、実行オプションの設定でデフォルトのリモートワークインターバルを変更します。
- Eggplant> Preferences > Run > Systemを選択します。
- Remote Work Intervalを少しずつ増やします。一、二秒の増加が大きな違いをもたらすかもしれません。
RemoteWorkIntervalグローバルプロパティ
特定のスクリプト(またはスクリプトの一部)でSUTの動作を遅くする必要がある場合は、ケースバイケースでRemoteWorkIntervalグローバルプロパティを設定してみてください。
例:RemoteWorkInterval
の変更
add .1 to the remoteWorkInterval
subtract .1 from the remoteWorkInterval
setOption remoteWorkInterval, .1
画像検索時間
画像検索時間は、Eggplant Functionalが失敗を報告する前に画像を検索できるおおよその最大時間です。ただし、成功した
検索に要する実際の時間は、画像が見つかれば検索が停止するため、かなり短い可能性があります。つまり、画像が見つからない場合に限り、画像検索時間の制限に達します。
実行オプションの設定でデフォルトの画像検索時間の値を変更することも、the ImageSearchTime
グローバルプロパティを使用してスクリプト内でケースバイケースで変更することもできます。ただし、画像検索時間を高く設定しすぎると、画像が見つからない場合にスクリプトの実行時間が非常に長くなる可能性があるので注意してください。
画像検索時間を変更すると、検索回数と検索遅延の値も変更されます。逆もまた然りです。画像検索時間は常に、検索遅延と検索回数の値の1つ少ない値の積と等しくなります:
画像検索時間 = (検索遅延) * (検索回数 - 1)
画像検索時間の設定
もし画像検索時間が一貫して
短すぎる場合は、実行オプションの設定でデフォルト値を変更することができます。 (画像検索時間を設定として増やす副作用として、条件ブロックの処理に時間がかかります。)
- Eggplant > Preferences > Run > Screenを選択します。
- 画像検索時間を少しずつ増加します。半秒以上増やさないようにします。
ImageSearchTimeグローバルプロパティ
画像検索時間を一時的に(通常は最良のオプション)増加させる必要がある場合は、the ImageSearchTime
グローバルプロパティを必要に応じて設定できます。
例:ImageSearchTime
を一時的に変更する
put getOption (ImageSearchTime) into IST
// 開始時のImageSearchTime値を保存します。
set the ImageSearchTime to 2
// ImageSearchTime値を変更します。
(*ここでスクリプトを続け、その後...*)
setOption ImageSearchTime, IST
// 開始時のImageSearchTime値を復元します。
同一画像の複数インスタンスの操 作
同じ画像が画面上の複数の場所に表示されるとき、どの画像を必要とするかを指定する方法がしばしば必要となります。この対応方法にはいくつかの異なるアプローチがあり、どれを選択するかは状況によります。以下にいくつかの方法を説明します。
相対ホットスポットの使用
画像に関連付けられたホットスポット
は可動点であり、画像キャプチャの範囲内に留まる必要はありません。
デスクトップでフォルダを検索する場合、EveryImageLocation
を使用するかsearchRectangle
を指定する代わりに、フォルダのラベルの画像をキャプチャし、ホットスポットをそのラベルに対するフォルダの位置に移動します。ラベルが一意であると仮定すると、これはフォルダアイコンと対話する最も簡単な方法になります。
詳細は、ホットスポットの使用を参照してください。
EveryImageLocationの使用
EveryImageLocation
関数は、画面上の画像の全てのインスタンスの一覧を返します。これは画面上に画像のインスタンスがいくつあるかを決定したり、画像と対話する特定のインスタンスを指定するためにすべてのインスタンスを見つけるために使用できます。
Eggplant FunctionalはSUTの画面を英語のテキストを読むかのように左上の角から右下の角まで検索するため、それがEveryImageLocation
関数の結果にリストされる画像の順序になります。
例えば、画面上に画像の複数のインスタンスがあり、常に3番目のインスタンスと対話する必要があることがわかっている場合、このようなコードを使用するかもしれません:
Put EveryImageLocation("MyImage") into FoundImages
Click item 3 of FoundImages