UI オートメーション要素の取得
Note
このドキュメントは、System.Windows.Automation 名前空間で定義されているマネージド UI オートメーション クラスを使用する .NET Framework 開発者を対象としています。 UI オートメーションの最新情報については、Windows Automation API の「UI オートメーション」を参照してください。
このトピックでは、ユーザー インターフェイス (UI) 要素の AutomationElement オブジェクトを取得するさまざまな方法について説明します。
注意事項
クライアント アプリケーションが独自のユーザー インターフェイスで要素の検索を試行する可能性がある場合は、すべての UI オートメーションの呼び出しを個別のスレッドで実行する必要があります。 詳細については、「 UI オートメーション スレッド処理の問題点」を参照してください。
Root 要素
AutomationElement オブジェクトの検索には必ず、開始場所が必要です。 この開始場所には、デスクトップ、アプリケーション ウィンドウ、コントロールなど任意の要素を指定できます。
デスクトップのルート要素 (すべての要素が派生する) が静的 AutomationElement.RootElement プロパティから取得されます。
注意事項
通常、 RootElementの直接の子のみの取得を試行する必要があります。 子孫の検索は、数百または数千もの要素を反復処理する場合があり、スタック オーバーフローを引き起こす可能性があります。 下位レベルの特定の要素を取得しようとする場合、アプリケーション ウィンドウから、または下位レベルのコンテナーから検索を開始する必要があります。
条件
UI オートメーション要素を取得するために使用できるほとんどの手法では、Condition を指定する必要があります。これは、取得する要素を定義する一連の条件になります。
最も簡単な条件は TrueConditionで、検索範囲内のすべての要素を指定する定義済みオブジェクトが返されます。 要素が検出されなくなるため、FalseCondition( TrueConditionの逆) はあまり有用ではありません。
その他の 3 つの定義済み条件 ( ContentViewCondition、 ControlViewCondition、および RawViewCondition) は、単独で使用することも、その他の条件と組み合わせて使用することもできます。 RawViewConditionを単独で使用した場合、 TrueConditionまたは IsControlElement プロパティで要素をフィルター処理しないため IsContentElement と同等になります。
その他の条件は 1 つ以上の PropertyCondition オブジェクトで構築され、それぞれはプロパティ値を指定します。 たとえば、 PropertyCondition は要素が有効であることを指定したり、特定のコントロール パターンをサポートすることを指定したりします。
AndCondition、 OrCondition、および NotConditionの型のオブジェクトを構築することによって、ブール ロジックを使用して条件を組み合わせることができます。
検索範囲
FindFirst または FindAll 使用した検索には、範囲と開始場所が必要です。
範囲は、検索対象の開始場所の周囲の領域を定義します。 これには、要素自体、その兄弟、その親、その先祖、その直接の子、およびその子孫を含めることができます。
TreeScope 列挙の値のビットごとの組み合わせによって、検索の範囲が定義されます。
既知の要素の検索
既知の要素 (その Name、 AutomationId、または他のプロパティまたはプロパティの組み合わせによって識別される) を検索する方法として、 FindFirst メソッドを使用する方法が最も簡単です。 検索する要素がアプリケーション ウィンドウである場合は、検索の開始点を RootElementにすることができます。
UI オートメーション要素を検索するこの方法は、自動化されたシナリオ テストの最も有用な方法になります。
サブツリー内の要素の検索
既知の要素に関連する特定の条件を満たすすべての要素を検索するには、 FindAllを使用します。 たとえば、このメソッドを使用して、リストまたはメニューからリスト項目またはメニュー項目を取得したり、ダイアログ ボックスのすべてのコントロールを識別したりできます。
サブツリーのウォーク
クライアントで使用されるアプリケーションについて予備知識がない場合、 TreeWalker クラスを使用して、対象となるすべての要素のサブツリーを構築することができます。 アプリケーションは、フォーカス変更イベントへの応答でこれを実行することができます。つまり、アプリケーションやコントロールが入力フォーカスを受け取るときに、UI オートメーション クライアントはフォーカスされている要素の子およびすべての子孫を調べます。
TreeWalker で使用できる別の方法は、要素の先祖を特定する方法です。 たとえば、ツリーをウォークすることによって、コントロールの親ウィンドウを特定できます。
クラスのオブジェクトを作成する ( TreeWalker を渡すことによって対象の要素を定義する) か、 Conditionのフィールドとして定義されている次の定義済みオブジェクトのいずれかを使用することによって、 TreeWalkerを使用できます。
フィールド | 説明 |
---|---|
ContentViewWalker | IsContentElement プロパティが true である要素のみを検索します。 |
ControlViewWalker | IsControlElement プロパティが true である要素のみを検索します。 |
RawViewWalker | すべての要素を検索します。 |
TreeWalkerを取得した後、それを使用することは簡単です。 Get
メソッドを呼び出し、サブツリーの要素間を移動するだけです。
Normalize メソッドを使用すると、ビューの一部ではない要素からサブツリー内の他の要素に移動できます。 たとえば、 ContentViewWalkerを使用してサブツリーのビューを作成したとします。 スクロール バーが入力フォーカスを受信したことを示す通知を、アプリケーションが受け取ります。 スクロール バーはコンテンツ要素ではないため、サブツリーのビューには存在しません。 しかし、スクロール バーを表す AutomationElement を Normalize に渡し、コンテンツ ビュー内にある最も近い先祖を取得することができます。
要素を取得する別の方法
検索とナビゲーションに加えて、次の方法で AutomationElement を取得できます。
イベントから
アプリケーションが UI オートメーション イベントを受信するときに、イベント ハンドラーに渡されるソース オブジェクトは AutomationElement です。 たとえば、フォーカス変更イベントをサブスクライブしている場合、 AutomationFocusChangedEventHandler に渡されるソースはフォーカスを受け取った要素になります。
詳細については、「 UI オートメーション イベントのサブスクライブ」を参照してください。
ポイントから
画面座標 (たとえば、カーソル位置) がある場合、静的 AutomationElement メソッドを使用して FromPoint を取得できます。
ウィンドウ ハンドルから
HWND から AutomationElement を取得するには、静的 FromHandle メソッドを使用します。
フォーカスされたコントロールから
静的 AutomationElement プロパティから、フォーカスされたコントロールを表す FocusedElement を取得できます。