RanoreXPath – コツと小技

RanoreXPath 式は、デスクトップ/Web アプリケーション/モバイルの UI 要素を対象とする強力な識別子です。このブログ記事では、毎日の業務に役立つ RanoreXPath のコツと小技を紹介します。テスト対象アプリケーションのサンプルとして、FlexExamplePageの“Ranorex Flex Example Page”を使用します。

  • 要素ブラウザー
  • RanoreXPathの全体的なレイアウト
  • 複数のボタン要素の検索
  • checked属性の状態でチェックボックスを識別する
  • 属性の組み合わせでチェックボックスを識別する
  • parent演算子を使用して関連要素を認識する
  • preceding-sibling および following-sibling を使用して要素を認識する
  • 正規表現を使用してE-mailアドレスフィールドを識別する
  • ユーザーコード内で RanoreXPath を使用する

要素ブラウザー

テストオートメーションコードを紹介する前に、要素ブラウザーを参照してRanoreXPath機能の概要を確認しておきましょう。まず、要素ブラウザーでテスト対象アプリケーションを確認し、WebページのFlexObjectを新しいルートノードにします(右クリックから[要素をルートに設定])。

FlexObjectとその下の要素だけが表示され、他の要素はフィルターされました。

RanoreXPathの全体的なレイアウト

それでは、テスト対象アプリケーションのRanoreXPathを詳しく見てみましょう。FlexObjectの絶対RanoreXPathは次のように表示されるはずです。

(訳注:環境によっては次のRanoreXPathの場合もあります。  /dom[@domain=’www.ranorex.com’]/?/?/flexobject[@id=’FlexExample’] )

dom、body、およびflexobjectは、UI要素の型または分類を表すアダプタであり、その後ろに、要求された要素を識別するための属性値比較式があります。基本的に、パスは次の要素で構成されます。

比較演算子は、単一の等号より複雑な場合もあります。

複数のボタン要素の検索

たとえば、上で定義されたルートノードの直接の子であるボタンをすべて表示するには、RanorexPath編集フィールドに次のように入力します。

これは、現在のノードのすべてのボタン子ノードへの相対パスを作成することを意味します。

では、flexオブジェクトに含まれるすべてのボタンを表示するにはどうすればよいでしょうか?

それは次のとおりです。

これは、現在のノードのすべてのボタン子孫ノードへの相対パスを作成することを意味します。そのため、現在の要素のサブツリー内にある、すべてのレベルのボタンが該当します。

checked属性の状態でチェックボックスを識別する

checkboxへのパスを作成することもできます。まず、テスト対象アプリケーションでcheckboxアイテムのchecked属性を有効にします。Checkbox Control Exampleエリアで[milk]チェックボックスをオンにし、[send me coupons item]チェックボックスをオフにします。次に、checked属性にtrueが設定されているcheckboxコントロールを検証します。

要素ブラウザーには「milk」チェックボックス要素だけが表示されているはずです。

属性の組み合わせてチェックボックスを識別する

また、このサンプルを拡張し、eggsを検索せず、等価演算子を使用して他のチェックがオンに設定されているチェックボックスをすべて検索することもできます。[eggs] と [bread]チェックボックスをオンにしてください。

あるいは、and演算子ではなくor演算子を使用して、milkおよびeggsを検索することもできます。

parent演算子を使用して関連要素を認識する

今度は、Maurice Smithの電話番号を取得する方法を見てみましょう。

“..”は現在の結果要素の親を参照します。このサンプルでは、テキスト「Maurice Smith」を含むセル(赤枠)の親である3番目の行(青枠)です。テーブルの2番目の列に電話番号が格納されていることがわかっているため、インデックス[2]を使用して目的のセルを取得できます(緑枠)。

preceding-sibling および following-sibling を使用して関連要素を認識する

では、電話番号がわかっていて、それに対応する名前とE-mailアドレスを取得したい場合はどうすればよいでしょうか?それには、前にあるセルを取得する必要があります。

preceding-sibling::cellコマンドは、前にあるすべてのセルを返します。このサンプルでは、指定された電話番号のセル(赤枠)に対応する名前(青枠)のセルです。

following-sibling::cellコマンドは、後ろにあるすべてのセルを返します。このサンプルでは、指定された電話番号のセル(赤枠)に対応するE-mailアドレス(緑枠)のセルです。

正規表現を使用してE-mailアドレスフィールドを識別する

単純な等価比較だけでなく、正規表現も属性の条件として使用できます。たとえば、text属性にE-mailアドレスを含むすべてのcellアダプタを検索するケースを考えてみましょう。E-mailアドレスに一致する正規表現は、“.+@.+..+”など、いくつか考えられます。ここでは、この正規表現をRanoreXPath内で使用することにします。

“~” 演算子は、正規表現を使用して比較を行うよう指示します。正規表現中の“.” は、任意の1文字にマッチし、”+”は左側の文字の1回以上の繰り返しを意味します。”.”などの特殊文字をエスケープするには、文字の前にバックスラッシュ”\”を付加します。サンプルでは、”@”の前後に1つ以上の文字があり、後ろに”.”および1つ以上の文字が続く場合にマッチします。RanoreXPathでの正規表現の使用についての詳細は、ユーザーガイドの「正規表現を使用した RanoreXPath」を参照してください。

ユーザーコード内でRanoreXPathを使用する

RanoreXPathの強力さがわかったところで、その知識をRanorexプロジェクトに適用してみましょう。まず、新しく定義されたルート(flexオブジェクト)をプロジェクトのリポジトリにドラッグ&ドロップで追加し、名前をflex_objectに変更します。次に、新規ユーザーコード項目(名前はmoveToButtonsとします)をレコーディングに追加し、コードに切り替えます。作成されたメソッドに次のコードを追加します。

foreach(Ranorex.Button my_button in repo.flex_object.Find("./button"))
{
    my_button.MoveTo();
    Delay.Milliseconds(300);
}

プロジェクトをビルドして実行します。期待どおり、ルートの直接の子であるすべてのボタンにマウスカーソルが移動します。直接の子だけでなく、flexオブジェクト内に表示されたすべてのボタンにカーソルを移動するには、次のコードを使用します。

foreach(Ranorex.Button my_button in repo.flex_object.Find(".//button[@visible=’True’]"))
{
    my_button.MoveTo();
    Delay.Milliseconds(300);
}

このユーザーコードサンプルでは、これまでのところ相対パスだけを使用していますが、もちろん、絶対パスを使用することもできます。では、絶対パスを使用してMaurice SmithのE-mailアドレスを検索してみましょう。次のコードは、前のサンプルの正規表現を使用してMauriceのE-mailアドレスを検索し、RanorexテストレポートにE-mailアドレスを出力します。

Ranorex.Cell cell = "/dom[@page='FlexExample.html']/body/flexobject/container[@caption='DataGrid Control']/table/row/cell[@text='Maurice Smith']/../cell[@text~'.+@.+..+']";
Report.Info("Info: ", cell.Text.ToString());

テストをビルドして実行すると、期待されるE-mailアドレスがRanorexテストレポートに表示されます。

ご紹介したとおり、RanoreXPathは、プログラミングスキルなしにテスト対象アプリケーションのUI要素を検索するのに非常に有効です。RanoreXPathの修飾子と正規表現に関する知識があれば、どんなUI要素も検索できます。RanorexリポジトリとRanorex Recorderを使用する場合は、コードを修正する必要すらありません。RanoreXPathのすべての修飾子の概要についてはユーザーガイドの「RanoreXPath」を参照してください。

(この記事は、開発元 Ranorex 社 Blog 「RanoreXPath – Tips and Tricks」2010年10月11日の翻訳記事です。)