画像の検索
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
画面の一部を検索する
画面の一部を検索するには、the SearchRectangle
グローバルプロパティを設定します。
The SearchRectangle
グローバルプロパティは、パラメータとして画面の座標の2組を取り、これらの点は検索領域の対角線上の角を定義します。 (画面の左上角は0,0です。)
以下に示すサンプルスクリプトの目的は、アクティブなウィンドウのカスタマイズボタン(ハンマーとレンチが交差)をクリックすることです。アクティブなウィンドウのカスタマイズボタンは他のウィンドウのカスタマイズボタンと同一であるため、見つけた「カスタマイズ」画像が正しいものである保証はありません。しかし、アクティブなウィンドウの左上角にある赤い閉じるボタンは一意です。(背景のウィンドウでは色がありません。)赤い閉じるボタンを検索矩形の左上の角にすると、Eggplant Functional(左から右、上から下に検索)は必ず同じウィンドウのカスタマイズボタンを最初に見つけます。
例:検索矩形の調整
put ImageLocation("CloseButton") into UpperLeft
put RemoteScreenSize() into LowerRight
Set the SearchRectangle to (UpperLeft, LowerRight)
Click "Customize"
Set the SearchRectangle to ()
-- Restores the search rectangle to the full SUT screen
画像のスケーリング
デフォルトでは、Eggplant Functionalはすべ ての画像をそのネイティブ解像度(スケール1.0)で検索します。ターゲット画像を検索するスケールを変更する方法はいくつかあります。これを行う最も一般的な方法は、スケールファクターを設定することです。スケーリングには、サイズに応じたスケーリングやダイナミックスケーリングなどの代替手段もあります。
ファクターによるスケーリング
画像のスケーリングに最も一般的に使用される方法は、画像のオリジナルキャプチャサイズの乗数を使用します。Scale
パラメータを設定することでスクリプト内の画像検索と連動して、またはthe scaleFactors
グローバルプロパティを設定することでスクリプトレベルで、またはそのスイートのSettingsタブでスイート全体のスケールファクターを設定することで、画像のスケールファクターをさまざまなレベルで調整できます。スクリプトが実行されると、the scaleFactors
グローバルプロパティの初期値は、スイートウィンドウの左下角にあるSettingsをクリックすることでアクセスできる、スイートの設定のScale Factorsフィールドに提供された値に設定されます。このフィールドは、Image Viewerで設定された画像のスケールよりも優先されますが、the ScaleFactors
グローバルプロパティおよびスクリプト内の画像とともに定義された任意のScaleプロパティによって上書きされます。
例: 画像検索時の因子に よるスケーリング
Click {image: "OK_button", scale: 0.5)} -- 画像を50%のスケールで検索します
Click {image: "OK_button", scale: (0.5, 1.0, 1.5)} -- 画像を指定された順序で3つのサイズすべてで検索します
Click {image: "OK_button", scale: 0.5 to 1.5 by .25} -- 指定された範囲のサイズを、.25ずつ増加しながら検索します(.5, .75, 1.0, 1.25, 1.5)
注意: 画像のスケーリングがインラインで指定されている場合、Image
パラメータを使用する必要があります。 the scaleFactors
グローバルプロパティが設定されている場合、これが上書きされます。
スケール因子の決定
一部のケースでは、デバイス間で移動する際やSUT上の要素のサイズを変更する際に、スケール因子が何であるかを判断するのが難しい場合があります(このような使用例の一つは、MacのDockに対するテストです)。
このようなシナリオに対応するために、因子によるスケーリングの例で示したように、スケール因子の範囲から始め、foundImageInfo関数を使用して正しい因子が何であったかを決定するための追加情報を取得することができます。画像が見つかった最初のスケール因子は、foundImageInfo
関数によって返される結果に記録されます。
例: 画像が見つかったスケール因子の決定。
Click {image:"OK_Button", scale: 0.5..1.5 by 0.25}
Log foundImageInfo().Scale -- 画像が見つかったスケールをログに記録します
スケールが1以外で検索が行われ、画像検索タイプが背景に寛容な場合、Eggplant Functionalはスクリプトの実行時に検索タイプをテキスト用のスムーズに自動的に変更します。
代替のスケーリング方法
因子によるスケーリングは、Eggplant Functionalで画像のスケーリングを行う最も一般的な方法ですがこれらの代替的なスケーリング技術が特定の状況でより適切な解決策となる可能性があります。たとえば、サイズにスケーリングすると、 非比例的にスケーリングすることが可能になりますし、動的スケーリングでは、オリジナルキャプチャ時のSUTスクリーンの寸法に基づいて検索スケールを設定することが可能になります。
サイズにスケーリングする
この画像のスケーリング方法では、scaleToSize
パラメータを使用して新しい画像の特定のサイズを指定できます。これを行うには、任意の画像検索でscaleToSize
パラメータを設定します。たとえば、imageLocation
関数の一部としてMoveToコマンドとともに使用することができます。
例: サイズにスケーリングする
MoveTo imageLocation(Image:"anImage", scaleToSize:[300,100])
注意: この例では、新しい寸法がオリジナルの画像キャプチャと比例していない場合、画像の寸法が変わる可能性があり、その結果、画像が歪んで表示される可能性があります。
SUTスクリーンサイズに基づく動的スケーリング
Eggplant Functionalは、画像キャプチャ時のSUT(System Under Test)の画面サイズを記録します。この記録されたサイズは、画像検索時のSUTの画面サイズと、画像キャプチャ時のSUTの画面サイズとの差に基づいて画像を自動的にスケーリングするために使用することができます。
これを行うためには、Proportional
またはStretch
パラメータを指定することができます。どちらも、画像をそのオリジナルのキャプチャサイズで検索することはありません。
Proportional:
画像は両方向(幅と高さ)で同じ量をスケールし、比例を保ちます。SUTの高さまたは幅の最小の変化に比例してスケールしますので、SUTの画面サイズが一方の次元で他方よりも大きく変化していた場合、この画像はより小さい差に従ってスケールします。Stretch:
画像は両方向(幅と高さ)でスケールし、必ずしもオリジナルのキャプチャ画像と同じ比例を保つわけではありません。
例: 動的スケーリング
Click {image: "OK_button", scale: ["Proportional", 1.0, 1.5]}
-- 3つのすべてのサイズで画像を検索します。
Eggplant Functionalにオリジナルのキャプチャサイズで画像を検索させるためには、スケールに1を含める必要があります。
画像の回転
画像が元々キャプチャされた角度とは異なる角度で表示されると予想される場合、画像検索に回転パラメータを設定できます。
以下の例は、ClickコマンドとともにRotate
パラメータを使用する方法を示しています。
例:
Click {name: "appIcon", rotate: 180}
-- オリジナルの角度から180度でappIconを検索します
Click {name: "appIcon", rotate: 45 to 90 by 5}
-- 5度のインクリメントで45度から90度に傾いたappIconを検索します