Obtener elementos de UI Automation
En este tema se describen varias maneras de obtener interfaces IUIAutomationElement para los elementos de la interfaz de usuario.
IUIAutomationElement se usa en la aplicación de ejemplo de cliente de contenido del documento Automatización de la interfaz de usuario.
Elemento raíz
Aunque los elementos se pueden recuperar directamente mediante métodos, como IUIAutomation::GetFocusedElement, algunas aplicaciones cliente necesitan una vista de la estructura jerárquica de los elementos, conocida como árbol de automatización de la interfaz de usuario. El elemento raíz de esta jerarquía es el escritorio. Puede obtener este elemento mediante los métodos IUIAutomation::GetRootElement o IUIAutomation::GetRootElementBuildCache. Ambos métodos recuperan un puntero de interfaz IUIAutomationElement. Puede buscar elementos descendientes mediante métodos comoIUIAutomationElement::FindFirst y FindAll.
Nota:
En general, debe intentar obtener solo elementos secundarios directos del elemento raíz. Una búsqueda de descendientes puede iterar por cientos o miles de elementos. 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 las técnicas que se usan para recuperar elementos de automatización de la interfaz de usuario, debe especificar una condición. Una condición es un conjunto de criterios que define los elementos que se quieren recuperar. Una condición se representa mediante la interfaz IUIAutomationCondition.
La condición más sencilla es la condición true, que es un objeto predefinido que especifica que se van a devolver todos los elementos del ámbito de búsqueda. La condición false es la contraria a la condición true y es menos útil, ya que impedirá que se encuentren elementos. Puede obtener una interfaz a la condición true mediante IUIAutomation::CreateTrueCondition.
Otras tres condiciones predefinidas, disponibles como propiedades en el objeto IUIAutomation, se pueden usar solas o en combinación con otras condiciones: IUIAutomation::ContentViewCondition, ControlViewCondition y RawViewCondition. RawViewCondition, usado por sí mismo, es equivalente a la condición true, ya que no filtra los elementos por las propiedades IUIAutomationElement::CurrentIsControlElement ni CurrentIsContentElement.
Otras condiciones se crean a partir de objetos de condición y cada una especifica un valor de propiedad. Por ejemplo, una condición de propiedad podría especificar que el elemento está habilitado o que admite un patrón de control determinado.
Las condiciones que usan lógica booleana se pueden combinar mediante la llamada a IUIAutomation::CreateAndCondition, CreateOrCondition, CreateNotCondition y métodos relacionados.
Ámbito de búsqueda
Las búsquedas realizadas mediante IUIAutomationElement::FindFirst o FindAll deben tener un ámbito y un punto de partida.
Nota:
Cualquier comentario sobre estos dos métodos también se aplica a IUIAutomationElement::FindFirstBuildCache y FindAllBuildCache.
El ámbito define el espacio alrededor del punto de partida que se va a buscar. Esto puede incluir el propio elemento, sus elementos relacionados, su elemento primario, sus elementos secundarios inmediatos y sus descendientes. Tenga en cuenta que los métodos Find no admiten la búsqueda en el árbol de automatización de la interfaz de usuario de Microsoft; es decir, no se admite la búsqueda de elementos antecesores.
El ámbito de una búsqueda se define mediante una combinación bit a bit de valores del tipo enumerado TreeScope.
Búsqueda de un elemento conocido
Para buscar un elemento conocido identificado por nombre, id. de automatización o alguna otra propiedad o combinación de propiedades, es más fácil usar el método IUIAutomationElement::FindFirst. Si el elemento buscado es una ventana de aplicación, el punto inicial de la búsqueda puede ser el elemento raíz.
Esta forma de buscar elementos UI Automation es especialmente útil en escenarios de pruebas automatizadas.
Para obtener un ejemplo de código en el que se muestra cómo buscar un elemento conocido, vea Búsqueda de un elemento por nombre.
Búsqueda de elementos en un subárbol
Para buscar todos los elementos que cumplen criterios específicos y están relacionados con un elemento conocido, puede llamar a IUIAutomationElement::FindAll en el elemento conocido. Por ejemplo, use este método para recuperar elementos de lista o de menú de una lista o un menú, o bien para identificar todos los controles de un cuadro de diálogo.
Para obtener un ejemplo de código en el que se muestra cómo buscar elementos en un subárbol, vea Búsqueda de elementos relacionados.
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 mediante IUIAutomationTreeWalker. El cliente podría hacerlo, por ejemplo, en respuesta a un evento de cambio de foco; es decir, cuando una aplicación o control recibe el foco de entrada, el cliente de automatización de la interfaz de usuario examina los elementos secundarios y, posiblemente, todos los descendientes del elemento con el foco.
Tenga en cuenta que recorrer el árbol de automatización de la interfaz de usuario consume muchos recursos. Recorra el árbol solo cuando no sea factible usar los métodos IUIAutomationElement::FindFirst, FindAll o BuildUpdatedCache.
Puede definir un recorrido propio por el árbol si pasa una condición personalizada a IUIAutomation::CreateTreeWalker, o bien puede usar uno de los siguientes objetos predefinidos que se definen como propiedades de la instancia base de IUIAutomation.
Object | Objetivo |
---|---|
ContentViewWalker | Busca solo los elementos cuya propiedad IUIAutomationElement::CurrentIsContentElement es TRUE. |
ControlViewWalker | Busca solo los elementos cuya propiedad IUIAutomationElement::CurrentIsControlElement es TRUE. |
RawViewWalker | Busca todos los elementos. |
Después de obtener una instancia de IUIAutomationTreeWalker, llame a los métodos IUIAutomationTreeWalker::GetXxx para navegar por los elementos del subárbol, y pasar el elemento desde el que se inicia el recorrido.
El método IUIAutomationTreeWalker::Normalize se puede usar para navegar a un elemento del subárbol desde otro elemento que no forma parte de la vista. Por ejemplo, imagine que crea una vista de un subárbol mediante IUIAutomation::ContentViewWalker. La aplicación recibe una 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. Pero puede pasar la instancia de IUIAutomationElement que representa la barra de desplazamiento a IUIAutomationTreeWalker::Normalize y recuperar el antecesor más cercano que se encuentra en la vista de contenido.
Para obtener ejemplos de código en los que se muestra cómo usar la interfaz IUIAutomationTreeWalker, vea Procedimiento para recorrer el árbol de automatización de la interfaz de usuario.
Otras maneras de recuperar un elemento
Además de las búsquedas y la navegación, puede recuperar una instancia de IUIAutomationElement de las siguientes maneras.
Desde un evento
Cuando la aplicación recibe un evento de automatización de la interfaz de usuario, el objeto de origen pasado al controlador de eventos se representa mediante una instancia de IUIAutomationElement. Por ejemplo, si se suscribe a eventos modificados por el foco, el origen pasado a IUIAutomationFocusChangedEventHandler es el elemento que ha recibido el foco. Para más información, vea Suscripción a eventos de automatización de la interfaz de usuario.
Desde un punto
Para recuperar una instancia de IUIAutomationElement de coordenadas de pantalla, por ejemplo, una posición del cursor, use el método IUIAutomation::ElementFromPoint.
Desde un identificador de ventana
Para recuperar una instancia de IUIAutomationElement de HWND, use el método IUIAutomation::ElementFromHandle.
Desde el control con el foco
Para recuperar una instancia de IUIAutomationElement que representa el control con el foco, use el método IUIAutomation::GetFocusedElement.