取得 UI 自動化項目

注意

本文件適用對象為 .NET Framework 開發人員,其想要使用 System.Windows.Automation 命名空間中定義的受控 UI 自動化類別。 如需 UI 自動化的最新資訊,請參閱 Windows 自動化 API:UI 自動化

本主題描述為使用者介面 (UI) 元素取得 AutomationElement 物件的各種方式。

警告

如果您的用戶端應用程式可能會嘗試尋找本身使用者介面中的元素,則您必須在個別執行緒上進行所有 UI 自動化呼叫。 如需詳細資訊,請參閱 UI Automation Threading Issues

根項目

對於 AutomationElement 物件的所有搜尋都必須有一個開始位置。 這可以是任何項目,包括桌面、應用程式視窗或控制項。

受所有項目繼承的桌面根項目取自靜態 AutomationElement.RootElement 屬性。

警告

一般而言,您應該試著取得 RootElement的直接子系。 如果搜尋子系可能會逐一查看數百或甚至數千個項目,就很有可能會造成堆疊溢位。 如果您嘗試取得較低層級的特定項目,您應該從應用程式視窗或較低層級的容器開始搜尋。

條件

對於可用來擷取 UI 自動化元素的大部分技術,您都必須指定 Condition,這是一組準則,定義您想要擷取哪些元素。

最簡單的條件是 TrueCondition,是一種預先定義的物件,會指定要傳回之搜尋範圍內的所有項目。 FalseCondition,也就是 TrueCondition的反向,並不是很有用,原因在於它可能會讓任何項目都無法被找到。

有三個預先定義的條件可單獨使用,或與其他條件組合使用: ContentViewConditionControlViewConditionRawViewConditionRawViewCondition供本身使用,相當於 TrueCondition,原因在於它不會依其 IsControlElementIsContentElement 屬性篩選項目。

其他條件可從一個以上的 PropertyCondition 物件建置,其中每個物件都會指定屬性值。 例如, PropertyCondition 可能指定該項目是否已啟用,或者它是否支援特定的控制項模式。

條件可以使用布林邏輯加以組合,方法是建構 AndConditionOrConditionNotCondition類型的物件。

搜尋範圍

使用 FindFirstFindAll 完成的搜尋必須具備範圍以及開始位置。

此範圍定義要搜尋之開始位置周圍的空間。 這可能包含項目本身,及該項目的同層級、父系、祖系、直接子系和子系。

此搜尋範圍由 TreeScope 列舉值的位元組合所定義。

尋找已知的項目

若要尋找已知的項目,且該項目由其 NameAutomationId或某些其他屬性或屬性組合所識別,則使用 FindFirst 方法最為容易。 如果要搜尋的項目是應用程式視窗,則搜尋開始點可以是 RootElement

以這種方式在自動化測試案例中尋找 UI 自動化元素最好用。

在子樹狀結構中尋找項目

若要尋找符合與已知項目相關之特定準則的所有項目,您可以使用 FindAll。 例如,您或許可以使用這個方法,從清單或功能表上擷取清單項目或功能表項目,或識別在對話方塊中的所有控制項。

逐一查看子樹狀結構

如果您事先不知道您的用戶端可搭配使用的應用程式,您可以建構所需所有項目的子樹狀結構,方法是使用 TreeWalker 類別。 您的應用程式可能會執行這項操作以回應焦點變更的事件;也就是當應用程式或控制項收到輸入的焦點時,使用者介面自動化用戶端會檢查子系,也可能檢查已取得焦點之項目的所有子系。

而可使用 TreeWalker 的另一種方式為識別項目的祖系。 例如,您可以向上查看樹狀結構來識別控制項的父視窗。

您可以建立此類別的物件 (藉由傳遞 TreeWalker 定義所需項目) 來使用 Condition,或使用下列其中一種預先定義的物件,該物件定義為 TreeWalker的欄位。

欄位 描述
ContentViewWalker 只尋找其 IsContentElement 屬性是 true的項目。
ControlViewWalker 只尋找其 IsControlElement 屬性是 true的項目。
RawViewWalker 尋找所有項目。

在您取得 TreeWalker之後,用法就非常簡單。 只要呼叫 Get 方法在子樹狀結構的項目之間瀏覽即可。

Normalize 方法可用來瀏覽至項目,該項目位於另一個不屬於該檢視之項目的子樹狀結構中。 例如,假設您已使用 ContentViewWalker建立子樹狀結構檢視。 您的應用程式接著會收到通知,指出捲軸已接收輸入焦點。 因為捲軸不是內容項目,所以不會出現在子樹狀結構檢視中。 不過,您可以將代表此捲軸的 AutomationElement 傳遞至 Normalize ,並擷取內容檢視中最接近的祖系。

擷取項目的其他方式

除了搜尋和瀏覽以外,您也可以用下列方式擷取 AutomationElement

從事件擷取

當您的應用程式收到 UI 自動化事件時,傳遞至事件處理常式的來源物件是 AutomationElement。 例如,如果您已訂閱焦點變更事件,則傳遞給 AutomationFocusChangedEventHandler 的來源是接收此焦點的項目。

如需詳細資訊,請參閱 Subscribe to UI Automation Events

從點擷取

如果您有螢幕座標 (例如滑鼠指標位置),您就可以使用靜態 AutomationElement 方法來擷取 FromPoint

從視窗控制代碼擷取

若要從 HWND 擷取 AutomationElement ,請使用靜態 FromHandle 方法。

從取得焦點的控制項擷取

您可以從靜態 AutomationElement 屬性擷取 FocusedElement ,其代表取得焦點的控制項。

另請參閱