取得 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、CreateOrCondition、CreateNotCondition 和相關方法來結合。
搜尋範圍
使用 IUIAutomationElement::FindFirst 或 FindAll 執行的搜尋必須具有範圍和起點。
注意
這兩種方法的任何評論也適用於 IUIAutomationElement::FindFirstBuildCache 和 FindAllBuildCache。
範圍會定義要搜尋之起始位置周圍的空間。 這可能包括元素本身、其同層級、其父代、其直接子系和子系。 請注意,Find 方法不支持搜尋 Microsoft 使用者介面自動化 樹狀結構;也就是說,不支援搜尋上階元素。
搜尋的範圍是由 TreeScope 列舉類型的值位元組合所定義。
尋找已知的項目
若要尋找名稱、自動化標識碼或其他屬性或屬性組合所識別的已知專案,最簡單的方式是使用 IUIAutomationElement::FindFirst 方法。 如果搜尋的專案是應用程式視窗,搜尋的起點可以是根元素。
這種尋找 使用者介面自動化 元素的方式在自動化測試案例中最為實用。
如需示範如何尋找已知元素的程式代碼範例,請參閱 依名稱尋找元素。
在子樹狀結構中尋找項目
若要尋找符合特定準則且與已知元素相關的所有元素,您可以在已知元素上呼叫 IUIAutomationElement::FindAll。 例如,使用此方法從清單或功能表擷取清單專案或功能表項,或識別對話框中的所有控件。
如需示範如何在子樹中尋找元素的程式代碼範例,請參閱 尋找相關元素。
逐一查看子樹狀結構
如果您事先不知道用戶端可能使用的應用程式,您可以使用 IUIAutomationTreeWalker 來建構感興趣的所有元素子樹。 例如,您的用戶端可能會執行此動作,以回應焦點變更的事件;也就是說,當應用程式或控件收到輸入焦點時,使用者介面自動化 客戶端會檢查焦點元素的所有子系和子系。
請注意,走 使用者介面自動化 樹需要大量資源。 只有在無法使用 IUIAutomationElement::FindFirst、FindAll 或 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 方法。