Obtendo elementos da automação interface do usuário
Observação
Esta documentação destina-se a desenvolvedores de .NET Framework que querem usar as classes da Automação da Interface do Usuário gerenciadas definidas no namespace System.Windows.Automation. Para obter as informações mais recentes sobre a Automação da Interface do Usuário, confira 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 de interface do usuário.
Cuidado
Se o aplicativo cliente tentar encontrar elementos em sua própria interface do usuário, você deverá fazer todas as chamadas Automação da Interface do Usuário em um thread separado. Para obter mais informações, consulte Automação da Interface do Usuário Problemas de Threading.
Elemento Root
Todas as pesquisas de AutomationElement objetos devem ter um ponto de partida. Isso pode ser qualquer elemento, incluindo a área de trabalho, uma janela do aplicativo ou um controle.
O elemento raiz da área de trabalho, do qual todos os elementos são decrescentes, é obtido da propriedade estática AutomationElement.RootElement.
Cuidado
Em geral, você deve tentar obter apenas filhos diretos do RootElement. Uma busca por descendentes pode iterar por meio de centenas ou mesmo milhares de elementos, possivelmente resultando em um excedente de pilha. Se você estiver tentando obter um elemento específico em um nível inferior, inicie sua pesquisa na janela do aplicativo ou em um contêiner em um nível inferior.
Condições
Para a maioria das técnicas que você pode usar para recuperar elementos 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 é TrueConditionum objeto predefinido que especifica que todos os elementos dentro do escopo de pesquisa devem ser retornados. FalseCondition, o inverso de TrueCondition, é menos útil, pois evitaria que quaisquer elementos fossem encontrados.
Outras três condições predefinidas podem ser usadas sozinhas ou em combinação com outras condições: ContentViewCondition, ControlViewConditione RawViewCondition. RawViewCondition, usado por si só, é equivalente a TrueCondition, porque ele não filtra elementos por suas IsControlElement propriedades ou IsContentElement propriedades.
Outras condições são criadas 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 dá suporte a um determinado padrão de controle.
As condições podem ser combinadas usando a lógica booliana construindo objetos de tipos AndConditioneOrConditionNotCondition.
Escopo de pesquisa
Pesquisas feitas usando FindFirst ou FindAll deve ter um escopo, bem como um local inicial.
O escopo define o espaço ao redor do local inicial a ser pesquisado. Isso pode incluir o elemento em si, seus irmãos, seu pai, seus ancestrais, 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 sua NameAutomationId, ou alguma outra propriedade ou combinação de propriedades, é mais fácil usar o FindFirst método. Se o elemento procurado for uma janela de aplicativo, o ponto de partida da pesquisa poderá ser o RootElement.
Essa forma de encontrar elementos Automação da Interface do Usuário é mais útil em cenários de teste automatizados.
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 tiver conhecimento prévio dos aplicativos com os quais seu cliente pode ser usado, você poderá construir uma subárvore de todos os elementos de interesse usando a TreeWalker classe. Seu aplicativo pode fazer isso em resposta a um evento com alteração de foco; ou seja, quando um aplicativo ou controle recebe o foco de entrada, o cliente Automação da Interface do Usuário examina filhos e talvez todos os descendentes do elemento focado.
Outra maneira de TreeWalker usar é identificar os ancestrais de um elemento. Por exemplo, ao subir 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 Get
métodos para navegar entre elementos da subárvore.
O Normalize método pode ser usado para navegar até um elemento na subárvore 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 a 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 exibição da subárvore. No entanto, você pode passar a AutomationElement barra de rolagem para Normalize a qual representar e recuperar o ancestral mais próximo que está no modo de exibição de conteúdo.
Outras maneiras de recuperar um elemento
Além de pesquisas e navegação, você pode recuperar uma das AutomationElement maneiras a seguir.
De um evento
Quando seu aplicativo recebe um evento Automação da Interface do Usuário, o objeto de origem passado para o manipulador de eventos é um AutomationElement. Por exemplo, se você se inscreveu em eventos com alteração de foco, a origem passada para o elemento AutomationFocusChangedEventHandler que recebeu o foco.
Para obter mais informações, consulte Assinar Automação da Interface do Usuário Eventos.
De um ponto
Se você tiver coordenadas de tela (por exemplo, uma posição de cursor), poderá recuperar uma AutomationElement usando o método estático FromPoint.
De um identificador de janela
Para recuperar um AutomationElement de um HWND, use o método estático FromHandle.
No controle focalizado
Você pode recuperar um AutomationElement que representa o controle focado da propriedade estática FocusedElement.