次の方法で共有


UI オートメーション要素の取得

メモメモ

このドキュメントは、System.Windows.Automation 名前空間で定義されているマネージ UI Automation クラスを使用する .NET Framework 開発者を対象としています。UI Automationに関する最新情報については、「Windows Automation API: UI Automation (Windows オートメーション API: UI オートメーション)」を参照してください。

ここでは、user interface (UI) 要素の AutomationElement オブジェクトを取得するさまざまな方法について説明します。

Caution メモ注意

クライアント アプリケーション独自のユーザー インターフェイス内の要素を検索する場合は、UI Automationのすべての呼び出しを別のスレッドで行う必要があります。詳細については、「UI オートメーション スレッド処理の問題点」を参照してください。

このトピックは、次のセクションで構成されています。

  • ルート要素
  • 条件
  • 検索範囲
  • 既知の要素の検索
  • サブツリー内の要素の検索
  • サブツリーのウォーク
  • 要素を取得するためのその他の方法
  • 関連トピック

ルート要素

AutomationElement オブジェクトのすべての検索で、開始場所を指定する必要があります。 これには、デスクトップ、アプリケーション ウィンドウ、コントロールなどの任意の要素を指定できます。

すべての要素が子孫となる、デスクトップのルート要素は、静的プロパティ AutomationElement.RootElement から取得されます。

Caution メモ注意

一般に、RootElement の直接の子だけを取得する必要があります。子孫を検索すると、要素の処理が数百回または数千回も繰り返される場合があるため、スタック オーバーフローが発生する可能性があります。低いレベルにある特定の要素を取得する場合は、アプリケーション ウィンドウまたは低いレベルのコンテナーから検索を開始する必要があります。

条件

UI Automation要素を取得するために使用できる手法では、多くの場合、取得する要素が定義されている基準セットである Condition を指定する必要があります。

最も単純な条件は TrueCondition、すなわち、検索範囲内のすべての要素が返されることを指定する定義済みのオブジェクトです。 TrueCondition の逆である FalseCondition は、要素が見つかるわけではないので、あまり実用的ではありません。

他にも 3 つの定義済みの条件 ContentViewConditionControlViewCondition、および RawViewCondition を単独でまたは他の条件と組み合わせて使用できます。 RawViewCondition は単独で使用すると、IsControlElement プロパティまたは IsContentElement プロパティによって要素がフィルター処理されないため、TrueCondition と同等です。

その他の条件は 1 つ以上の PropertyCondition オブジェクトで構築され、個々のオブジェクトではプロパティ値を指定します。 たとえば、PropertyCondition は、要素が有効であること、または特定のコントロール パターンをサポートすることを指定できます。

AndConditionOrCondition、および NotCondition 型のオブジェクトを構築することにより、ブール ロジックを使用して条件を組み合わせることができます。

検索範囲

FindFirst または FindAll を使用して実行される検索には、範囲および開始場所を指定する必要があります。

範囲では、検索を開始する場所の空間を定義します。 これには、要素自体、その兄弟、親、先祖、直接の子、および子孫を含めることができます。

検索の範囲は、TreeScope 列挙体からの値のビットごとの組み合わせによって定義されます。

既知の要素の検索

NameAutomationId、またはその他のプロパティ、あるいは、プロパティの組み合わせによって識別される既知の要素を検索する場合、最も簡単な方法は FindFirst メソッドを使用することです。 検索される要素がアプリケーション ウィンドウの場合は、検索の開始点に RootElement を指定できます。

この UI Automation要素の検索方法は、自動テストのシナリオでは最も有用です。

サブツリー内の要素の検索

既知の要素に関連する特定の基準を満たす全要素を検索する場合は、FindAll を使用できます。 たとえば、このメソッドを使用して、リストまたはメニューからリスト項目またはメニュー項目を取得したり、ダイアログ ボックス内のすべてのコントロールを識別したりできます。

サブツリーのウォーク

クライアントと一緒に使われるアプリケーションについて予備的知識がない場合、TreeWalker クラスを使用して、目的のすべての要素のサブツリーを構築できます。 アプリケーションは、フォーカス変更イベントに応答してこれを行うことができます。つまり、アプリケーションまたはコントロールが入力フォーカスを受け取ったときに、UI オートメーション クライアントがフォーカスのある要素の子と、必要に応じてすべての子孫を調べます。

TreeWalker を利用する別の方法としては、要素の先祖を識別します。 たとえば、ツリーをウォークすることによって、コントロールの親ウィンドウを識別できます。

TreeWalker を使用するには、クラスのオブジェクトを作成する (Condition を渡して目的の要素を定義する) か、または TreeWalker のフィールドとして定義されている次の定義済みオブジェクトの 1 つを使用します。

ContentViewWalker

IsContentElement プロパティが true の要素だけを検索します。

ControlViewWalker

IsControlElement プロパティが true の要素だけを検索します。

RawViewWalker

すべての要素を検索します。

TreeWalker の取得後に、これを使用することは簡単です。 サブツリーの要素間を移動する場合は、Get メソッドを呼び出すだけです。

Normalize メソッドを使用して、ビューに含まれない別の要素からサブツリー内の要素に移動できます。 たとえば、ContentViewWalker を使用してサブツリーのビューを作成したとします。 この場合、アプリケーションは、スクロール バーが入力フォーカスを受け取ったという通知を受信します。 スクロール バーはコンテンツ要素ではないため、サブツリーのビュー内に存在しません。 しかし、スクロール バーを表す AutomationElementNormalize に渡して、コンテンツ ビュー内の最も近い先祖を取得できます。

要素を取得するためのその他の方法

検索および移動に加えて、次の方法で AutomationElement を取得できます。

イベントからの取得

アプリケーションが UI Automation イベントを受け取ったとき、イベント ハンドラーに渡されるソース オブジェクトは AutomationElement です。 たとえば、フォーカス変更イベントにサブスクライブした場合、AutomationFocusChangedEventHandler に渡されるソースは、フォーカスを受け取った要素です。

詳細については、「UI オートメーション イベントのサブスクライブ」を参照してください。

点からの取得

画面座標 (カーソル位置など) がある場合は、静的メソッド FromPoint を使用すると AutomationElement を取得できます。

ウィンドウ ハンドルからの取得

HWND から AutomationElement を取得するには、静的メソッド FromHandle を使用します。

フォーカスがあるコントロールからの取得

静的プロパティ FocusedElement から、フォーカスがあるコントロールを表す AutomationElement を取得できます。

参照

処理手順

プロパティ条件に基づく UI オートメーション要素の検索

TreeWalker を使用した UI オートメーション要素間の移動

概念

UI オートメーション ツリーの概要