UI 자동화 기술에서는 UI 자동화 트리를 탐색하는 메서드와 속성을 제공하는 TreeWalker 클래스를 제공합니다.
네임스페이스: System.Windows.Automation
어셈블리: UIAutomationClient (UIAutomationClient.dll)
TreeWalker 클래스는 정적 멤버 필드인 ContentViewWalker, ControlViewWalker, RawViewWalker 를 제공합니다.
![[그림 4.1] TreeWalker 클래스 다이어그램](http://ehpub.dothome.co.kr/wp-content/uploads/2022/04/그림-4.1-TreeWalker-클래스-다이어그램.png)
그리고 TreeWalker의 생성자에서는 TreeWalker에서 탐색할 UI 자동화 요소 트리의 뷰를 인자로 받습니다. TreeWalker 클래스는 개체의 뷰를 정의하는 Condition 속성을 통해 가져오기 할 수 있으며 다양한 형태로 탐색할 수 있는 메서드들을 제공합니다.
TreeWalker 클래스의 생성자는 탐색할 UI 자동화 요소 트리의 뷰를 정의하는 Conditon 속성을 전달 받습니다.
public TreeWalker(Condition condition)
예를 들어 컨트롤 요소이면서 활성화 상태인 자동화 요소를 탐색하기 위한 TreeWalker를 생성한다면 다음과 같은 코드를 사용할 수 있습니다.
Condition cond1 = new PropertyCondition(AutomationElement.IsControlElementProperty, true); Condition cond2 = new PropertyCondition(AutomationElement.IsEnabledProperty, true); TreeWalker walker = new TreeWalker(new AndCondition(cond1, cond2));
이와 같이 생성한 TreeWalker 개체는 다양한 탐색 기능을 이용하여 원하는 조건의 자동화 요소를 탐색할 수 있습니다. 만약 TreeWalker를 이용하여 자동화 요소의 첫번째 자식을 탐색한다면 다음과 같습니다.
AutomationElement child = walker.GetFirstChild(ae);
이처럼 TreeWalker 개체를 이용하면 원하는 조건의 자동화 요소를 쉽게 탐색할 수 있습니다.
TreeWalker 클래스는 정적 TreeWalker로 RawViewWalker, ControlViewWalker, ControlViewWalker를 제공하고 있습니다.
public static readonly TreeWalker RawViewWalker; public static readonly TreeWalker ControlViewWalker; public static readonly TreeWalker ContentViewWalker;
만약 특정 조건없이 UI 자동화 트리에서 원하는 UI 자동화 요소를 탐색하고자 한다면 적정 TreeWalker를 이용할 수 있습니다. RawViewWalker는 필터링 없는 전체 UI 자동화 트리에서 탐색을 제공합니다. 그리고 ControlViewWalker는 UI 자동화 트리에서 컨트롤만 탐색을 원할 때 사용할 수 있습니다. ContentViewWalker는 UI 자동화 트리에서 컨텐츠만 탐색을 원할 때 사용할 수 있습니다.
private void WalkTree(TreeWalker walker, WrapAE wae, TreeNode tn) { TreeWalker 개체의 GetFirstChild 메서드에 자동화 요소 개체를 전달하여 첫번째 자식 요소를 탐색합니다. AutomationElement child = walker.GetFirstChild(wae.AE); 자식이 있다면 다음을 반복합니다. while (child != null) { 탐색한 자식 요소를 래핑한 개체를 생성합니다. WrapAE cae = new WrapAE(child); 생성한 개체의 정보를 인자로 입력 인자로 전달받은 트리 노드에 추가합니다. TreeNode ctn = tn.Nodes.Add(cae.ToString()); 그리고 트리 노드의 추가 메서드에서 반환한 트리 노드의 Tag 속성에 래핑한 개체를 설정합니다. 컨트롤에는 트리 노드의 정보와 매핑할 추가적인 정보를 보관하기 위해 Tag 속성을 제공하고 있습니다. ctn.Tag = cae; 재귀적으로 WalkTree를 호출합니다. WalkTree(walker,cae, ctn); TreeWalker 개체의 GetNextSibling 메서드를 이용하여 다음 형제를 탐색합니다. child = walker.GetNextSibling(child); } } public TreeNode FindRawTree() { 래핑한 자동화 요소 개체 정보를 인자로 트리 노드 개체를 생성합니다. TreeNode tn = new TreeNode(wae.ToString()); WalkTree 메서드에 RawViewWaker와 래핑한 자동화 요소 개체 및 생성한 트리 노드를 전달하여 자동화 요소 개체의 계층 구조에 맞게 노드를 구성합니다. WalkTree(TreeWalker.RawViewWalker,wae, tn); return tn; }
다음은 계산기의 프로그램용 보기 상태에서 Bin 라디오 버튼을 선택하였을 때 활성화 상태의 컨트롤 목록을 트리 뷰 목록에 추가한 화면입니다.
이와 같이 특정 조건에 맞는 UI 자동화 트리를 원한다면 조건 개체를 입력 인자로 TreeWalker 개체를 생성하여 탐색하여야 할 것입니다.
![[그림 4.2] 활성화 컨트롤 UI 트리](http://ehpub.dothome.co.kr/wp-content/uploads/2022/04/그림-4.2-활성화-컨트롤-UI-트리.png)
다음은 계산기의 프로그램용 보기 상태에서 Bin 라디오 버튼을 선택하였을 때 계산기 창의 서브 트리에 있는 전체 UI 자동화 요소를 탐색하여 TreeView 항목에 추가한 화면입니다. 이처럼 조건없이 전체 UI 자동화 요소를 탐색할 때는 TreeWalker의 정적 개체인 RawViewWalker를 이용하여 탐색합니다.
![[그림 4.3] Raw UI 트리](http://ehpub.dothome.co.kr/wp-content/uploads/2022/04/그림-4.3-Raw-UI-트리.png)
다음은 계산기의 프로그램용 보기 상태에서 Bin 라디오 버튼을 선택하였을 때 계산기 창의 서브 트리에 있는 전체 컨트롤 UI 자동화 요소를 탐색하여 TreeView 항목에 추가한 화면입니다. 이처럼 전체 컨트롤 UI 자동화 요소를 탐색할 때는 TreeWalker의 정적 개체인 ControlViewWalker를 이용하여 탐색합니다.
![[그림 4.4] Control UI 트리](http://ehpub.dothome.co.kr/wp-content/uploads/2022/04/그림-4.4-Control-UI-트리.png)
다음은 계산기의 프로그램용 보기 상태에서 Bin 라디오 버튼을 선택하였을 때 계산기 창의 서브 트리에 있는 전체 컨텐츠 UI 자동화 요소를 탐색하여 TreeView 항목에 추가한 화면입니다. 이처럼 전체 컨텐츠 UI 자동화 요소를 탐색할 때는 TreeWalker의 정적 개체인 ContentViewWalker를 이용하여 탐색합니다.
![[그림 4.5] Content UI 트리](http://ehpub.dothome.co.kr/wp-content/uploads/2022/04/그림-4.5-Content-UI-트리.png)
TreeWalker 클래스는 트리에서 다양한 UI 자동화 요소를 탐색하는 메서드를 제공합니다. 첫번째 자식, 다음 자식, 이전 자식, 마지막 자식, 부모를 찾는 메서드를 제공하고 있습니다. 그리고 특정 UI 자동화 요소가 TreeWalker의 조건에 맞으면 자신을 반환하고 그렇지 않으면 조건에 맞는 부모나 상위 UI 자동화 요소를 반환하는 메서드를 제공합니다.
public AutomationElement GetFirstChild(AutomationElement element) public AutomationElement GetFirstChild(AutomationElement element, CacheRequest request) public AutomationElement GetLastChild(AutomationElement element) public AutomationElement GetLastChild(AutomationElement element, CacheRequest request) public AutomationElement GetNextSibling(AutomationElement element) public AutomationElement GetNextSibling(AutomationElement element, CacheRequest request) public AutomationElement GetParent(AutomationElement element) public AutomationElement GetParent(AutomationElement element,CacheRequest request) public AutomationElement GetPreviousSibling(AutomationElement element) public AutomationElement GetPreviousSibling(AutomationElement element, CacheRequest request) public AutomationElement Normalize(AutomationElement element) public AutomationElement Normalize(AutomationElement element, CacheRequest request)
다음은 RawViewWalker를 이용하여 특정 UI 자동화 요소의 자식을 찾는 예제입니다.
TreeWalker tw = TreeWalker.RawViewWalker; AutomationElement child = tw.GetPreviousSibling(ae);
이처럼 찾고자 하는 자동화 요소가 무엇인지에 따라 원하는 메서드를 사용할 수 있습니다. 참고로 CacheRequest 개체를 입력 인자로 받는 탐색 메서드는 CacheRequest 개체에 필터 조건을 설정하여 CacheRequest 조건에 맞는 자동화 요소를 탐색할 수 있습니다.