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.
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
- Statisch
- 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.
