Hämta automationselement för användargränssnittet
Kommentar
Den här dokumentationen System.Windows.Automation är avsedd för .NET Framework-utvecklare som vill använda de hanterade UI Automation-klasserna som definierats i namnområdet. Den senaste informationen om UI Automation finns i Windows Automation API: UI Automation.
Det här avsnittet beskriver de olika sätten att AutomationElement hämta objekt för användargränssnittselement .
Varning
Om klientprogrammet kan försöka hitta element i sitt eget användargränssnitt måste du göra alla UI Automation-anrop i en separat tråd. Mer information finns i UI Automation Threading Issues (UI Automation Threading Issues).
Rotelementet
Alla sökningar efter AutomationElement objekt måste ha en startplats. Detta kan vara valfritt element, inklusive skrivbordet, ett programfönster eller en kontroll.
Rotelementet för skrivbordet, från vilket alla element är fallande, hämtas från den statiska AutomationElement.RootElement egenskapen.
Varning
I allmänhet bör du försöka få endast direkta underordnade RootElementtill . En sökning efter underordnade kan iterera genom hundratals eller till och med tusentals element, vilket kan resultera i ett stackspill. Om du försöker hämta ett visst element på en lägre nivå bör du starta sökningen från programfönstret eller från en container på en lägre nivå.
Villkor
För de flesta tekniker som du kan använda för att hämta UI Automation-element måste du ange en Condition, som är en uppsättning kriterier som definierar vilka element du vill hämta.
Det enklaste villkoret är TrueCondition, ett fördefinierat objekt som anger att alla element i sökomfånget ska returneras. FalseCondition, converse för TrueCondition, är mindre användbart eftersom det skulle förhindra att element hittas.
Tre andra fördefinierade villkor kan användas ensamt eller i kombination med andra villkor: ContentViewCondition, ControlViewConditionoch RawViewCondition. RawViewCondition, som används av sig själv, motsvarar TrueCondition, eftersom det inte filtrerar element efter deras IsControlElement eller IsContentElement egenskaper.
Andra villkor byggs upp från ett eller flera PropertyCondition objekt, som var och en anger ett egenskapsvärde. En kan till exempel PropertyCondition ange att elementet är aktiverat eller att det stöder ett visst kontrollmönster.
Villkor kan kombineras med boolesk logik genom att konstruera objekt av typerna AndCondition, OrConditionoch NotCondition.
Sökomfång
Sökningar som görs med hjälp FindFirst av eller FindAll måste ha ett omfång samt en startplats.
Omfånget definierar utrymmet runt startplatsen som ska genomsökas. Detta kan omfatta själva elementet, dess syskon, dess överordnade, dess förfäder, dess omedelbara barn och dess ättlingar.
Sökomfånget definieras av en bitvis kombination av värden från TreeScope uppräkningen.
Hitta ett känt element
Om du vill hitta ett känt element, som identifieras av dess Name, AutomationIdeller någon annan egenskap eller kombination av egenskaper, är det enklast att använda FindFirst metoden. Om elementet som söks är ett programfönster kan startpunkten för sökningen RootElementvara .
Det här sättet att hitta automationselement i användargränssnittet är mest användbart i automatiserade testscenarier.
Hitta element i ett underträd
Om du vill hitta alla element som uppfyller specifika kriterier som är relaterade till ett känt element kan du använda FindAll. Du kan till exempel använda den här metoden för att hämta listobjekt eller menyobjekt från en lista eller meny, eller för att identifiera alla kontroller i en dialogruta.
Gå en underträd
Om du inte har några förkunskaper om de program som klienten kan användas med kan du skapa ett underträd av alla intressanta element med hjälp TreeWalker av klassen. Ditt program kan göra detta som svar på en händelse som ändrats i fokus. När ett program eller en kontroll tar emot indatafokus undersöker UI Automation-klienten underordnade och kanske alla underordnade till det fokuserade elementet.
Ett annat sätt att TreeWalker använda är att identifiera överordnade element. Genom att till exempel gå upp i trädet kan du identifiera det överordnade fönstret för en kontroll.
Du kan använda TreeWalker antingen genom att skapa ett objekt i klassen (definiera element av intresse genom att skicka ett Condition), eller genom att använda något av följande fördefinierade objekt som definieras som fält i TreeWalker.
Fält | beskrivning |
---|---|
ContentViewWalker | Hittar endast element vars IsContentElement egenskap är true . |
ControlViewWalker | Hittar endast element vars IsControlElement egenskap är true . |
RawViewWalker | Hittar alla element. |
När du har fått en TreeWalkerär det enkelt att använda den. Anropa Get
bara metoderna för att navigera bland elementen i underträdet.
Metoden Normalize kan användas för att navigera till ett element i underträdet från ett annat element som inte ingår i vyn. Anta till exempel att du har skapat en vy över ett underträd med hjälp ContentViewWalkerav . Programmet får sedan ett meddelande om att en rullningslist har fått indatafokuset. Eftersom en rullningslist inte är ett innehållselement finns den inte i din vy över underträdet. Du kan dock skicka AutomationElement den som representerar rullningslisten till Normalize och hämta närmaste överordnade som finns i innehållsvyn.
Andra sätt att hämta ett element
Förutom sökningar och navigering kan du hämta en AutomationElement på följande sätt.
Från en händelse
När ditt program tar emot en UI Automation-händelse är källobjektet som skickas till händelsehanteraren en AutomationElement. Om du till exempel har prenumererat på händelser som ändrats i fokus är källan som skickades till ditt AutomationFocusChangedEventHandler element det element som fick fokus.
Mer information finns i Prenumerera på UI Automation-händelser.
Från en punkt
Om du har skärmkoordinater (till exempel en markörposition) kan du hämta en AutomationElement med hjälp av den statiska FromPoint metoden.
Från ett fönsterhandtag
Om du vill hämta en AutomationElement från en HWND använder du den statiska FromHandle metoden.
Från den fokuserade kontrollen
Du kan hämta en AutomationElement som representerar den fokuserade kontrollen från den statiska FocusedElement egenskapen.