取得 UI 自動化項目

本主題說明取得UI元素之IUIAutomationElement介面的各種方式

IUIAutomationElement 用於 使用者介面自動化 檔案內容用戶端範例應用程式

根項目

雖然可以使用 IUIAutomation::GetFocusedElement方法來直接擷取元素,但某些用戶端應用程式需要檢視元素的階層式結構,稱為 使用者介面自動化 樹狀結構。 這個階層的根元素是桌面。 您可以使用 IUIAutomation::GetRootElement 方法或 IUIAutomation::GetRootElementBuildCache 方法來取得這個專案。 這兩種方法都會擷 取 IUIAutomationElement 介面指標。 您可以使用 IUIAutomationElement::FindFirst FindAll方法來搜尋子代元素。

注意

一般而言,您應該嘗試只取得根元素的直接子系。 搜尋子系可能會逐一查看數百或數千個元素。 如果您嘗試取得較低層級的特定項目,您應該從應用程式視窗或較低層級的容器開始搜尋。

 

條件

對於您用來擷取 使用者介面自動化 元素的大部分技術,您必須指定條件。 條件是一組準則,定義您要擷取的專案。 條件是由 IUIAutomationCondition 介面表示。

最簡單的條件是 true 條件,這是預先定義的 物件,指定要傳回搜尋範圍中的所有專案。 false 條件是 true 條件的反函數,而且不太有用,因為它會防止找到任何元素。 您可以使用 IUIAutomation::CreateTrueCondition 來取得 true 條件的介面。

其他三個預先定義的條件,可作為 IUIAutomation 對象的屬性,可以單獨使用或與其他條件搭配使用:IUIAutomation::ContentViewCondition、ControlViewCondition 和 RawViewCondition。 RawViewCondition 本身使用,相當於 true 條件,因為它不會依 IUIAutomationElement::CurrentIsControlElement CurrentIsContentElement 屬性來篩選元素。

其他條件是從條件物件建置的,每個物件都會指定屬性值。 例如,屬性條件可能會指定元素已啟用或支援特定控制項模式。

使用布爾邏輯的條件可以藉由呼叫 IUIAutomation::CreateAndCondition、CreateOrConditionCreateNotCondition 和相關方法來結合。

搜尋範圍

使用 IUIAutomationElement::FindFirst FindAll 執行的搜尋必須具有範圍和起點。

注意

這兩種方法的任何評論也適用於 IUIAutomationElement::FindFirstBuildCache 和 FindAllBuildCache

 

範圍會定義要搜尋之起始位置周圍的空間。 這可能包括元素本身、其同層級、其父代、其直接子系和子系。 請注意,Find 方法不支持搜尋 Microsoft 使用者介面自動化 樹狀結構;也就是說,不支援搜尋上階元素。

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

尋找已知的項目

若要尋找名稱、自動化標識碼或其他屬性或屬性組合所識別的已知專案,最簡單的方式是使用 IUIAutomationElement::FindFirst 方法。 如果搜尋的專案是應用程式視窗,搜尋的起點可以是根元素。

這種尋找 使用者介面自動化 元素的方式在自動化測試案例中最為實用。

如需示範如何尋找已知元素的程式代碼範例,請參閱 依名稱尋找元素。

在子樹狀結構中尋找項目

若要尋找符合特定準則且與已知元素相關的所有元素,您可以在已知元素上呼叫 IUIAutomationElement::FindAll 例如,使用此方法從清單或功能表擷取清單專案或功能表項,或識別對話框中的所有控件。

如需示範如何在子樹中尋找元素的程式代碼範例,請參閱 尋找相關元素

逐一查看子樹狀結構

如果您事先不知道用戶端可能使用的應用程式,您可以使用 IUIAutomationTreeWalker 來建構感興趣的所有元素子樹。 例如,您的用戶端可能會執行此動作,以回應焦點變更的事件;也就是說,當應用程式或控件收到輸入焦點時,使用者介面自動化 客戶端會檢查焦點元素的所有子系和子系。

請注意,走 使用者介面自動化 樹需要大量資源。 只有在無法使用 IUIAutomationElement::FindFirstFindAll BuildUpdatedCache 方法時,才能執行樹狀結構。

您可以將自定義條件傳遞至 IUIAutomation::CreateTreeWalker 來定義自己的樹狀結構逐步解說程式,也可以使用下列其中一個預先定義的對象,這些物件定義為基底 IUIAutomation 的屬性。

Object 目的
ContentViewWalker 只尋找 IUIAutomationElement::CurrentIsContentElement 屬性為 TRUE 的專案。
ControlViewWalker 只尋找 IUIAutomationElement::CurrentIsControlElement 屬性為 TRUE 的專案。
RawViewWalker 尋找所有項目。

 

取得 IUIAutomationTreeWalker 之後,呼叫 IUIAutomationTreeWalker::GetXxx 方法來巡覽子樹的元素,並傳入要從中開始行走的 元素。

IUIAutomationTreeWalker::Normalize 方法可用來從不屬於檢視的另一個元素巡覽至子樹中的元素。 例如,假設您使用 IUIAutomation::ContentViewWalker 建立子樹的檢視。 您的應用程式會收到滾動條已接收輸入焦點的通知。 因為捲軸不是內容項目,所以不會出現在子樹狀結構檢視中。 不過,您可以將代表滾動條的 IUIAutomationElement 傳遞IUIAutomationTreeWalker::Normalize,並擷取內容檢視中最接近的上階。

如需示範如何使用 IUIAutomationTreeWalker 介面的程式代碼範例,請參閱如何逐步執行 使用者介面自動化 樹狀結構

擷取項目的其他方式

除了搜尋和流覽之外,您還可以使用下列方式擷取 IUIAutomationElement

從事件擷取

當應用程式收到 使用者介面自動化 事件時,傳遞至事件處理程式的來源物件會以IUIAutomationElement表示。 例如,如果您訂閱焦點變更事件,傳遞至 IUIAutomationFocusChangedEventHandler 的來源就是接收焦點的專案。 如需詳細資訊,請參閱訂閱 使用者介面自動化 事件

從點擷取

若要從螢幕座標擷取 IUIAutomationElement,例如游標位置,請使用 IUIAutomation::ElementFromPoint 方法。

從視窗控制代碼擷取

若要從 HWND 擷取 IUIAutomationElement,請使用 IUIAutomation::ElementFromHandle 方法。

從取得焦點的控制項擷取

若要擷取代表焦點控件的 IUIAutomationElement,請使用 IUIAutomation::GetFocusedElement 方法。

UI 自動化樹狀目錄概觀

使用者介面自動化 檔案內容用戶端應用程式範例應用程式