Obtener elementos de UI Automation

Nota

Esta documentación está dirigida a los desarrolladores de .NET Framework que quieran usar las clases de automatización de la interfaz de usuario administradas definidas en el espacio de nombres System.Windows.Automation. Para ver la información más reciente acerca de la automatización de la interfaz de usuario, consulte Windows Automation API: automatización de la interfaz de usuario.

Este tema describe las distintas formas de obtener objetos AutomationElement para los elementos de la interfaz de usuario (UI).

Precaución

Si la aplicación cliente intenta buscar elementos en su propia interfaz de usuario, debe realizar todos las llamadas a UI Automation en un subproceso independiente. Para obtener más información, consulta UI Automation Threading Issues.

Elemento raíz

Todas las búsquedas de objetos AutomationElement deben tener un punto de inicio. Puede ser cualquier elemento, incluidos el escritorio, una ventana de aplicación o un control.

El elemento raíz para el escritorio, del que descienden todos los elementos, se obtiene de la propiedad estática AutomationElement.RootElement .

Precaución

En general, debe intentar obtener solo elementos secundarios directos del elemento RootElement. Una búsqueda de descendientes puede iterar a través de cientos o incluso miles de elementos, lo que posiblemente provocaría un desbordamiento de pila. Si intenta obtener un elemento concreto en un nivel inferior, debe iniciar la búsqueda desde la ventana de aplicación o desde un contenedor en un nivel inferior.

Condiciones

Para la mayoría de técnicas que puede usar para recuperar elementos UI Automation, debe especificar un elemento Condition, que es un conjunto de criterios que definen los elementos que quiere recuperar.

La condición más simple es TrueCondition, un objeto predefinido que especifica que se devolverán todos los elementos dentro del ámbito de búsqueda. FalseCondition, que es el elemento opuesto de TrueCondition, no es tan útil, ya que impediría que se encontraran elementos.

Hay otras tres condiciones predefinidas que se pueden utilizar por sí solas o en combinación con otras condiciones: ContentViewCondition, ControlViewConditiony RawViewCondition. RawViewCondition, por sí sola, equivale a TrueCondition, porque no filtra los elementos por sus propiedades IsControlElement o IsContentElement .

Otras condiciones se componen de uno o varios objetos PropertyCondition , cada uno de los cuales especifica un valor de propiedad. Por ejemplo, un elemento PropertyCondition podría especificar que el elemento está habilitado o que admite un patrón de control determinado.

Las condiciones se pueden combinar con lógica booleana, mediante la construcción de objetos de tipos AndCondition, OrConditiony NotCondition.

Ámbito de búsqueda

Las búsquedas realizadas con FindFirst o FindAll deben tener un ámbito así como un punto de inicio.

El ámbito define el espacio alrededor del punto de inicio en el que se va a buscar. Esto podría incluir el propio elemento, sus elementos relacionados, su elemento primario, sus antecesores, sus elementos secundarios inmediatos y sus descendientes.

El ámbito de una búsqueda se define mediante una combinación bit a bit de valores de la enumeración TreeScope .

Búsqueda de un elemento conocido

Para buscar un elemento conocido, identificado por su Name, AutomationIdo alguna otra propiedad o combinación de propiedades, lo más fácil es utilizar el método FindFirst . Si el elemento que se busca es una ventana de aplicación, el punto inicial de la búsqueda puede ser el elemento RootElement.

Esta forma de buscar elementos UI Automation es especialmente útil en escenarios de pruebas automatizadas.

Búsqueda de elementos en un subárbol

Para encontrar todos los elementos que cumplan criterios concretos relacionados con un elemento conocido, puede utilizar FindAll. Por ejemplo, podría utilizar este método para recuperar elementos de lista o elementos de menú de una lista o un menú, o para identificar todos los controles de un cuadro de diálogo.

Recorrer un subárbol

Si no tiene conocimiento previo de las aplicaciones con las que se puede usar el cliente, puede construir un subárbol de todos los elementos de interés con la clase TreeWalker . La aplicación podría hacer esto en respuesta a un evento de cambio de foco; es decir, cuando una aplicación o un control recibe el foco de entrada, el cliente de Automatización de la interfaz de usuario examina los elementos secundarios y quizás todos los descendientes del elemento en el que está el foco.

Otra forma en que se puede utilizar TreeWalker es para identificar los antecesores de un elemento. Por ejemplo, al recorrer el árbol en sentido ascendente, se puede identificar la ventana primaria de un control.

Puede usar TreeWalker mediante la creación de un objeto de la clase (definiendo los elementos de interés pasando un elemento Condition) o mediante uno de los siguientes objetos predefinidos que se definen como campos de TreeWalker.

Campo Descripción
ContentViewWalker Busca únicamente los elementos cuya propiedad IsContentElement sea true.
ControlViewWalker Busca únicamente los elementos cuya propiedad IsControlElement sea true.
RawViewWalker Busca todos los elementos.

Después de haber obtenido un elemento TreeWalker, su uso es sencillo. Basta con llamar a los métodos Get para navegar entre elementos del subárbol.

El método Normalize puede utilizarse para desplazarse a un elemento del subárbol desde otro elemento que no forma parte de la vista. Por ejemplo, suponga que ha creado una vista de un subárbol mediante ContentViewWalker. Después, la aplicación recibe la notificación de que una barra de desplazamiento ha recibido el foco de entrada. Como una barra de desplazamiento no es un elemento de contenido, no está presente en la vista del subárbol. Sin embargo, puede pasar el elemento AutomationElement que representa la barra de desplazamiento a Normalize y recuperar el antecesor más cercano que se encuentra en la vista de contenido.

Otras maneras de recuperar un elemento

Además de las búsquedas y la navegación, puede recuperar un elemento AutomationElement de las maneras siguientes.

Desde un evento

Cuando la aplicación recibe un evento UI Automation , el objeto de origen que se pasa al controlador de eventos es un elemento AutomationElement. Por ejemplo, si se ha suscrito a eventos de cambio de foco, el origen que se pasó a su AutomationFocusChangedEventHandler es el elemento que recibió el foco.

Para obtener más información, consulta Subscribe to UI Automation Events.

Desde un punto

Si tiene coordenadas de pantalla (por ejemplo, una posición del cursor), puede recuperar un elemento AutomationElement con el método estático FromPoint .

Desde un identificador de ventana

Para recuperar un elemento AutomationElement desde un HWND, use el método estático FromHandle .

Desde el control con el foco

Puede recuperar un elemento AutomationElement que representa el control con el foco desde la propiedad estática FocusedElement .

Consulte también