Obtendo elementos de automação da interface do usuário
Nota
Esta documentação destina-se a desenvolvedores do .NET Framework que desejam usar as classes de automação da interface do usuário gerenciadas definidas no System.Windows.Automation namespace. Para obter as informações mais recentes sobre a automação da interface do usuário, consulte API de automação do Windows: automação da interface do usuário.
Este tópico descreve as várias maneiras de obter AutomationElement objetos para elementos da interface do usuário (UI).
Atenção
Se seu aplicativo cliente pode tentar localizar elementos em sua própria interface do usuário, você deve fazer todas as chamadas de automação da interface do usuário em um thread separado. Para obter mais informações, consulte Problemas de threading de automação da interface do usuário.
Elemento raiz
Todas as pesquisas por AutomationElement objetos devem ter um ponto de partida. Pode ser qualquer elemento, incluindo a área de trabalho, uma janela do aplicativo ou um controle.
O elemento raiz para a área de trabalho, do qual todos os elementos são descendentes, é obtido da propriedade estática AutomationElement.RootElement .
Atenção
Em geral, você deve tentar obter apenas filhos diretos do RootElement. Uma busca por descendentes pode iterar através de centenas ou até milhares de elementos, possivelmente resultando em um estouro de pilha. Se você estiver tentando obter um elemento específico em um nível inferior, você deve iniciar sua pesquisa a partir da janela do aplicativo ou de um contêiner em um nível inferior.
Condições
Para a maioria das técnicas que você pode usar para recuperar elementos de automação da interface do usuário, você deve especificar um Condition, que é um conjunto de critérios que definem quais elementos você deseja recuperar.
A condição mais simples é TrueCondition, um objeto predefinido especificando que todos os elementos dentro do escopo de pesquisa devem ser retornados. FalseCondition, o inverso de TrueCondition, é menos útil, pois impediria que quaisquer elementos fossem encontrados.
Três outras condições predefinidas podem ser usadas isoladamente ou em combinação com outras condições: ContentViewCondition, ControlViewCondition, e RawViewCondition. RawViewCondition, usado por si só, é equivalente a TrueCondition, porque não filtra elementos por suas IsControlElement propriedades ou IsContentElement propriedades.
Outras condições são construídas a partir de um ou mais PropertyCondition objetos, cada um dos quais especifica um valor de propriedade. Por exemplo, um PropertyCondition pode especificar que o elemento está habilitado ou que ele suporta um determinado padrão de controle.
As condições podem ser combinadas usando a lógica booleana construindo objetos dos tipos AndCondition, OrCondition, e NotCondition.
Âmbito da Pesquisa
As pesquisas feitas usando FindFirst ou FindAll devem ter um escopo, bem como um local de partida.
O escopo define o espaço em torno do local de partida que deve ser pesquisado. Isso pode incluir o próprio elemento, seus irmãos, seu pai, seus antepassados, seus filhos imediatos e seus descendentes.
O escopo de uma pesquisa é definido por uma combinação bit a bit de valores da TreeScope enumeração.
Localizando um elemento conhecido
Para encontrar um elemento conhecido, identificado por seu Name, AutomationIdou alguma outra propriedade ou combinação de propriedades, é mais fácil usar o FindFirst método. Se o elemento procurado for uma janela de aplicação, o ponto de partida da pesquisa pode ser o RootElement.
Essa maneira de encontrar elementos de automação da interface do usuário é mais útil em cenários de teste automatizado.
Localizando elementos em uma subárvore
Para localizar todos os elementos que atendem a critérios específicos relacionados a um elemento conhecido, você pode usar FindAll. Por exemplo, você pode usar esse método para recuperar itens de lista ou itens de menu de uma lista ou menu, ou para identificar todos os controles em uma caixa de diálogo.
Caminhando por uma subárvore
Se você não tem conhecimento prévio dos aplicativos com os quais seu cliente pode ser usado, você pode construir uma subárvore de todos os elementos de interesse usando a TreeWalker classe. Seu aplicativo pode fazer isso em resposta a um evento de mudança de foco; ou seja, quando um aplicativo ou controle recebe foco de entrada, o cliente de automação da interface do usuário examina filhos e talvez todos os descendentes do elemento focado.
Outra maneira em que TreeWalker pode ser usado é para identificar os antepassados de um elemento. Por exemplo, subindo a árvore, você pode identificar a janela pai de um controle.
Você pode usar TreeWalker criando um objeto da classe (definindo os elementos de interesse passando um Condition) ou usando um dos seguintes objetos predefinidos que são definidos como campos de TreeWalker.
Campo | Descrição |
---|---|
ContentViewWalker | Localiza apenas elementos cuja IsContentElement propriedade é true . |
ControlViewWalker | Localiza apenas elementos cuja IsControlElement propriedade é true . |
RawViewWalker | Localiza todos os elementos. |
Depois de obter um TreeWalker, usá-lo é simples. Basta chamar os métodos para navegar entre os Get
elementos da subárvore.
O Normalize método pode ser usado para navegar até um elemento na subárvore a partir de outro elemento que não faz parte da exibição. Por exemplo, suponha que você tenha criado uma exibição de uma subárvore usando ContentViewWalker. Em seguida, seu aplicativo recebe uma notificação de que uma barra de rolagem recebeu o foco de entrada. Como uma barra de rolagem não é um elemento de conteúdo, ela não está presente na sua exibição da subárvore. No entanto, você pode passar a AutomationElement barra de rolagem que Normalize representa e recuperar o ancestral mais próximo que está na exibição de conteúdo.
Outras maneiras de recuperar um elemento
Além de pesquisas e navegação, você pode recuperar um AutomationElement das seguintes maneiras.
De um Evento
Quando seu aplicativo recebe um evento de Automação da Interface do Usuário, o objeto de origem passado para o manipulador de eventos é um AutomationElementarquivo . Por exemplo, se você se inscreveu em eventos com alteração de foco, a fonte passada para você AutomationFocusChangedEventHandler é o elemento que recebeu o foco.
Para obter mais informações, consulte Inscrever-se em eventos de automação da interface do usuário.
De um ponto
Se você tiver coordenadas de tela (por exemplo, uma posição do cursor), você pode recuperar um AutomationElement usando o método estático FromPoint .
A partir de uma alça de janela
Para recuperar um AutomationElement de um HWND, use o método estático FromHandle .
Do controle focado
Você pode recuperar um AutomationElement que representa o controle focado da propriedade estática FocusedElement .