メインコンテンツまでスキップ

ダイナミックサーチ矩形

GUIには多数の同一のUI要素がありますが、これらの要素の特定のインスタンスのみを操作する必要がある場合があります。例えば、ファイルツリーでは、特定のフォルダに属する特定のノードを操作することが重要である一方で、ツリー内の他のノードに干渉しないことが重要です。

Windowsのファイルツリー構造。eggPlant Functionalが操作したいかもしれません。

テストシナリオとしては、Windows Explorerのファイルツリーを使用してフォルダC:\Program Files (x86)\Adobe\Reader 11.0\Resource\SaslPrepに移動することが考えられます。フォルダ名、フォルダアイコン、ノードアイコンの間の距離はしばしば固定ではないため、参照イメージはユニークなフォルダ名のみに限定することが重要です。たとえこの距離が固定であったとしても、ファイルパス内の各フォルダについて2つのイメージをキャプチャする必要があります:1つはノードが開いているとき用、もう1つはノードが閉じているとき用です。これにより、テストが意図せずにノードを開閉することを防ぎます。

このシナリオでは、ファイルパスが6つのフォルダを含んでいるため、2 x 6個のイメージ、合計12個のイメージが必要となります。

例:ユースケースシナリオ

以下は、ダイナミックサーチ矩形を使用した戦略で、指定されたファイルパスに従ってフォルダを開く効率的で再利用可能なコードを作成することができます。この戦略では、各フォルダのイメージを1つだけ、そして2つのノード状態の各イメージをキャプチャすることが可能なため、スイートに必要なイメージの総数が減り、メンテナンスが軽減されます。

このダイナミックサーチ矩形戦略では、必要なのは6 + (2 x 1)のイメージ、つまり合計8つのイメージだけです。ファイルパスが長く、テストに含まれるファイルパスが多いほど、この方法を使用することでイメージのキャプチャにかかる労力が節約されます。

始める前に、SenseTalkのPoints and Rectanglesセクションについて理解を深めてください。

以下に、イメージと矩形関数を使用した例をいくつか示します。

ノードがイメージキャプチャのためにハイライト表示されたWindowsファイル構造。

イメージ検索はキャプチャされたイメージ矩形(青)に基づきますが、最終的にコードが操作する要素はダイナミックアイコン(オレンジ)です。ダイナミックアイコンはキャプチャされたイメージ矩形に対して相対的に同じ位置に表示されます。

put imageRectangle(FolderName) into myRectangle

set imageLeft = left (myRectangle)

set imageTop = top(myRectangle)

set StartLeft = imageLeft - 35

set UL = (StartLeft, imageTop)

set BR = (imageLeft, imageBottom)

set the SearchRectangle to (UL,BR)

上記の例では、SearchRectangleは追加のコードで変更されるまで、すべての後続のコードに対して(UL,BR)に設定されます(グローバルプロパティとして)。

set the SearchRectangle to () -- set the SearchRectangle to full screen

または、SearchRectangleを特定のイメージ検索に設定することも可能です。以下にその例を示します。

If imageFound(ImageName:"NodeClosed", SearchRectangle:(UL,BR))
then
Do Action && foundImageLocation()
else if imageFound(ImageName:"NodeOpen", SearchRectangle:(UL, BR))
log FolderName && "Already Open."
else
log "Highest Folder Level Reached."
end if

ここに、“Nodes”というノード開放スクリプトがあります。これは変数とパラメータの両方を使用しており、ジェネリックで再利用可能なスクリプトになっています:

Put imageRectangle("FirefoxIcon") into myRectangle
-- 画像の四角形の左上と右下の座標をmyRectangle変数に保存します
Set imageTop = top(myRectangle)
-- "imageTop"変数をmyRectangle変数の左上のy座標として設定します
Set imageRight = right(myRectangle)
-- "imageRight"変数を右下のx座標として設定します

これらの関数は、一つの参照画像に基づいた動的な検索矩形を作成するスクリプトで使用できます。

  1. 各フォルダ名の画像をキャプチャします(青)
    • “LocalDisk”
    • “ProgramFilesx86”
    • “Adobe”
    • “Reader11”
    • “Resource”
    • “SaslPrep”
  2. 各ノードの状態の画像をキャプチャします(オレンジ)
    • “NodeOpen”
    • “NodeClosed”

キャプチャした画像の矩形の隣に動的な検索矩形を示す図。

キャプチャした画像の矩形の隣に動的な検索矩形を示す図。

以下のコードでは、A = 35ピクセルとして、キャプチャした画像の四角形(青)に基づいたSearchRectangleが設定されます。

FolderNameは、キャプチャした画像の四角形(青)の名前を含む変数です。FolderNameのような変数を使用すると、スクリプトはより一般的になり、したがって、再利用可能になります。

//以下のコードは、初期化されたフォルダ名のノードを開きます(ノードが既に開かれていない場合)。
//TargetFolderが見つかった場合、最上位フォルダレベルに達した場合にメッセージを記録します。

params FolderName, Action, TargetFolder
If imageFound(FolderName)
then
put imageRectangle(FolderName) into myRectangle
set imageLeft = left(myRectangle)
set imageTop = top(myRectangle)
set imageBottom = bottom(myRectangle)
set StartLeft = ImageLeft - 35
set UL = (StartLeft, imageTop)
set BR = (imageLeft, imageBottom)
if imageFound(ImageName:"NodeClosed", SearchRectangle:(UL, BR))
then
Do Action && foundImageLocation()
else if imageFound(ImageName:"NodeOpen", SearchRectangle:(UL,BR))
then
log folderName && "既に開かれています"
else
log "最上位フォルダレベルに到達しました"
end if
else
log folderName && "見つかりません"
end if

if imagefound(folderName) and if TargetFolder
then
log "Target Folder" && FolderName && "が開かれました。"
end if

以下は、ツリー内の各フォルダに対してノードを開くスクリプト、Nodes、を呼び出すマスタースクリプトです。最初に開かれるべきフォルダ、LocalDiskから始まります。三番目のパラメータがオプションであることに注意してください。

Nodes "LocalDisk", Click

Nodes "ProgramFilesx86", Click

Nodes "Adobe", Click

Nodes "Resource", Click

Nodes "SaslPrep", Click, YES

CallNodesスクリプトの完全な形:

Nodes.TreeNav "LocalDisk", Click
Nodes.TreeNav "ProgramFilesx86", Click
Nodes.TreeNav "Adobe", Click
Nodes.TreeNav "Reader11", Click
Nodes.TreeNav "Resource", Click
Nodes.TreeNav "SaslPrep", Click, YES

Nodesスクリプトの完全な形:

// 指定されたフォルダ名のノードを開きます(ノードが既に開かれていない場合)。
// TargetFolderが見つかった場合、最上位フォルダレベルに達した場合にメッセージを記録します。

params FolderName, Action, TargetFolder

If imagefound (FolderName)
then
put ImageRectangle(FolderName) into myRectangle
set ImageLeft = left(myRectangle)
set ImageTop = top(myRectangle)
set ImageBottom = bottom(myRectangle)
set StartLeft = ImageLeft - 35 -- 必要に応じてピクセル数を調整してください
set UL = (StartLeft,ImageTop)
set BR = (ImageLeft,ImageBottom)
If imagefound(ImageName:"NodeClosed", SearchRectangle:(UL, BR))
then
Do Action && foundimagelocation()
else if imagefound(ImageName:"NodeOpen", SearchRectangle:(UL, BR))
log FolderName && "Already Open."
else
log "Highest Folder Level Reached."
end if
else
log FolderName && "Not Found."
end if
If imagefound (FolderName) and if TargetFolder
then
log "Target Folder" && FolderName && "Opened."
end if
end if