取得 UI 自動化項目
注意事項 |
---|
這份文件適用於想要使用 System.Windows.Automation 命名空間中定義之 Managed UI Automation 類別的 .NET Framework 開發人員。如需 UI Automation 的最新資訊,請參閱 Windows Automation API:使用者介面自動化 (英文)。 |
本主題說明各種方法,以取得user interface (UI) 項目的 AutomationElement 物件。
警告 |
---|
如果您的用戶端應用程式可能會試著在本身的使用者介面尋找項目,您必須在另外的執行緒上進行所有 UI Automation呼叫。如需詳細資訊,請參閱 UI 自動化執行緒問題。 |
這個主題包含下列章節。
- 根項目
- 技術支援使用條件
- 搜尋範圍
- 尋找已知項目
- 尋找子樹狀目錄中的項目
- 查核子樹狀目錄
- 擷取項目的其他方式
- 相關主題
根項目
搜尋 AutomationElement 物件時,都必須有一個起點。 這可以是任何項目,包括桌面、應用程式視窗或控制項。
所有項目都是從桌面的根項目繼承而來,而根項目是從靜態 AutomationElement.RootElement 屬性取得。
警告 |
---|
一般而言,您應嘗試只取得 RootElement 的直接子系。如果搜尋子代,可能會逐一查看數百,甚至數千個項目,因而造成堆疊溢位。如果您嘗試取得較低層級的特定項目,則應該從應用程式視窗或較低層級的容器開始搜尋。 |
技術支援使用條件
針對用來擷取 UI Automation項目的大多數技術,您必須指定 Condition,這是一組準則,用來定義要擷取哪些項目。
最簡單的條件就是 TrueCondition,這是預先定義的物件,指定要傳回搜尋範圍內的所有項目。 FalseCondition 則是 TrueCondition 的相反條件,但作用不大,因為它會使得任何項目都找不到。
另外還有三個預先定義的條件,可單獨使用或與其他條件搭配使用:ContentViewCondition、ControlViewCondition 和 RawViewCondition。 RawViewCondition 在單獨使用時相當於 TrueCondition,因為它不會依項目的 IsControlElement 或 IsContentElement 屬性過濾項目。
其他條件則是從一個或多個 PropertyCondition 物件建立而來,每一個都會指定屬性值。 例如,PropertyCondition 可能會指定項目已啟用,或支援特定的控制項模式。
條件可藉由建構 AndCondition、OrCondition 和 NotCondition 型別的物件,使用布林 (Boolean) 邏輯結合在一起。
搜尋範圍
使用 FindFirst 或 FindAll 所進行的搜尋,都必須有範圍和起點。
範圍會定義要從起點開始搜尋的空間。 這可包含項目本身、項目的同層級、父系、祖系、直接子系以及子代。
搜尋的範圍是由 TreeScope 列舉值的位元組合定義的。
尋找已知項目
若要尋找以 Name、AutomationId、其他屬性或屬性組合識別的已知項目,最簡單的方式就是使用 FindFirst 方法。 如果要搜尋的是應用程式視窗,則搜尋的起點可為 RootElement。
這種尋找 UI Automation項目的方式最適合用於自動化測試案例。
尋找子樹狀目錄中的項目
若要尋找所有符合已知項目相關之特定準則的項目,可以使用 FindAll。 例如,您可以使用此方法從清單或功能表擷取清單項目或功能表項目,或是識別對話方塊中的所有控制項。
查核子樹狀目錄
如果您先前並不清楚與用戶端一起使用的應用程式,可以使用 TreeWalker 類別建構內含所有需要項目的子樹狀目錄。 您的應用程式可能會執行此動作以回應焦點變更事件;也就是說,當應用程式或控制項接收輸入焦點時,UI 自動化用戶端會檢查焦點項目的子系並視情況檢查所有子代。
TreeWalker 的另一用途則是識別項目的祖系。 例如,藉由查核樹狀目錄,您可以識別控制項的父視窗。
要使用 TreeWalker,可以建立類別的物件 (即以傳遞 Condition 的方式定義所需的項目),或是使用下列其中一個預先定義的物件,這些物件是定義為 TreeWalker 的欄位。
只尋找 IsContentElement 屬性為 true 的項目。 |
|
只尋找 IsControlElement 屬性為 true 的項目。 |
|
尋找所有項目。 |
在取得 TreeWalker 之後,使用它相當容易。 您只要呼叫 Get 方法,即可在子樹狀目錄的項目之間巡覽。
Normalize 方法能用於由檢視以外的項目巡覽至樹狀子目錄中的項目。 例如,假設您已使用 ContentViewWalker 建立了子樹狀目錄的檢視。 接著您的應用程式收到通知,知道捲軸已接收輸入焦點。 由於捲軸不是內容項目,因此不會出現在樹狀子目錄的檢視中。 不過,您可以將代表捲軸的 AutomationElement 傳遞至 Normalize,然後擷取內容檢視中最接近的祖系。
擷取項目的其他方式
除了搜尋和巡覽之外,您還可以利用下列方式擷取 AutomationElement。
從事件
當應用程式接收 UI Automation事件時,傳遞到事件處理常式的來源物件便是一個 AutomationElement。 例如,如果您訂閱了焦點變更事件,傳遞到您的 AutomationFocusChangedEventHandler 即是接收焦點的項目。
如需詳細資訊,請參閱 訂閱 UI 自動化事件。
從點
如果您有螢幕座標 (例如游標位置),可以使用靜態 FromPoint 方法擷取 AutomationElement。
從視窗控制代碼
若要從 HWND 擷取 AutomationElement,請使用靜態 FromHandle 方法。
從焦點控制項
您可以從靜態 FocusedElement 屬性,擷取代表焦點控制項的 AutomationElement。