Ottenere elementi di automazione interfaccia utente

Nota

Questa documentazione è destinata agli sviluppatori .NET Framework che desiderano utilizzare le classi di UI Automation gestite definite nello spazio dei nomi System.Windows.Automation. Per informazioni aggiornate su UI Automation, vedere API di automazione di Windows: UI Automation.

Questo argomento descrive i diversi modi in cui è possibile ottenere oggetti AutomationElement per gli elementi dell'interfaccia utente.

Attenzione

Se c'è la possibilità che l'applicazione client cerchi di trovare elementi nell'interfaccia utente, è necessario effettuare tutte le chiamate a UI Automation in un thread separato. Per altre informazioni, vedere UI Automation Threading Issues.

Elemento radice

Tutte le ricerche di oggetti AutomationElement devono avere un punto di partenza, che può essere un elemento qualsiasi, incluso il desktop, una finestra dell'applicazione o un controllo.

L'elemento radice per il desktop, da cui discendono tutti gli elementi, si ottiene dalla proprietà AutomationElement.RootElement statica.

Attenzione

In generale, è consigliabile cercare di ottenere solo elementi figlio diretti di RootElement. Una ricerca dei discendenti può scorrere centinaia o anche migliaia di elementi, con la possibilità che venga generato un overflow dello stack. Per ottenere un elemento specifico a un livello inferiore, è consigliabile avviare la ricerca dalla finestra dell'applicazione o da un contenitore a un livello inferiore.

Condizioni

Per la maggior parte delle tecniche che è possibile usare per recuperare elementi di UI Automation, è necessario specificare un oggetto Condition, ovvero un set di criteri che definiscono gli elementi da recuperare.

La condizione più semplice è TrueCondition, un oggetto predefinito che specifica che devono essere restituiti tutti gli elementi nell'ambito della ricerca. FalseCondition, il contrario di TrueCondition, è meno utile, perché impedisce di trovare qualsiasi elemento.

Si possono usare altre tre condizioni predefinite, da sole o in combinazione con altre condizioni: ContentViewCondition, ControlViewConditione RawViewCondition. RawViewCondition, usata da sola, equivale a TrueCondition, perché non filtra gli elementi in base alle proprietà IsControlElement o IsContentElement .

Le altre condizioni si basano su uno o più oggetti PropertyCondition , che specificano tutti un valore di una proprietà. Ad esempio, un oggetto PropertyCondition può specificare che l'elemento è abilitato o che supporta un determinato pattern di controllo.

Le condizioni possono essere combinate con la logica booleana costruendo oggetti di tipo AndCondition, OrConditione NotCondition.

Ambito di ricerca

Le ricerche eseguite usando FindFirst o FindAll devono avere un ambito, oltre che un punto di partenza.

L'ambito definisce lo spazio attorno al punto di partenza, in cui eseguire la ricerca, e può includere l'elemento stesso, gli elementi sibling, gli elementi padre, i predecessori, gli elementi figlio diretti e i discendenti.

L'ambito di una ricerca viene definito da una combinazione bit per bit di valori dall'enumerazione TreeScope .

Ricerca di un elemento noto

Per trovare un elemento noto, identificato da Name, AutomationIdo da altre proprietà o combinazioni di proprietà, il modo più semplice è usare il metodo FindFirst . Se l'elemento cercato è una finestra dell'applicazione, il punto di partenza della ricerca può essere l'oggetto RootElement.

Questo tipo di ricerca degli elementi di UI Automation è molto utile negli scenari di test automatizzato.

Ricerca di elementi in un sottoalbero

Per trovare tutti gli elementi che soddisfano criteri specifici correlati a un elemento noto, è possibile usare FindAll. È possibile, ad esempio, usare questo metodo per recuperare elementi elenco o voci di menu da un elenco o da un menu o per identificare tutti i controlli in una finestra di dialogo.

Esplorazione di un sottoalbero

Se non si conoscono le applicazioni con cui il client potrebbe essere usato, è possibile costruire un sottoalbero di tutti gli elementi a cui si è interessati usando la classe TreeWalker . L'applicazione potrebbe eseguire questa operazione in risposta a un evento di modifica dello stato attivo, ovvero, quando un'applicazione o un controllo riceve lo stato attivo per l'input, il client di automazione interfaccia utente esamina gli elementi figlio ed eventualmente i discendenti dell'elemento con lo stato attivo.

Un altro modo per usare TreeWalker è identificare i predecessori di un elemento. Ad esempio, spostandosi verso l'alto nell'albero, è possibile identificare la finestra padre di un controllo.

È possibile usare TreeWalker creando un oggetto della classe (per definire gli elementi a cui si è interessati passando un oggetto Condition) o usando uno degli oggetti predefiniti seguenti che vengono definiti come campi di TreeWalker.

Campo Descrizione
ContentViewWalker Trova solo gli elementi la cui proprietà IsContentElement è true.
ControlViewWalker Trova solo gli elementi la cui proprietà IsControlElement è true.
RawViewWalker Trova tutti gli elementi.

Dopo avere ottenuto un TreeWalker, usarlo è davvero semplice. È sufficiente chiamare i metodi Get per spostarsi tra gli elementi del sottoalbero.

Il metodo Normalize può essere usato per passare a un elemento nel sottoalbero da un altro elemento che non fa parte della visualizzazione. Si supponga, ad esempio, di avere creato una visualizzazione di un sottoalbero usando ContentViewWalker. L'applicazione riceve quindi la notifica che una barra di scorrimento ha ricevuto lo stato attivo per l'input. Poiché una barra di scorrimento non è un elemento con contenuto, non è presente nella visualizzazione del sottoalbero. È possibile, tuttavia, passare l'oggetto AutomationElement che rappresenta la barra di scorrimento a Normalize e recuperare il predecessore più vicino nella visualizzazione contenuto.

Altri modi per recuperare un elemento

Oltre alle ricerche e alla navigazione, è possibile recuperare un oggetto AutomationElement nei seguenti modi.

Da un evento

Quando l'applicazione riceve un evento di UI Automation, l'oggetto di origine passato al gestore eventi è AutomationElement. Se, ad esempio, sono stati sottoscritti gli eventi di modifica dello stato attivo, l'origine passata all'oggetto AutomationFocusChangedEventHandler è l'elemento che ha ricevuto lo stato attivo.

Per altre informazioni, vedere Subscribe to UI Automation Events.

Da un punto

Se si conoscono le coordinate nella schermata (ad esempio, la posizione di un cursore), è possibile recuperare un oggetto AutomationElement usando il metodo FromPoint statico.

Da un handle di finestra

Per recuperare un oggetto AutomationElement da HWND, usare il metodo FromHandle statico.

Dal controllo con lo stato attivo

È possibile ricevere un oggetto AutomationElement che rappresenta il controllo con lo stato attivo dalla proprietà FocusedElement statica.

Vedi anche