RanoreXPath の例
この章では、特定のシナリオにおける RanoreXPath 式の詳細な例を説明します。
スクリーンキャスト
以下のスクリーンキャストで、この章で説明している内容を確認できます。
テストの定義
このセクションのすべての例は、Ranorex Studio Demo Application を使用しています。ほとんどの例で、このアプリの UI-element test area タブを使用しています。
Ranorex demo application – UI-element test area
Ranorex Studio Demo Application のダウンロード
以下のリンクからダウンロードできます。
ダウンロード
File: Ranorex Studio Demo Application
シンプルなボタンの識別と RanoreXPath の汎化
ここでは、ユーザー インターフェースでシンプルなボタンを識別してから、対応する RanoreXPath 式が任意のボタンにマッチするように汎化します。
Ranorex Spy で、Demo Application の UI-element test are にある、Exit ボタンをトラッキングします。
トラッキング後の Spy の表示は、以下のようになります。
Exit ボタンが、ルート要素
RxMainFrame
の子であることを示している、ツリー ブラウザーの表示属性値
@controlname='RxButtonExit'
で識別されている Exit ボタン1 個の UI 要素が見つかったことを示している、Spy のステータス バーの表示
RanoreXPath の汎化
RanoreXPath の汎化は、詳細度を下げ、堅牢性を向上させることを意味します。
今回の例では、Exit ボタンが、button
ロールによってのみ識別されるよう、RanoreXPath を汎化します。これは、ボタンの属性を削除することでおこないます。Exit ボタンは、要素ツリーのこのレベルにおいて、唯一のボタンであるため、属性を削除しても引き続き正しく識別され、その RanoreXPath は UI の変更に対してより堅牢になります。
Spy で、RanoreXPath 行をクリックし、[@controlname='RxButtonExit']
属性を削除し、Enter を押下します。
Spy での表示は以下のようになります。
button
ロールのみが指定された、汎化された RanoreXPatExit ボタンがルート要素の子であることを示している、ツリー ブラウザーの表示
汎化された RanoreXPath のパス エディターでの表示
1 個の UI 要素 (つまり Exit ボタン) が見つかったことを示しているステータス メッセージ
メモ
要素ツリーの同じレベルに複数のボタン (または、汎化した RanoreXPath のいずれかの種類の UI 要素) が存在する場合、RanoreXPath 式はそれらすべてを識別します。
識別属性の変更
UI 要素をトラッキングすると、Ranorex Studio は RanoreXPath を自動的に生成し、その際に、識別に使用する属性も自動的に決定されます。当然のことながら、RanoreXPath で識別に使用する属性は変更できます。
Demo Application の UI-element test area にある、Exit ボタンをトラッキングします。
RanoreXPath 行をクリックし、パス エディターに切り替えます。
変更したい属性があるノード (例えば button ノード) を選択します。
任意の属性を選択/選択解除します。例えば、controlname 属性を選択解除し、代わりに controltext を選択します。RanoreXPath が自動的に変更されます。
変更が反映された RanoreXPath
変更が反映されたパス エディターの表示
この RanoreXPath で 1 個の UI 要素が見つかったことを示しているステータス メッセージ
ワイルドカード
ワイルドカードによって、RanoreXPath を UI 構造の変化に対してより堅牢にすることができます。
メモ
/* |
1 ツリー レベルのあらゆる UI 要素 |
/? |
0 または 1 ツリー レベルのあらゆる UI 要素 |
// |
複数のツリー レベルのあらゆる UI 要素 |
/? (any optional)
Demo Application の UI-element test area 全体をトラッキングします。
Ranorex Spy での表示は以下のようになります。
中央の UI 要素 TabPageList は表示されていません。パスをより堅牢にするために、代わりに 2 個の
/?
ワイルドカードが挿入されています。最後のノードは、対象の UI 要素、つまり、UI-element test area タブ ページ全体です。これは、RanoreXPath の 2 番目の固定部分です。
RanoreXPath の解釈
対象の要素 3 は、ルート要素 1 の子孫の要素であり、必須ではない最大 2 つ (0,1 または 2) の UI 要素 2 が間にあります。
// (any descendants)
UI の中から、”深さ” が分からない要素を識別する必要がある場合があります。any descendants ワイルドカードを使用することで、ルート ノードと最終ノードの間にある、すべての中間ノードを包括できます。
Ranorex Spy のツリー ブラウザーで、以下の RanoreXPath 式を入力します。
2 番目の部分は、any descendants ワイルドカードです。この部分は、ワイルドカード ノードです
3 番目の部分は、対象の UI 要素を表す最終ノードです。この例では、
radiobutton
ロールを持つ任意の UI 要素です。この式は、ルート要素の子孫である、すべてのラジオ ボタンを識別します。Spy での表示は以下のようになります。
ツリー ブラウザーでは、異なる 2 つのレベル (レベル 3 および 4) で、7 個のラジオ ボタンが表示されています。
ステータス メッセージには、7 個の要素が見つかったことが表示されています。
/* (any)
識別したい要素の UI での “深さ” が分かっていて、中間ノードが無関係であることが分かっている場合には、RanoreXPath を堅牢にするために、any ワイルドカードが使用できます。
2 番目の部分は、3 つの異なるレベルの 3 個の要素を表す、3 個の any ワイルドカードで構成されています。
3 番目の部分は、対象の UI 要素を表す最終ノードです。この例では、
radiobutton
ロールを持つ任意の UI 要素です。この式は、ルート要素の 3 レベル下にある、すべてのラジオ ボタンを識別します。Spy での表示は以下のようになります。
ツリー ブラウザーでは、ルート要素の 3 つ下のレベルの、5 個の
radiobutton
要素が表示されています。他のレベルにあるラジオ ボタンは識別されていません。ステータス メッセージには、5 個の要素が見つかったことが表示されています。
RanoreXPath 式の詳細化
RanoreXPath 式が汎化されすぎていて、識別される UI 要素が多すぎる、あるいは正しくない場合があります。このような場合には、式を詳細化する必要があります。
汎化した RanoreXPath
この例ではまず、非常に汎化された RanoreXPath を作成します。Ranorex Studio Demo Application の UI-element test area タブにある、すべてのボタンを識別します。
Spy で以下の RanoreXPath を入力し、Enter を押下します。
ツリー ブラウザーでは、17 個の識別されたボタンが表示されています。
ステータス メッセージには、17 個の要素が見つかったことが表示されています。
詳細化の最初のステップ
17 個のボタンは明らかに多すぎるため、RanoreXPath を詳細化する必要があります。ここでは、ボタンに属性を追加します。非表示状態ではないボタンのみを識別するために、visible
属性を指定します。
RanoreXPath の最後の部分を以下のように変更し、Enter を押下します。
ツリー ブラウザーでは、15 個のボタンが表示されています。
ステータス メッセージには、15 個の要素が見つかったことが表示されています。
詳細化の次のステップ
ボタンの数が 2 つ減っただけなので、RanoreXPath をさらに詳細化する必要があります。and
演算子を使用して、さらに別の属性を組み合わせることができます。
RanoreXPath の最後の部分を以下のように変更し、Enter を押下します。
ツリー ブラウザーでは、2 個のボタンが表示されています。
ステータス メッセージには、2 個の要素が見つかったことが表示されています。
ヒント
and
演算子については、⇢ RanoreXPath の構文 を参照してください。結果
詳細化した RanoreXPath 式によって、2 個のボタンのみが識別されるようになりました。
ツリー位置による UI 要素の選択
RanoreXPath が複数の要素を識別している場合、要素ツリー内の位置を指定することで、要素を選択できます。
Ranorex Spy で以下の RanoreXPath を入力し、Enter を押下します。
[2]
を追加することで、直前の RanoreXPath によって識別されている 2 個の要素から、2 番目の要素を選択します。ツリー ブラウザーでは、2 番目の要素のみが表示されています。
ステータス メッセージには、1 個の要素が見つかったことが表示されています。
Demo Application の UI では、Button 1 が識別されます。
メモ
要素ツリー内の位置のみが関係します。上記の Button 1 のように、UI 上では要素の位置は異なるかもしれません。
ツリー ビュー アイテムの識別
ツリー ビューは、一般的な UI 要素です。ここでは、Ranorex Studio がこれらの UI 要素をどのように識別するのかを説明します。
Ranorex Spy で、Track ボタンをクリックします。.
Demo Application の UI-element test area で、Web and mobile testing ツリー アイテムをクリックします。
Ranorex Spy での表示は以下のようになります。
堅牢性を向上させるため、Ranorex Studio は、2 個の any optional ワイルドカード (
/?/?
) を自動的に挿入します。Spy の要素ツリーでは、ツリー ビューの子孫として、ツリー アイテム Web and mobile testing を表示しています。
ツリー ビューのサブアイテム
Ranorex Spy で、Track ボタンをクリックします。
Demo Application の UI-element test area で、Web and mobile testing の子のツリー アイテム Endpoints をクリックします。
Ranorex Spy での表示は以下のようになります。
先祖のツリー ビュー全体が、固定ノードして扱われます。
固定ノードと最終ノードの間のツリー アイテムは、any descendants (
//
) 演算子によって包括されます。サブツリー アイテム Endpoint は、それが持つ先祖ツリー アイテムの数に関わらず、識別されます。
メモ
Ranorex Studio は、すべてのサブツリー アイテムを、通常のツリー アイテムとして扱い、同じ様に述語 (属性+値) を使用して識別します。ツリー構造が干渉しないようにするために、any descendants 演算子も挿入されます。これにより、ツリー アイテムがツリー内のどこにいても識別できます。
軸指定子によるツリー兄弟の識別
ツリー アイテムの兄弟を識別したい場合には、⇢ 軸指定子 (Axis) を使用することで識別できます。軸指定子は、特定のノードを基準にしたノードの指定がおこなえます。以下で、following-sibling
を使用した例を説明します。
Ranorex Spy で、以下の RanoreXPath を入力して Enter を押下します。
following-sibling::treeitem
を追加した RanoreXPathです。この軸指定子は、treeitem
ロールを持ち、Spy の要素ツリー内で同じレベルにあるEndpoints ツリー アイテムの下にある、すべての UI 要素を識別することを意味します。RanoreXPath のパス エディターでの表示です。
ツリー ブラウザーでは、Endpoints アイテムの後に続く唯一の兄弟である、Mobile testing ツリー アイテムが表示されています。
メモ
following-sibling
軸指定子は、後に続く兄弟が複数ある場合、そのすべてを返します。テーブル アイテムの識別
ここでは、テーブル アイテムの識別方法について説明します。
テストの定義
この例では、Demo Application の UI-element test area にあるテーブルから、Thomas Bach という名前の人物の年齢を含むセルを、より堅牢な形で識別します。Thomas という名前を含むセルと、これに続く年齢を含むセルの両方を識別する必要があります。
Thomas Bach の年齢を含むセル (cell) です。このセルを堅牢に識別する RanoreXPath を作成します。
絶対位置指定での name セルの識別
最初に、Thomas という名前を含むセルを識別します。以下の画像のように、セルをトラッキングして、セルへの絶対位置指定での RanoreXPath を生成するのが簡単な方法です。
RanoreXPath は、
accessiblename = 'FirstName Row3'
であるセルを識別しています。この属性値は、テーブルにおけるセルの位置を示しています。このセルの現在の値は Thomas です。識別された UI 要素の、Spy の要素ツリーでの表示
変更に対して脆弱
絶対位置指定の RanoreXPath には問題があります。テーブルをソートやシャッフルするなどして、テーブルが変更されると、識別されたセルの値は Thomas ではなくなります。
…絶対位置指定の RanoreXPath は、Thomas という名前ではなく、セルの位置のみを考慮しているため、期待する結果になりません。
セル コンテンツを指定した RanoreXPath
accessiblename 属性を使用してセルを識別する代わりに、セル内のテキストを参照する、text 属性を使用します。
しかし、Thomas というテキストを含むセルは 2 つあるため、これはまだ堅牢と言える解決方法ではありません。
…指定したコンテンツを含むすべてのセルが識別されてしまいます。
さらなる絞り込み
FirstName 列が Thomas であるセルのみが識別されるようにする必要があります。セルの accessiblename に関する別の属性を、述語に追加します。
FirstName 列が Thomas である、1 個のセルのみを識別
ヒント
場合によっては、さらに属性や軸指定子を追加して、RanoreXPath をさらに詳細化する必要があります。
絶対指定から相対指定へ
FirstName に Thomas を含むセルを堅牢な形で識別できたことで、Thomas の年齢 (age) のセルを識別することができます。
これは、パスを相対指定することでおこないます。つまり、parent
軸指定子 (省略系: ..
) を使用し、アンカー ポイント (Thomas セル) から行 (row) へ戻り、そこから Age のセルへ移動します。これにより、Age のセルが Thomas のセルの位置に関連付けられ、常に正しく識別されるようになります。
Thomas Bach の年齢 (42) のセルを正しく識別