画像を検出する
本セクションでは、よくある画像一致の問題や、上述の最良の慣行を利用してキャプチャした画像に、作業を行う方法について説明します。
最もよく見られる画像一致の問題
最もよく見られる画像一致の問題と解決法は以下の通りです:
問題 |
解決法 |
画面の要素が、その画像をキャプチャしたときとは異なる状況となっている。 |
画像コレクションを使用して、複数の可能な状況で画像を検出します。 |
The element of the screen does not appear quickly enough, so that it appears after Eggplant Functional has completed a search for it. |
タイミングの問題を回避するには、最良の慣行を利用してください。 |
Multiple instances of the same image are appearing on the screen, and Eggplant Functional is interacting with the wrong one. |
EveryImageLocation()ファンクションを使用するか、画面の特定部分を検索してください。これらのアプローチは両方とも、同一画像の複数インスタンスに対処するで説明されています。 |
画面の要素が、その画像をキャプチャしたときとは異なるサイズで表示される。原因としては、作成に使用したSUTとは異なるSUTに対してテストを実行している、またはSUTの解像度を変更したことが考えられます。 |
画像スケーリングを使用して画像を検索してください。 |
複数の可能な状況で画像を検出する
スクリプトを作成する場合は、SUT上の画像がキャプチャ後も同じままであるとは、必ずしも言い切れません。例えば、ウィンドウの閉じるボタンをクリックする場合は、そのウィンドウはアクティブな状態もしれませんし、そうではないかもしれません。Windowsでは、ウィンドウがアクティブであるかどうかにより、閉じるボタンは赤またはグレーで表示されます。
このような状況に対処するため、画像コレクションを作成可能です。An Image Collection allows Eggplant Functional to search for more than one image with a single image search. そしてコードの同一ラインを、コレクション内に存在するどの画像にも実行可能です。This is part of what gives Eggplant Functional the unique ability to run the same script across multiple browsers, platforms, and/or devices.
タイミングの問題を回避する
何度も実行に成功していたスクリプトが突然、ビューアウィンドウ内で画像を検出できないとレポートするという事態が時々起こります。大抵の場合これは、画像認識の問題ではなくタイミングの問題です。
タイミングの問題であるかどうかを、すぐに判定できるテストがあります:失敗したラインをを選択して、スクリプトエディタ内のRun Selection(セレクションを実行)ボタンをクリックします。If the line runs successfully, then it is likely that Eggplant Functional tried to search for the image before it became visible on the screen. これがタイミングの問題です。If the image is still not found, examine the Viewer window for changes in the image, or try changing the search type of your saved image.
This video shows how to write Eggplant Functional scripts that take advantage of the application's timing features to make searches more successful. More information on these features is provided below the video.
以下のヒントがタイミングの問題防止に役立つかもしれません:
WaitForコマンド
WaitForコマンドは、指定した画像が見つかるまでスクリプトの次のラインを遅延します。前のステップで新しいアプリケーション、またはウェブページを開く場合に有用です。(すでに開いているアプリケーションの別の部分を開く場合には、通常必要ありません。)
例:WaitForコマンドの使用
Click "SaveAs"
WaitFor 5, "SaveDialog"
//Waits for up to 5 seconds for SaveDialog.
TypeText "FileName"
この例では、スクリプトはタイプを試行する前に、最長5秒間Save(保存)ダイアログが開くのを待ちます。(5秒以内に保存ダイアログが表示されない場合、スクリプトは失敗します。)
WaitForでの待機時間は長めにとってください。正確な待機時間を試す/予測する必要はありません。スクリプトは画像が見つかると即座に先に進むため、成功の際は時間が無駄になることはありません。有用な経験則としては、ユーザが待機するのに合理的と思われる最長の時間をMaxWaitに設定します。それでも時間が足りない場合は、おそらくアプリケーションに問題があると思われます。
WaitFor対Wait
Waitコマンドは、時間パラメータで指定される期間スクリプトを一時停止させます:(数字のみの場合は秒を表し、用語minutesおよびmillisecondsも使用可能。)
During the Wait command, Eggplant Functional does nothing. これはスクリプトをある時点で単に一時停止したい場合に有用ですが、SUT上で何かが起こるのを待つ場合には、WaitForコマンドを利用するほうが信頼度が高い(また潜在的に早い)可能性があります。
WaitForコマンドを使用する場合に指定する時間は最長時間であり、絶対時間ではありません。最長時間前に画像が見つかると、スクリプトは即座に続行されます。
例:WaitコマンドとWaitForコマンドの比較
Wait 8
// Pauses the script for 8 seconds.
WaitFor 8.0,"OK Button"
// Pauses the script until the image is found, up to 8 seconds.
リモート動作間隔
If you are having frequent, random timing problems with a SUT, you might need to slow Eggplant Functional down a little. You can do this by increasing the Remote Work Interval, the time Eggplant Functional waits between commands sent to the SUT. 2通りの方法があります:実行オプション設定でリモート動作間隔を変更します。またはRemoteWorkIntervalグローバルプロパティを設定します。
Remote Work Interval Preference
ほとんどのSUTでタイミングの問題が頻発する場合は、実行オプション設定でデフォルトのリモート動作間隔を変更してください。
- Select eggPlant > Preferences > Run > System.
- Remote Work Interval(リモート動作間隔)を少し増やします。10分の1秒か2秒で十分に変化があると思われます。
The RemoteWorkInterval Global Property
特定のスクリプト(またはスクリプトの一部)でのみSUTを遅くする必要がある場合は、ケースバイケースでRemoteWorkIntervalグローバルプロパティを設定してみてください。
例:RemoteWorkIntervalの変更
add .1 to the remoteWorkInterval
subtract .1 from the remoteWorkInterval
setOption remoteWorkInterval, .1
画像検索時間
Image Search Time is the approximate maximum time Eggplant Functional can search for an image before reporting a failure; however, the actual time it takes for a successful search might well be much less because when it finds the image, the search stops. つまり画像検索時間の制限値に達するのは、画像が見つからない場合のみです。
デフォルトの画像検索時間値は、実行オプション設定で変更できます。またはケースバイケースで、スクリプト内でImageSearchTimeグローバルプロパティを使用して変更できます。画像検索時間の設定値が高すぎると、画像が見つからない場合にスクリプト実行が非常に長くなりますので、注意してください。
Image Search Time = (Search Delay) * (Search Count - 1)
画像検索時間プリファレンス
画像検索時間が一貫して低すぎる場合は、実行オプション設定でデフォルト値を変更可能です。(プリファレンスとして画像検索時間を増やすと 条件付きブロックが長時間かかる副作用が生じます。)
- Select eggPlant > Preferences > Run > Screen.
- 画像検索時間を増やすときは、2分の1秒以下の微増にとどめてください。
ImageSearchTimeグローバルプロパティ
画像検索時間を一時的に増やす必要がある場合(通常、最良のオプションです)、ImageSearchTimeグローバルプロパティを必要に応じて設定可能です。
例:一時的なImageSearchTime()の変更
put getOption (ImageSearchTime) into IST
// Stores the starting ImageSearchTime value.
set the ImageSearchTime to 2
// Changes the ImageSearchTime value.
(*Proceed with the script here, then...*)
setOption ImageSearchTime, IST
// Restores the starting ImageSearchTime value.
同一画像の複数インスタンスに対処する
同一画像が画面上の複数個所に現れた場合は、どれが望ましいかを指定する方法が必要となります。これを行うにはいくつかのアプローチがあり、どれを選ぶかは状況により異なります。これらの方法の一部を以下で説明します。
Use a Relative Hot Spot
The hot spot associated with an image is a movable point, and it does not need to stay within the bounds of the image capture.
デスクトップ上のフォルダを検索する場合、EveryImageLocation()を使用する、もしくはsearchRectangleを指定する代わりに、フォルダの標識の画像をキャプチャして、その標識に相対するフォルダのロケーションへとホットスポットを移動します。標識が固有であるならば、これがフォルダアイコンとインタラクションする最も簡単な方法となります。
For more information, see Using the Hot Spot.
EveryImageLocation()を使用する
EveryImageLocation()ファンクションは、画面上の画像一致の全インスタンスのリストを返します。これは、画面上に画像インスタンスがいくつあるかを判定するのに利用できます。またはすべてを検出して、インタラクション対象の特定画像インスタンスを指定できます。
Since Eggplant Functional searches the screen of the SUT from the top left corner to the bottom right corner as if it is reading English text, that is the order in which the images will be listed in the result of the EveryImageLocation() function.
例えば、画面上に複数の画像インスタンスがあり、常に3番目のインスタンスとインタラクトすると分かっている場合、以下のようなコードを使用可能です:
Put EveryImageLocation("MyImage") into FoundImages
Click item 3 of FoundImages
Searching Part of the Screen
SearchRectangleグローバルプロパティを設定して、画面の一部を検索可能です。
SearchRectangleグローバルプロパティには画面座標が2組必要です。これらのポイントで検索エリアの2つの対角を定義します。(画面の左上隅は0,0です。)
以下のスクリプト例では、アクティブなウィンドウでCustomize(カスタマイズ)ボタン(交差するハンマーとレンチ)をクリックすることを目的としています。アクティブなウィンドウのカスタマイズボタンはその他のウィンドウのカスタマイズボタンと見かけが同じであるため、検出される“Customize(カスタマイズ)”画像が正しいものか区別が難しいですが、アクティブなウィンドウの左上角の閉じるボタンは赤いので見分けられます。(It is colorless in background windows.) If you make the red Close button the top-left corner of your search rectangle, Eggplant Functional (searching left-to-right, top-to-bottom) surely finds the Customize button on the same window first.
例:検索用長方形を調整する
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
画像スケーリング
デフォルトでは、すべての画像がネイティブ解像度(1.0のスケール)で検出されます。これは、the defaultScaleグローバルプロパティを設定するとオーバーライドできます。
画像検索により、単一画像をインラインでスケール可能です。インラインで画像スケールする方法は3通りあります:
係数スケーリング
この画像スケーリング方法では、Scaleパラメータを使用して、そのオリジナルサイズの係数で画像をスケールします。これを行うには、任意の画像検索でScaleパラメータを設定します。例えば、以下の例のように、Clickコマンド使用することが可能です。
例:係数スケーリング
Click (image: "OK_button", scale: 0.5) -- Looks for the image at 50% scale
Click (image: "OK_button", scale: (0.5, 1.0, 1.5)) -- Looks for the image at all 3 sizes
Click (image: "OK_button", scale: 0.5 to 1.5 by .25) -- Looks for that range of sizes, incrementing by .25 (.5, .75, 1.0, 1.25, 1.5)
注:画像スケーリングが指定のインラインである場合は、Imageパラメータを使用しなければなりません。
defaultScaleグローバルプロパティが設定されている場合は、これが優先されます。
特定の画像検索によるカスタムスケールに加えてdefaultScaleを使用する場合、以下の例のように類似のコードを使用可能です。
例:defaultScaleをカスタムスケール検索とともに使用
Click (image: "OK_button", scale: (0.5, 1.0, "Default"))
-- Looks for the image at half-size, regular-size and the current "default" size
スケール係数を判定する
一部のケースでは、あるデバイスから別のデバイスに移動する場合、またはSUT上の要素のサイズを変更する(Mac Dockに対するテストなど)場合に、スケール係数が何であるか分かりづらいことがあります 。
このようなシナリオに対処するには、(上述の係数スケーリングの例のように)一定範囲のスケール係数で始めて、ある程度追加情報を得てから、foundImageInfo()ファンクションを利用して、どの係数が正しいかを判定することが可能です。画像が検出されたときのスケール係数は、foundImageInfo()ファンクションにより返される結果に記録されます。
例:画像検出の際のスケール係数を決定
Click "OK_Button"
Log foundImageInfo(). Scale -- Logs the scale at which the image was found
サイズ指定スケーリング
この画像スケーリング方法では、scaleToSizeパラメータを利用して、新規画像に特定のサイズを指定できます。これを行うには、任意の画像検索でscaleToSizeパラメータを設定します。例えば、MoveToコマンドをimageLocation()ファンクションの一部として使用することが可能です。
例:サイズ指定スケーリング
MoveTo imageLocation(Image:"anImage", scaleToSize:(300,100))
ダイナミックスケーリング
Starting in Eggplant Functional v12.20, Eggplant Functional records the screen size of the SUT (System Under Test) at the time of image capture. この記録されたサイズは、キャプチャ時のSUTの画面サイズと画像検索時のSUTの画面サイズとの差を基に、画像を自動的にスケールするのに使用されます。
これを行うには、ProportionalまたはStretchパラメータのいずれかを指定可能です。これらはどちらも、画像を元のキャプチャサイズで検索しません。
- Proportional:画像は両方向(幅と高さ)とも同一にスケールされ、その比率が維持されます。最小のSUTの高さ/幅変更に比例するようスケールされますので、SUTの画面サイズの一方向での変更が他方向より大きい場合は、小さい方の変更に従い画像がスケールされます。
- Stretch:画像は両方向(幅と高さ)にスケールされますので、必ずしも元のキャプチャ画像と同じ比率にはなりません。
例:ダイナミックスケーリング
Click (image: "OK_button", scale: ("Proportional", 1.0, 1.5))
-- Looks for the image at all 3 sizes.
画像回転
本来キャプチャしたのとは異なる角度で画像が表示されると予測される場合、画像検索で回転パラメータを設定可能です。
以下は、RotateパラメータをClickコマンドとともに使用した例です。
例:
Click (name: "appIcon", rotate: 180)
-- Searches for appIcon at 180 degrees from its original angle
Click (name: "appIcon", rotate: 45 to 90 by 5)
-- Searches for appIcon tilted 45 to 90 degrees, in 5 degree increments