Descriptive Programmering i QTP/UFTDynamisk och statisk

⚡ Smart sammanfattning

Descriptiv programmering låter en QTP or UFT Ett uttalande bär själva objektbeskrivningen, som egenskapsvärdepar eller som en Description-objektet, så ett steg körs även om objektet aldrig lagrades i objektarkivet.

  • 🔘 Förbigår arkivet: Beskrivningen finns i kommandot, så inget objektnamn behöver slås upp vid körning.
  • ☑️ Statisk form: Egenskapsvärdepar skrivna inbäddade som "property:=value", separerade med kommatecken inuti testobjektanropet.
  • ✅ Dynamisk form: Description.Create bygger en återanvändbar egenskapssamling som många programsatser kan dela.
  • 🧪 Byggd för oförutsägbara objekt: Dölj paneler automatiskt, ändra hierarkier, kapslade interna objekt och resultatmängder av okänd storlek.
  • 🛠️ ChildObjects parar ihop med det: A Description-objektet som används som ett filter returnerar endast matchande underobjekt till en förälder.
  • 📌 Två regler att komma ihåg: Varje egenskapsvärde behandlas som ett reguljärt uttryck, och när du väl beskriver en förälder måste du också beskriva dess undervärden.

Statiska och dynamiska beskrivande programmeringssatser i QTP och UFT One

Vad är Descripthar du programmering?

Descriptive programmering används för att utföra operationer på ett objekt i AUT:n vars definition inte lagras i ObjektförrådMed hjälp av den här mekanismen kan du kringgå identifiering från objektförrådet och tillhandahålla objektet Descripti själva uttalandet.

Ett objektnamn används helt enkelt för att mappa ett objekt i ett skript med dess beskrivning i ett objektarkiv. Det betyder att om du ändrar objektnamnet i både ditt skript och objektarkivet, ska skriptet fortfarande köras. Se följande video om detta koncept.

Klicka här. om videon inte är tillgänglig

Video Highlights

  • Ta bort objektet Descriptav rutan Agentnamn WinEdit från objektförrådet. Om du kör testet igen kommer det att misslyckas eftersom det inte kan känna igen objektet. Låt oss undersöka orsaken till att skriptet misslyckas.
  • Under körtid, UFT En identifierar åtgärden som utförs på WinEdit-rutan, och objektet Description i objektförrådet lagras som agentnamn. Den använder detta namn för att track objektet i objektförrådet. För ett förälderobjekt kan du inte ha två underobjekt med samma namn, så QTP mappar objektet unikt i arkivet. Den använder sedan den lagrade beskrivningen i objektarkivet, ersätter namnet med beskrivningen och använder den resulterande satsen för att identifiera objektet i applikationen som testas.
  • Eftersom vi i vårt fall hade raderat objektbeskrivningen helt och hållet, misslyckas skriptet.
  • Men tänk om, istället för QTP Om du som testare ersätter objektbeskrivningen, anger du då direkt objektbeskrivningarna i ditt skript? Detta är inget annat än “Descriptive programmering"

Den enda ansvarsförändringen är vad de två formulären nedan implementerar, och varje formulär passar en annan typ av manus.

Typer av Descriptive programmering

Du kan använda Descriptjag programmerar på två sätt

  1. Statisk
  2. Dynamisk

Statisk Descriptive programmering

I Static Method, för objektidentifiering, anger du ett objekts egenskap i följande format

property:=values,

Detta format kallas ett egenskapsvärdepar och omges av citationstecken. Skrivet i sin helhet ser ett statiskt uttalande ut så här:

TestObject("PropertyName1:=PropertyValue1", "PropertyName2:=PropertyValue2").Method

Om ditt objekt använder flera beskrivningar för identifiering kan du ange dessa med kommatecken.

Så i vårt fall blir beskrivningen för Agent Name

"nativeclass:=Edit", "attached text:=Agent Name:"

Statiska beskrivningar läses vid den punkt där satsen körs, vilket gör dem idealiska för engångssteg och för snabba korrigeringar av ett skript som du inte vill spela in igen.

Dynamisk Descriptive programmering

Den andra metoden för att göra samma åtgärd är att använda Dynamic Descriptive programmering

Om ditt skript använder den beskrivande programmeringsobjektkandidaten flera gånger, kommer det att vara väldigt tröttsamt att ange alla egenskapsvärdepar för varje påstående

I sådana fall kan du använda dig av Descriptjonklass tillhandahållen av QTP

Syntaxen för att skapa ett beskrivningsobjekt är

Set MyDescription = Description.Create()
MyDescription("property").Value = "property-value"

Detta är den dynamiska metoden

Att fylla i objektet med Agentnamn-egenskaperna som används ovan ger en komplett, återanvändbar beskrivning:

Dim oDesc
Set oDesc = Description.Create()
oDesc("nativeclass").Value = "Edit"
oDesc("attached text").Value = "Agent Name:"

Variabeln oBeskriv kan nu skickas till vilken sats som helst som behöver det objektet, så en redigering uppdaterar varje steg som använder det.

Statisk vs Dynamisk Descriptiv programmering: När man ska använda varje

Båda formulären producerar samma körtidsbeskrivning, så valet handlar om underhåll snarare än kapacitet.

Kriterier Statisk (inline) Dynamisk (Descriptjonobjekt)
Hur beskrivningen är skriven Egenskapsvärdepar som skrivits in i testobjektanropet Egenskaper tillagda till ett objekt skapat med Description.Create()
Återanvändning Upprepas i varje sats som behöver objektet Lagras i en variabel och skickas dit den behövs
läsbarhet Korta uttalanden förblir läsbara; långa blir otympliga Extra inställningsrader, men själva satsen förblir kort
Ändringar i körtid Värden är fasta om de inte sammanfogas från variabler Egenskapsvärden kan omtilldelas före varje användning
Fungerar med barnobjekt Nej, filterargumentet måste vara ett Descriptjonobjekt Ja, detta är det obligatoriska formuläret
Passar bäst till Ett eller två steg på ett objekt som inte finns i arkivet Objekt som används upprepade gånger, eller samlingar som hämtas vid körning

Varför använda Descripthar du programmering?

Transkriptet nedan åtföljer videogenomgången av ett verkligt scenario där antalet objekt inte kan vetas i förväg.

Videoutskrift

  • Miljondollarfrågan är varför man ska använda DP när objektidentifieringsprocessen hanteras av QTP
  • Anta att du har fått i uppdrag att testa en jobbportal. Du skriver in en sökfråga i portalen och testet förväntar sig att du väljer alla tillgängliga jobb och klickar på Ansök jobb.
  • Men antalet jobb som reflekteras beror på sökfrågan och de jobb som är tillgängliga vid tidpunkten för skriptkörningen, och det finns inget sätt att i förväg förutsäga antalet jobb som skulle reflekteras.
  • I sådana fall kan du använda beskrivande programmering. Även om du inte känner till antalet och namnen på kryssrutorna, känner du till klassen för objekten som "WebCheck".Box"
  • Du kan använda ChildObjects-metoden att returnera objekt som tillhör en viss förälder
  • En kodrad som –
    Set allObjects = Browser("Jobs").Page("QTP").ChildObjects()

    returnerar alla underobjekt för den här sidan.

  • Men vi vill bara ha WebCheckBox objekt. För att göra det kan vi skapa ett filterobjekt och sätta dess egenskap till web check box-klassen, och sedan skicka detta filter som ett argument till ChildObjects-metoden.
  • I det här fallet returneras endast kryssrutorna.
  • Sedan kan du skriva kod som denna, som kommer åt hela samlingen av kryssrutor från noll och sätter alla kryssrutor PÅ.
  • Därefter kan du klicka på appliceringsknappen för att slutföra testet
  • Du kan också använda Descriptive Programmering för att köra objekt som är svåra att spela in som Auto-Hide Panels, Objekt med ändrade hierarkier, kapslade inre objekt, undermenyer.
  • Du kan också göra avancerade strängmanipulationer med beskrivande programmering
  • I samband med indexegenskapen kan deskriptiv programmering vara mycket användbar för att identifiera svåra objekt.
  • Om du använder programmatisk beskrivning för ett objekt i en objekthierarki måste du använda beskrivande programmering för efterföljande underobjekt.
  • Om till exempel beskrivande programmering användes för Page-objektet men det efterföljande underordnade WinEdit-objektet kom från objektdatabasen, är satsen felaktig.
  • Tvärtom, när beskrivande programmering används för både Page- och WinEdit-objekten, är påståendet korrekt.

Utskrivet ser filtret och loopen som beskrivs i transkriptet ut så här:

Dim oFilter, allCheckBoxes, i
Set oFilter = Description.Create()
oFilter("micclass").Value = "WebCheckBox"
Set allCheckBoxes = Browser("Jobs").Page("QTP").ChildObjects(oFilter)
For i = 0 To allCheckBoxes.Count - 1
    allCheckBoxes(i).Set "ON"
Next

Samlingen är nollbaserad, vilket är anledningen till att loopen stannar vid Antal – 1Eftersom filtret utvärderas när raden körs fungerar samma kod oavsett om sökningen returnerar tre jobb eller trettio.

Reguljära uttryck, ordinala identifierare och vanliga fallgropar

DescriptIv programmering beter sig på två sätt som överraskar de flesta första gången en sats misslyckas utan någon synlig anledning.

1) Varje egenskapsvärde behandlas som ett reguljärt uttryck. En bildtext som t.ex. Totalt (USD) matchar därför inte, eftersom parenteserna är syntax för reguljära uttryck. Undvik dem med ett bakåtsnedstreck, eller stäng av utvärdering av reguljära uttryck för den egenskapen på en Descriptjonobjekt:

Set oDesc = Description.Create()
oDesc("name").Value = "Total (USD)"
oDesc("name").RegularExpression = False

2) Ordinala identifierare bryter band. När en beskrivning fortfarande matchar mer än ett objekt, lägg till index, läge or skapelsetid som en extra egenskap. Indexräkningen börjar på noll:

WebEdit("name:=userName", "html tag:=INPUT", "index:=0").Set "guru99"
WebEdit("name:=userName", "html tag:=INPUT", "index:=1").Set "guru99"

Tre ytterligare fallgropar är värda att kontrollera innan du börjar felsöka applikationen:

  • Använda mikroklass, inte etiketten Klassnamn visas i Object Spy. Visningsnamnet är inte en giltig egenskap i en beskrivning.
  • Egenskapsnamn är inte skiftlägeskänsliga men måste stavas exakt som tekniken rapporterar dem, inklusive mellanslag i bifogad text och html-tagg.
  • Descriptiv programmering kringgår arkivet; det förbättrar inte objektigenkänningen. Om rätt tillägg inte laddas kommer ingen beskrivning att göra objektet identifierbart.

Vanliga frågor

Punkt Objektspion vid kontrollen och läs dess identifieringsegenskaper, eller anropa GetROProperty vid körning. Kopiera namnen exakt som de listas, men kom ihåg att Object Spy visar micclass under etiketten Klassnamn.

Vanligtvis inte. En sökning i ett repository löser en lagrad beskrivning en gång, medan en beskriven sats utvärderas varje gång raden körs. Fördelen med beskrivande programmering är flexibilitet på oförutsägbara objekt, inte rå hastighet.

Bygga Description-objektet inuti en återanvändbar funktion och behålla den funktionen i en VBScript funktionsbiblioteket som är associerat med testet. Varje åtgärd som laddar biblioteket kan sedan anropa det, så en redigering uppdaterar alla anropare.

AI-assisterad identifiering matchar kontroller efter visuellt utseende och närliggande etiketttext istället för fasta egenskaper, vilket tar bort vissa handskrivna beskrivningar. Descriptjoner behövs fortfarande där objekt räknas eller filtreras vid körning.

Copilot kan bygga upp looparna, Description.Create anrop och rapporter kring en beskrivning, men den kan inte se din applikation. Varje egenskapsnamn och värde som den föreslår måste bekräftas mot den verkliga kontrollen innan satsen är betrodd.

Sällan. A delat objektförråd håller beskrivningar på ett redigerbart ställe och gör skript läsbara. De flesta team har stabila skärmar i arkivet och använder endast beskrivningar där objekten är dynamiska.

Reducera det till en enda egenskap och lägg sedan till de andra en i taget. Genom att kontrollera antalet objekt med ett ChildObjects-filter visas om beskrivningen inte matchar någonting eller matchar flera objekt tvetydigt.

Ja. Det fungerar för alla tekniker vars tillägg är laddat, inklusive standard Windows, webb, .NET, Java och terminalemulatorobjekt. Endast egenskapsnamnen skiljer sig åt, eftersom varje tillägg rapporterar sina egna identifieringsegenskaper.

Sammanfatta detta inlägg med: