セレクター式

Shiratesの セレクター式 は画面要素をフィルターするための式です。

select関数はセレクター式を受け取り、解析し、要素を取得してフィルターし、結果を返します。

セレクター式は1つ以上の filter expressions から構成されます。

it.select("#id1")    // idフィルター

it.select("@accessibility1") // accessibilityフィルター

it.select(".android.widget.ImageButton")    // classフィルター

it.select("text1")  // textフィルター

it.select("xpath=//*[@resource-id='android:id/icon']")  // xpathフィルター

it.select("Hello&&.android.widget.TextView")    // textフィルターとclassフィルターを"&&"(and)演算子で結合

it.select("About phone||About emulated device") // textフィルターを"||"(or)演算子で結合

フィルター式

Shiratesの フィルター式 は画面要素をフィルターするための条件を記述するための式です。

フィルター 完全形 短縮形 Androidの属性 iOSの属性 備考
text text=text1 text1 text label
textStartsWith textStartsWith=text1 text1* text label
textContains textContains=text1 *text1* text label
textEndsWith textEndsWith=text1 *text1 text label
textMatches textMatches=^text$ n/a text label
literal literal=literal1 ‘literal1’ text label
id id=id1 #id1 resource-id name
access access=access1 @access1 content-desc name
accessStartsWith accessStartsWith=access1 @access1* content-desc name
accessContains accessContains=access1 @*access1* content-desc name
accessEndsWith accessEndsWith=access1 @*access1 content-desc name
accessMatches accessMatches=^access1$ n/a content-desc name
value value=value1 n/a text value
valueStartsWith valueStartsWith=value1 n/a text value
valueContains valueContains=value1 n/a text value
valueEndsWith valueEndsWith=value1 n/a text value
valueMatches valueMatches=^value1$ n/a text value
class class=class1 .class1 class type
focusable focusable=true n/a focusable n/a
scrollable scrollable=true n/a scrollable n/a
selected selected=true n/a selected n/a
visible visible=true n/a n/a visible ※非推奨
xpath xpath=//*[@text=‘text1’] n/a (任意の属性) (任意の属性)
pos pos=2 [2] n/a n/a
ignoreTypes ignoreTypes=Class1,Class2 n/a class type
image image=image1.png image1.png n/a n/a
capturable capturable=?? ?? n/a n/a

※iOSのvisible属性は要素が画面に表示されているかどうかの判定には利用できないので非推奨です。

フィルターにおける複数値の指定

フィルターは括弧と"|"(or)演算子を使用して複数の値を指定できます。

it.select("text=(text1|text2)") // 完全形

it.select("(text1|text2)")  // 短縮形

以下のセレクター式はシンプルですが上記と等価です。

it.select("text1||text2")   // 上記と等価なセレクター式

この場合、フィルターによるor表現を使用しても、セレクターによるor表現を使用しても結果は同じです。

さらに複雑な状況では"|"を使用することが必要になる場合があります。

it.select("(text1|text2)&&.class1||(@access1|@access2)&&.class2)")

セレクター式のルール

フィルター式は単独でセレクター式として使用できます。

text1

フィルター式は"&&"(AND)演算子で結合することができます。

text1&&.class1&&visible=true

フィルター式は"||"(OR)演算子で結合することができます。

text1||text2||@access1

“&&” は “||” より優先されます。

text1&&.class1||@access1

上記は(text=text1 かつ class=class1) または access=access1 という意味になります。

以下のように括弧を使用することはできません(サポートしていません)。

悪い例

(text1&&.class1)||@access1

完全修飾id

Androidではresource-id はアプリのパッケージ名がプレフィックスになっています。例えば設定アプリでは"com.android.settings"の部分がパッケージ名です。

完全修飾形 省略形
com.android.settings:id/search_bar search_bar

Shiratesでは省略形で記述すると完全修飾形に自動で変換されます。可読性が高くなるので省略形の使用が推奨されます。省略形でうまく行かない場合は完全修飾形を使用します。

セレクター式のプラットフォームアノテーション

プラットフォームアノテーション (@a, @i)を使用してAndroid用のセレクター式とiOS用のセレクター式を1行で記述することができます。

@a<.android.widget.ImageButton>,@i<.XCUIElementTypeButton>
it.select("@a<.android.widget.ImageButton>,@i<.XCUIElementTypeButton>")

このアノテーションを使用することでニックネームをAndroidとiOSそれぞれに対して定義することができます。

"[Button1]": "@a<.android.widget.ImageButton>,@i<.XCUIElementTypeButton>"

否定フィルター

複雑な状況においては否定フィルターを使用することができます。

text=text1      // 通常
text!=text1     // 否定

text1       // 通常
!text1      // 否定

accessContains=text1    // 通常
accessContains!=text1   // 否定

@*text1*    // 通常
!@*text1*   // 否定

画像フィルター

画像ファイルを使用して画像マッチング(テンプレートマッチング)を行うことができます。 参照 画像の検証

image=image1.png    // 完全形
image1.png          // 省略形
image1.png?scale=0.5&threshold=20   // オプション付き(完全形)
image1.png?s=0.5&t=20   // オプション付き(省略形)

キャプチャ可能性フィルター(メタフィルター)

アプリの実装によっては画面上に表示されているにもかかわらず、対応する要素を取得できないことがあります。 例えば画面上に表示されている画像に対応する要素がAndroidでは取得できるが、iOSでは取得できない場合があります。 この場合、キャプチャ可能性フィルターを使用することでiOSでは要素がキャプチャできないことを明示的に表現できます。

it.existImage("@a<.android.widget.ImageButton>,@i<??>")

この例ではAndroidにおいては.android.widget.ImageButtonで要素を検索し、画像テンプレートによるマッチングを行いますが、 iOSにおいては要素検索と画像マッチングを行わず、検証結果は手動テストが必要であることを示すCOND_AUTOになります。

Link