Descriptive Programmeren in QTP/UFTDynamisch en statisch

โšก Slimme samenvatting

Descriptive programmeren laat een QTP or UFT Eรฉn statement bevat de objectbeschrijving zelf, als eigenschap-waardeparen of als een Description-object, dus een stap wordt uitgevoerd, zelfs als het object nooit in de objectrepository is opgeslagen.

  • ๐Ÿ”˜ Omzeilt de repository: De beschrijving wordt binnen de instructie doorgegeven, waardoor er tijdens de uitvoering geen objectnaam hoeft te worden opgezocht.
  • โ˜‘๏ธ Statisch formulier: Eigenschap-waardeparen worden inline geschreven als "eigenschap:=waarde", gescheiden door komma's binnen de aanroep van het testobject.
  • โœ… Dynamisch formulier: Description.Create bouwt een herbruikbare verzameling eigenschappen die door meerdere statements gedeeld kunnen worden.
  • ๐Ÿงช Ontworpen voor onvoorspelbare objecten: Automatisch verbergen van panelen, veranderende hiรซrarchieรซn, geneste interne objecten en resultaatsets van onbekende grootte.
  • ๏ธ ChildObjects koppelt ermee: A DescriptEen ion-object dat als filter wordt gebruikt, retourneert alleen de overeenkomende kinderen van een ouder.
  • ๐Ÿ“Œ Twee regels om te onthouden: Elke eigenschapswaarde wordt behandeld als een reguliere expressie, en zodra je een ouder beschrijft, moet je ook de kinderen ervan beschrijven.

Statische en dynamische beschrijvende programmeerinstructies in QTP en UFT One

Wat is Descriptive programmeren?

Descriptive programmering wordt gebruikt om bewerkingen uit te voeren op een object in de AUT waarvan de definitie niet is opgeslagen in de Object-opslagplaatsMet dit mechanisme kunt u de identificatie vanuit de objectrepository omzeilen en het object aanleveren. Descriptin de verklaring zelf.

Een objectnaam wordt simpelweg gebruikt om een โ€‹โ€‹object in een script te koppelen aan de beschrijving ervan in een objectrepository. Dit betekent dat als je de objectnaam wijzigt in zowel je script als de objectrepository, het script nog steeds zou moeten werken. Bekijk de volgende video voor meer informatie over dit concept.

Klik hier als de video niet toegankelijk is

Video Highlights

  • Verwijder het object Description van het WinEdit-vak Agentnaam vanuit de Objectrepository. Als u de test opnieuw uitvoert, zal deze mislukken, omdat het object niet wordt herkend. Laten we eens kijken waarom het script mislukt.
  • Tijdens de uitvoering, UFT Men identificeert de bewerking die wordt uitgevoerd op het WinEdit-venster, en het object DescriptDe ion in de objectrepository wordt opgeslagen als agentnaam. Deze naam wordt gebruikt om track het object in de objectrepository. Voor een ouderobject kun je geen twee kindobjecten met dezelfde naam hebben, dus QTP Het object wordt uniek gekoppeld in de repository. Vervolgens wordt de opgeslagen beschrijving in de objectrepository gebruikt, de naam vervangen door de beschrijving en de resulterende instructie gebruikt om het object in de te testen applicatie te identificeren.
  • Omdat we in ons geval de objectbeschrijving volledig hadden verwijderd, werkt het script niet.
  • Maar wat als, in plaats van QTP Als tester vervang je de objectbeschrijving door de objectbeschrijvingen direct in je script op te geven? Dat is niets anders dan "Descriptive programmerenโ€

Die ene verandering van verantwoordelijkheid is wat de twee onderstaande formulieren implementeren, en elk formulier is geschikt voor een ander soort script.

Types van Descriptive programmering

Je kunt gebruiken Descriptive programmeren op twee manieren

  1. Statisch
  2. Dynamisch

Statisch Descriptive programmering

In de statische methode specificeert u voor objectidentificatie de eigenschap van een object in de volgende indeling

property:=values,

Deze opmaak wordt een eigenschap-waardepaar genoemd en staat tussen aanhalingstekens. Een statische instructie ziet er volledig als volgt uit:

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

Als uw object meerdere beschrijvingen gebruikt ter identificatie, kunt u deze met komma's specificeren.

In ons geval wordt de beschrijving voor Agentnaam dus

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

Statische beschrijvingen worden gelezen op het moment dat de instructie wordt uitgevoerd, waardoor ze ideaal zijn voor eenmalige stappen en voor snelle correcties in een script dat je niet opnieuw wilt opnemen.

Dynamisch Descriptive programmering

De tweede methode om dezelfde actie uit te voeren is het gebruik van Dynamic Descriptive programmering

Als uw script de beschrijvende programmeerobjectkandidaat meerdere keren gebruikt, zal het erg vermoeiend zijn om alle eigenschapswaardeparen voor elke instructie te specificeren

In dergelijke gevallen kunt u gebruikmaken van de Descriptionenklasse geleverd door QTP

De syntax voor het maken van een beschrijvingsobject is

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

Dit is de dynamische methode.

Door dat object te vullen met de hierboven gebruikte Agent Name-eigenschappen, ontstaat een complete, herbruikbare beschrijving:

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

De variabele oDesc Het object kan nu worden doorgegeven aan elke instructie die het nodig heeft, waardoor รฉรฉn bewerking elke stap bijwerkt die het gebruikt.

Statisch versus dynamisch DescriptIVE-programmering: wanneer gebruik je welke methode?

Beide vormen produceren dezelfde runtimebeschrijving, dus de keuze gaat meer over onderhoud dan over functionaliteit.

criteria Statisch (inline) Dynamisch (Description object)
Hoe de beschrijving is geschreven Eigenschap-waardeparen die binnen de aanroep van het testobject zijn ingevoerd Eigenschappen toegevoegd aan een object gemaakt met Description.Create()
visfuik Herhaald in elke instructie die het object nodig heeft. Opgeslagen in รฉรฉn variabele en doorgegeven waar nodig.
leesbaarheid Korte zinnen blijven leesbaar; lange zinnen worden onhandelbaar. Extra inleidende regels, maar de verklaring zelf blijft kort.
Runtime-wijzigingen Waarden zijn vast, tenzij ze zijn samengesteld uit variabelen. Eigenschapswaarden kunnen vรณรณr elk gebruik opnieuw worden toegewezen.
Werkt met kindobjecten. Nee, het filterargument moet een zijn. Description object Ja, dit is het vereiste formulier.
Het meest geschikt voor: Een of twee stappen op een object dat niet in de repository staat. Objecten die herhaaldelijk worden gebruikt, of verzamelingen die tijdens de uitvoering worden opgevraagd.

Waarom gebruiken Descriptive programmeren?

Het onderstaande transcript hoort bij de video-uitleg van een realistisch scenario waarin het aantal objecten niet van tevoren bekend is.

Videotranscript

  • De hamvraag is waarom DP te gebruiken als het objectidentificatieproces al door... QTP
  • Stel, je krijgt de opdracht om een โ€‹โ€‹vacatureportal te testen. Je voert een zoekopdracht in de portal in en van je test wordt verwacht dat je alle beschikbare vacatures selecteert en op 'Solliciteren' klikt.
  • Het aantal weergegeven vacatures is echter afhankelijk van de zoekopdracht en de beschikbare vacatures op het moment dat het script wordt uitgevoerd. Het is niet mogelijk om vooraf te voorspellen hoeveel vacatures er precies worden weergegeven.
  • In dergelijke gevallen kunt u beschrijvend programmeren gebruiken. Hoewel u het aantal en de namen van de selectievakjes niet weet, kent u wel de klasse van de objecten, namelijk "WebCheck".Box"
  • U kunt gebruik maken van de ChildObjects-methode om objecten terug te geven die tot een bepaalde ouder behoren
  • Een regel code zoals -
    Set allObjects = Browser("Jobs").Page("QTP").ChildObjects()

    Geeft alle onderliggende objecten voor deze pagina terug.

  • Maar we willen alleen WebCheckBox objecten. Om dit te doen, kunnen we een filterobject maken en de eigenschap ervan instellen op de klasse van het webselectievakje. Vervolgens kunnen we dit filter als argument doorgeven aan de ChildObjects-methode.
  • In dit geval worden alleen de selectievakjes geretourneerd.
  • Vervolgens kun je code schrijven zoals deze, die de hele verzameling selectievakjes vanaf nul doorloopt en alle selectievakjes AAN zet.
  • Vervolgens kunt u op de knop 'Solliciteer' klikken om de test af te ronden
  • U kunt ook gebruik maken van DescriptLive programmeren om objecten uit te voeren die moeilijk vast te leggen zijn, zoals automatisch verborgen panelen, objecten met veranderende hiรซrarchieรซn, geneste interne objecten en submenu's.
  • U kunt ook geavanceerde tekenreeksmanipulaties uitvoeren met behulp van beschrijvend programmeren
  • In combinatie met de indexeigenschap kan beschrijvend programmeren zeer nuttig zijn bij het identificeren van lastige objecten.
  • Als u programmatische beschrijvingen gebruikt voor een object in een objecthiรซrarchie, moet u ook beschrijvende programmering gebruiken voor de daaropvolgende onderliggende objecten.
  • Als bijvoorbeeld beschrijvende programmering is gebruikt voor het Page-object, maar het daaropvolgende WinEdit-object afkomstig is uit de Object Repository, dan is de bewering onjuist.
  • Integendeel, wanneer beschrijvende programmering wordt gebruikt voor zowel de Page- als de WinEdit-objecten, is de bewering juist.

Uitgeschreven zien het filter en de lus die in het transcript worden beschreven er als volgt uit:

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

De verzameling is nulgebaseerd, daarom stopt de lus bij Aantal โ€“ 1Omdat het filter wordt geรซvalueerd wanneer de regel wordt uitgevoerd, werkt dezelfde code ongeacht of de zoekopdracht drie of dertig vacatures oplevert.

Reguliere expressies, ordinale identificatoren en veelvoorkomende valkuilen

DescriptLive programmeren gedraagt โ€‹โ€‹zich op twee manieren die de meeste mensen verrassen wanneer een instructie voor het eerst zonder zichtbare reden mislukt.

1) Elke eigenschapswaarde wordt behandeld als een reguliere expressie. Een onderschrift zoals Totaal (USD) Daarom wordt er geen overeenkomst gevonden, omdat de haakjes syntaxis van reguliere expressies zijn. Ontsnap eraan met een backslash, of schakel de evaluatie van reguliere expressies voor die eigenschap uit. Description object:

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

2) Bij gelijke scores wordt gebruikgemaakt van rangtelwoorden. Als een beschrijving nog steeds overeenkomt met meer dan รฉรฉn object, voeg dan het volgende toe: index, plaats or creatietijd als extra eigenschap. De indextelling begint bij nul:

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

Voordat je begint met het debuggen van de applicatie, zijn er nog drie valkuilen die je moet controleren:

  • Gebruik microfoonklasse, niet het label Naam van de klasse weergegeven in Object Spy. De weergavenaam is geen geldige eigenschap in een beschrijving.
  • Eigenschapsnamen zijn niet hoofdlettergevoelig, maar moeten exact zo gespeld worden als de technologie ze registreert, inclusief de spatie. bijgevoegde tekst en html-tag.
  • DescriptLive programmeren omzeilt de repository; het verbetert de objectherkenning niet. Als de juiste add-in niet geladen is, zal geen enkele beschrijving het object identificeerbaar maken.

Veelgestelde vragen

punt Objectspion Gebruik de besturingselementen om de identificatie-eigenschappen uit te lezen, of roep GetROProperty aan tijdens de uitvoering. Kopieer de namen exact zoals ze worden weergegeven, en onthoud dat Object Spy 'micclass' weergeeft onder het label 'Class Name'.

Meestal niet. Een zoekopdracht in een repository lost een opgeslagen beschrijving slechts รฉรฉn keer op, terwijl een beschreven instructie elke keer dat de regel wordt uitgevoerd, wordt geรซvalueerd. Het voordeel van beschrijvend programmeren is flexibiliteit bij onvoorspelbare objecten, niet zozeer pure snelheid.

Bouw het Description-object binnen een herbruikbare functie en bewaar die functie in een VBScript Een functiebibliotheek die aan de test is gekoppeld. Elke actie die de bibliotheek laadt, kan deze vervolgens aanroepen, waardoor รฉรฉn wijziging alle aanroepers bijwerkt.

AI-ondersteunde identificatie koppelt besturingselementen aan hun uiterlijk en nabijgelegen labeltekst in plaats van aan vaste eigenschappen, waardoor sommige handgeschreven beschrijvingen overbodig worden. DescriptIonen zijn nog steeds nodig wanneer objecten tijdens de uitvoering worden geteld of gefilterd.

Copilot kan de lussen ondersteunen, Description.Create maakt aanroepen en rapportages aan op basis van een beschrijving, maar kan uw applicatie niet zien. Elke eigenschapsnaam en waarde die wordt voorgesteld, moet worden geverifieerd aan de hand van de daadwerkelijke controle voordat de bewering als betrouwbaar wordt beschouwd.

Zelden. Een gedeelde objectopslagplaats Het zorgt ervoor dat beschrijvingen op รฉรฉn bewerkbare plek blijven en dat scripts leesbaar blijven. De meeste teams bewaren stabiele schermen in de repository en raadplegen beschrijvingen alleen wanneer objecten dynamisch zijn.

Reduceer het tot รฉรฉn enkele eigenschap en voeg de andere vervolgens รฉรฉn voor รฉรฉn weer toe. Door het aantal objecten te controleren met een ChildObjects-filter, wordt duidelijk of de beschrijving nergens op overeenkomt of op een ambigue manier met meerdere objecten overeenkomt.

Ja. Het werkt voor elke technologie waarvan de add-in is geladen, inclusief standaardtechnologieรซn. Windows, web, .NET, Java en terminalemulatorobjecten. Alleen de eigenschapsnamen verschillen, aangezien elke add-in zijn eigen identificatie-eigenschappen rapporteert.

Vat dit bericht samen met: