Получение элементов автоматизации пользовательского интерфейса

Примечание.

Эта документация предназначена для разработчиков .NET Framework, желающих использовать управляемые классы автоматизации пользовательского интерфейса, определенные в пространстве имен System.Windows.Automation. Последние сведения об автоматизации пользовательского интерфейса см. в статье API автоматизации Windows. Автоматизация пользовательского интерфейса.

В этом разделе описаны различные способы получения AutomationElement объектов для элементов пользовательского интерфейса.

Внимание

Если клиентское приложение может попытаться найти элементы в собственном пользовательском интерфейсе, необходимо выполнить все модель автоматизации пользовательского интерфейса вызовы в отдельном потоке. Для получения дополнительной информации см. UI Automation Threading Issues.

root, элемент

Любой поиск объектов AutomationElement должен иметь отправную точку. Это может быть любой элемент, включая рабочий стол, окно приложения или элемент управления.

Корневой элемент для рабочего стола, все элементы из которого являются потомками, получается из статического свойства AutomationElement.RootElement .

Внимание

В целом вы должны пытаться получить только прямые потомки RootElement. Поиск потомков может выполнять итерацию по сотням или даже тысячам элементов, что может привести к переполнению стека. Если вы пытаетесь получить определенный элемент на более низком уровне, необходимо запустить поиск из окна приложения или из контейнера на более низком уровне.

Условия

Для большинства методов, которые можно использовать для получения модель автоматизации пользовательского интерфейса элементов, необходимо указать Conditionнабор критериев, определяющих элементы, которые требуется извлечь.

Простейшим условием является TrueCondition, предопределенный объект, указывающий, что должны быть возвращены все элементы в области поиска. УсловиеFalseCondition, противоположное TrueCondition, менее целесообразно, так как может помешать поиску каких-либо элементов.

Три прочих предопределенных условия можно использовать отдельно или в сочетании с другими условиями: ContentViewCondition, ControlViewConditionи RawViewCondition. RawViewCondition, используемый самим собой, эквивалентен TrueConditionтому, что он не фильтрует элементы по их IsControlElement свойствам или IsContentElement свойствам.

Прочие условия создаются из одного или нескольких объектов PropertyCondition , каждый из которых задает значение свойства. Например, PropertyCondition может указывать, что элемент включен или что он поддерживает определенный шаблон элемента управления.

Условия могут объединяться с помощью булевой логики для формирования объектов типов AndCondition, OrConditionи NotCondition.

Область поиска

Поиск, выполняемый с помощью метода FindFirst или FindAll , должен иметь область, а также отправную точку.

Область определяет пространство вокруг отправной точки, в котором производится поиск. Область может включать сам элемент, элементы того же уровня, его родительский элемент, его предки, его непосредственные дочерние элементы и его потомки.

Область поиска определяется побитовым сочетанием значений из перечисления TreeScope .

Поиск известного элемента

Чтобы найти известный элемент, определяемый по его свойству Name, AutomationIdили некоторому другому свойству или сочетанию свойств, проще всего использовать метод FindFirst . Если искомый элемент — окно приложения, отправной точкой поиска может быть RootElement.

Этот способ поиска модель автоматизации пользовательского интерфейса элементов наиболее полезен в сценариях автоматического тестирования.

Поиск элементов в поддереве

Чтобы найти все элементы, удовлетворяющие определенным условиям, относящиеся к известному элементу, можно использовать метод FindAll. Например, этот метод можно использовать для извлечения элементов списка или элементов меню из списка или меню, а также для поиска всех элементов управления в диалоговом окне.

Обход поддерева

Если нет предварительных сведений о приложениях, с которыми может использоваться ваш клиент, вы можете построить поддерево всех интересующих элементов с помощью класса TreeWalker . Приложение может сделать это в ответ на событие изменения фокуса; т. е. когда приложение или элемент управления получает фокус ввода, клиент автоматизации пользовательского интерфейса проверяет дочерние элементы и, возможно, все потомки элемента, получившего фокус.

Кроме того, TreeWalker может использоваться для определения предков элемента. Например, обходя дерево, можно определить родительское окно элемента управления.

Вы можете использовать TreeWalker либо создавая объект класса (определяющий интересующие элементы, передавая Condition), либо используя один из следующих предопределенных объектов, которые заданы как поля TreeWalker.

Поле Description
ContentViewWalker Поиск только тех элементов, свойство IsContentElement которых имеет значение true.
ControlViewWalker Поиск только тех элементов, свойство IsControlElement которых имеет значение true.
RawViewWalker Поиск всех элементов.

После получения объекта TreeWalkerиспользовать его несложно. Просто вызывайте методы Get для навигации по элементам поддерева.

Метод Normalize может использоваться для перехода к элементу в поддереве из другого элемента, который не является частью представления. Предположим, что вы создали представление поддерева с помощью ContentViewWalker. Далее ваше приложение получает уведомление, что полоса прокрутки получила фокус ввода. Поскольку полоса прокрутки не является элементом содержимого, она отсутствует в представлении поддерева. Однако вы можете передать элемент AutomationElement , представляющий полосу прокрутки, в метод Normalize и получить его ближайшего предка, который находится в представлении содержимого.

Другие способы получения элемента

В дополнение к поиску и навигации вы можете получать элемент AutomationElement следующими способами.

Из события

Когда приложение получает событие модель автоматизации пользовательского интерфейса, исходный объект, переданный обработчику событий, является AutomationElement. Например, если вы подписаны на события изменения фокуса, в качестве исходного объекта в ваш AutomationFocusChangedEventHandler передается элемент, который получил фокус.

Дополнительные сведения см. в разделе Subscribe to UI Automation Events.

Из точки

Если имеются координаты экрана (например, позиция курсора), можно получить AutomationElement с помощью статического метода FromPoint .

Из дескриптора окна

Для получения AutomationElement из HWND используйте статический метод FromHandle .

Из элемента управления с фокусом

Вы можете получить AutomationElement , представляющий элемент управления с фокусом, из статического свойства FocusedElement .

См. также