프로그래밍 기술/소프트웨어 접근성, UI 자동화

[S/W 접근성] AutomationElement 메서드

언제나휴일 2016. 4. 19. 10:15
반응형

3.2 AutomationElement 메서드

 

 AutomationElement 클래스에는 특정 조건에 맞는 자동화 요소를 탐색하거나 어떠한 패턴에 해당하는지 검색하는 등의 작업을 할 수 있게 다양한 메서드를 제공하고 있습니다.

 

메서드 명

형식

FindAll

조건에 맞는 자동화 요소 개체를 탐색

FindFirst

조건에 맞는 첫 번째 자식이나 하위 요소를 검색

FromHandle

창 핸들에서 참조하는 자동화 요소 개체 검색(정적)

FromLocalProvider

공급자 개체에서 자동화 요소 개체 검색(정적)

FromPoint

데스크톱의 특정 지점에 있는 자동화 요소 개체 검색(정적)

GetCachedPattern

캐시에 지정된 패턴 검색

GetCachedPropertyValue

캐시에서 특정 속성 값 검색

GetClickablePoint

클릭할 수 있는 지점 검색

GetCurrentPattern

패턴 검색

GetCurretnPropertyValue

속성 값을 검색

GetRuntimeId

식별자 검색

GetSupportedPatterns

지원하는 컨트롤 패턴 검색

GetSupportedProperties

지원하는 속성 식별자 검색

GetUpdatedCache

캐시가 업데이트된 자동화 요소 검색

SetFocus

포커스 설정

TryGetCachedPattern

캐시에서 컨트롤 패턴 검색

TryGetClickablePoint

클릭할 수 있는 위치 검색

TryGetCurrentPattern

컨트롤 패턴 검색

[ 3.3] AutomationElement 메서드 

  

 FindFirst는 입력 인자로 전달한 조건에 만족하는 첫 번째 자식 요소 혹은 하위 요소를 반환하며 FindAll은 조건에 만족하는 모든 요소를 반환합니다.

public AutomationElement FindFirst(TreeScope scope, Condition condition);

public AutomationElementCollection FindFirst(TreeScope scope, Condition condition);

 

 검색 조건으로 TreeScope는 요소의 범위를 지정하기 위한 열거형입니다. TreeScope는 논리 연산으로 범위를 세부적으로 지정할 수 있습니다.

 

멤버 이름

설명

Ancestors

상위 항목을 포함

Children

지계 자식

Descendants

하위 항목

Element

자신

Parent

상위 요소(지원하지 않음)

Subtree

서브 트리

[3.4] TreeScope 열거형 멤버

 

 검색 조건으로 Condition은 필터링에 사용할 조건입니다. 다음은 모든 자식 요소의 개수를 구하는 로직입니다.

Condition condition = new OrCondition(

                Condition.TrueCondition,

                Condition.FalseCondition);

AutomationElementCollection aec = null;

aec = ae.FindAll(TreeScope.Children, condition);

Console.WriteLine("자식수:{0}", aec.Count);

  

AutomationElement 클래스에는 요소를 탐색할 때 사용하는 세 가지 정적 메서드를 제공합니다. FromHandle Native 윈도우 핸들(Win32API HWND ) FromLoaclProvider는 공급자 개체로 FromPoint는 특정 지점을 인자로 받아 해당하는 자동화 요소를 반환하는 메서드입니다.

public static AutomationElement FromHandle ( IntPtr hwnd);

public static AutomationElement FromLocalProvider (IRawElementProviderSimple ps);

public static AutomationElement FromPoint(Point pt);

 

 그리고 AutomationElement 클래스의 정적 속성 RootElement을 제공하여 데스크톱의 자동화 요소 개체를 참조할 수 있습니다.

AutomationElement ae = AutomationElement.RootElement;

 

 그리고 자동화 요소 개체의 Current 속성의 BoundingRectangle 속성으로 사각 영역을 얻어올 수 있습니다. 참고로 Rect 형식은 WindowsBase.dll에 정의하고 있으니 해당 어셈블리를 참조합니다.

Rect rect = ae.Current.BoundingRectangle;

 

 이렇게 데스크톱 요소의 사각 영역을 얻어오면 화면의 너비와 높이를 확인할 수 있습니다.

AutomationElement ae = AutomationElement.RootElement;

Rect rect = ae.Current.BoundingRectangle;

 

 그리고 얻어온 사각 영역의 정보와 FromPoint를 이용하여 현재 화면에 보이는 UI 요소를 탐색할 수 있습니다.

for (int x = 0; x < rect.Right; x=x+20)

{

    for (int y = 0; y < rect.Bottom; y+=20)

    {

        sae = AutomationElement.FromPoint(new Point(x, y));

        dictionary[sae.Current.NativeWindowHandle] = sae;

        Console.Write(".");

    }

}

 



Program.cs


using System;

using System.Windows.Automation;

using System.Windows;

using System.Collections.Generic;

 

namespace _요소탐색_위치정보이용

{

    class Program

    {

        static void Main(string[] args)

        {

            AutomationElement ae = AutomationElement.RootElement;

            Rect rect = ae.Current.BoundingRectangle;

            AutomationElement sae;

            Dictionary<int, AutomationElement> dictionary =

                       new Dictionary<int, AutomationElement>();

 

            for (int x = 0; x < rect.Right; x=x+20)

            {

                for (int y = 0; y < rect.Bottom; y+=20)

                {

                    sae = AutomationElement.FromPoint(new Point(x, y));

                    dictionary[sae.Current.NativeWindowHandle] = sae;

                    Console.Write(".");

                }

            }

            Console.WriteLine("요소 개수:{0}", dictionary.Count);

 

            foreach (AutomationElement dae in dictionary.Values)

            {

                ViewAEInfo(dae);

            }

            Console.ReadKey();

        }

 

        private static void ViewAEInfo(AutomationElement ae)

        {

            Console.WriteLine("요소명:{0}", ae.Current.Name);

            Console.WriteLine("사각영역:{0}", ae.Current.BoundingRectangle);

            Console.WriteLine("클래스 이름:{0}", ae.Current.ClassName);

            Console.WriteLine("컨트롤 유형:{0}",

                          ae.Current.ControlType.ProgrammaticName);

            if (ae.Current.LabeledBy != null)

            {

                Console.WriteLine("LabledBy 이름:{0}",

                              ae.Current.LabeledBy.Current.Name);

            }

            Console.WriteLine("윈도우 창 핸들:{0}", ae.Current.NativeWindowHandle);

            Console.WriteLine("프로세스 ID:{0}", ae.Current.ProcessId);

        }

    }

}

[소스 3.1] 화면 좌표로 UI 요소 탐색


화면 좌표로 UI 요소 탐색



반응형