ultimate xpath writing cheat sheet tutorial with syntax
Top 20 måder at skrive ultimativ XPATH til enhver type webelement (XPATH vil aldrig være ugyldig):
En webapplikation består af forskellige typer webelementer, såsom webelement, som en knap kan klikke på, indtast webelement for at skrive tekst, drop-down, radioknapper osv.
Disse webelementer kaldes også tags eller noder.
Når det kommer til automatisering af webapplikationer, starter det med at skrive et automatiseringsscript, der finder webelementet, udfører en handling på det, f.eks. Klik på en knap, indtast tekst i indtastningsfeltet, vælg et afkrydsningsfelt, vælg en radioknap, rul op eller ned og til sidst verificere den forventede adfærd efter handlingen.
Hvad du lærer:
- Hvad er XPath og hvordan det ser ud?
- Top 20 måder at skrive XPath til ethvert webelement
- # 1) Omvendt opslag
- # 2) Brug af variabler og brugerdefinerede værdier
- # 3) Brug af 'XML' tags, 'AND' osv
- # 4) Brug af attributter og tabel XPATH
- # 5) Brug af attributter, tabeller og tekst
- # 6) Generering af XPATH ved hjælp af indlejrede attributter
- # 7) XPath-generation ved at kombinere attributter, divs og knap
- # 8) XPATH Generering ved hjælp af CONTAINS, REVERSE LOOKUP osv.
- # 9) XPath-generation ved hjælp af relativ, CONTAINS, REVERSE, FOLLOWING SIBLING osv.
- # 10) XPath-generering ved hjælp af attributter, indeholder, omvendt, foregående søskende, divs og span
- # 11) Brug af attributter, XML-tags osv.
- # 12) XPath-generation ved ikke at se på hele siden, men se på alle links i stedet og indeholder
- # 13) Brug af Indeholder og attributter
- # 14) Brug af attributter, efter søskende og efterkommere
- # 15) Brug af attributter, efter søskende, efterkommer og tekst
- # 16) Brug af sidehoved og tekst
- # 17) Brug af overskriftstekst, efter søskende, sti osv.
- # 18) Brug af attributter, indeholder og foregående søskende
- # 19) På udkig efter rullemenu ved hjælp af Id Attribute, en bestemt tekst og Reverse Lookup
- # 20) Kombination af 'id' -attribut og søgning efter et link med specifik tekst
- Konklusion
- Anbefalet læsning
Hvad er XPath og hvordan det ser ud?
At finde et element er som at finde en persons hus på kortet. Den eneste måde, hvorpå vi kan finde en vens hjem uden ekstern hjælp, er at vi skal have et kort og vide, hvad vi skal finde (hus).
For at sætte denne analogi i vores tilfælde vil kortet blive brugt som DOM (HTML-tags, JavaScript osv.), Hvor alle webelementerne findes sammen med det specifikke webelement, som vi vil finde.
Når den unikke adresse eller sti til et element er fundet, udfører automatiseringsscript derefter nogle handlinger på det baseret på testscenariet. For eksempel, du vil bekræfte URL'en til den side, der åbnes efter at have klikket på en knap.
Det er dog ikke ligetil at finde en unik adresse / sti til et webelement, da der kan være lignende tags, samme attributværdier, identiske stier, hvilket gør det svært at oprette nøjagtig unik adresse til et webelement kaldet 'XPATH'.
Her dykker vi dybt ned i nogle gode og effektive teknikker til at generere gyldig og unik XPATH til enhver form for webelement.
Anbefalet Læs => Identificer webelementer ved hjælp af XPath i selen
Nogle gange kan du nemt oprette XPaths ved hjælp af browserudvidelser, men i min automatiseringstest karriere, har jeg stået over utallige situationer, hvor traditionelle browserudvidelser ikke fungerer, og du skal komme med dine egne tilpassede XPaths ved hjælp af din egen kreativitet. Jeg er sikker på, at du har eller vil stå over for lignende situationer.
I denne tutorial tager vi et kig på de 20 bedste måder til, hvordan man opretter ultimativ XPath til et webelement, som f.eks. At selv når din kode ændres, forbliver din XPath gyldig hele tiden (medmindre udvikler omskriver hele funktion / modul).
Ved at kende alle disse teknikker, vil du blive en mester i at skrive din egen XPath og ville være i stand til at skrive dræber XPaths med meget få chancer for at blive ugyldig.
Lad os først starte med at forstå XPath-syntaksen og definere hver af dens dele.
Billedet nedenfor viser, hvordan XPath vil se ud sammen med en beskrivelse af hver del:
- //: Vælg aktuelle knudepunkter såsom input, div osv.
- Tagname: Tagname af webelementet / noden
- @: Vælg attribut
- Attribut: Attributnavn på noden / det bestemte webelement
- Værdi: Værdien af attributten
Vil bare dele et par tip her, at 80% af tiden mislykkedes mit automatiseringstestscript på grund af XPath. Dette skyldes enten, at der er flere webelementer til den leverede XPath, eller XPath er ikke gyldig, eller siden er ikke indlæst endnu.
Så når din testsag mislykkes:
- Kopier din XPath.
- Søg i browseren (F12 eller udviklerværktøjsvinduet) i DOM for at kontrollere, om den er gyldig eller ej (se nedenstående billede).
Pro Type 1: Sørg for, at det er unikt, og at der ikke vises noget andet webelement, når du søger to gange i DOM.
Pro Type 2: Nogle gange er der et timingproblem, hvilket betyder, at dit webelement / side endnu ikke er indlæst, mens scriptet ledte efter det, og tilføj derfor lidt ventetid og test igen.
Pro Type 3: Prøv at udskrive hele DOM, før du søger efter webelementet. På denne måde kan du fortælle ved at kigge ind i Console, om dit webelement findes i DOM eller ikke.
Inden vi dykker dybt ned i XPath-opslag, er en vigtig ting, jeg vil dele, at hvis du har direkte adgang til udviklingsteamet, eller hvis dit team er placeret, hvor du er, så bed dit udviklingsteam om at give dig unikke id'er i hvert webelement eller i det mindste dem, du vil bruge til automatisering, og dette sparer meget af din tid.
Hvis dette ikke er muligheden, skal du muligvis bruge din kreativitet og komme med dine egne tilpassede XPaths, og det er det, vi vil lære nu.
Top 20 måder at skrive XPath til ethvert webelement
Lad os dybe dybt ned i at skabe de 20 bedste måder til en morder XPath.
# 1) Omvendt opslag
Lad os sige, at du vil klikke på en knap, og der er en lignende knap. Begge knapper har id-attributter, men de er dynamiske, og ingen af attributterne er unikke i begge knapelementerne.
I nedenstående scenarie ønsker vi at klikke på knappen 'Indstilling' i 'Test interaktiv'.
Kode
Hvis du ser på “Setting” -knapperne, er begge koder ens. Ved at bruge traditionelle måder som id, navn, værdi, indeholder osv., Fungerer ingen af dem for eksempel.
// * [indeholder (tekst (), 'Indstilling')], Dette vil resultere i to webelementer. Derfor er det ikke unikt.
Så her er den endelige strategi,
>> Find først det nærmeste tag, der er unikt, og i dette tilfælde er det det
XPATH: “//*[@id='rcTEST']
>> For det andet: Find det tætteste webelement til det tilsigtede webelement, som i dette tilfælde indeholder (tekst (), 'TEST Interactive'). Nu er vi i det samme, hvor knappen 'Indstilling' findes, men for at klikke på den, skal vi først gå til hovedstaden ved at bruge dobbelt prikker som vist nedenfor.
XPATH: “//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/..
>> Som du kan se, er vi på det niveau, der har det andet webelement som knappen 'Setting'. Dette har to knapper i det, og vi vil gå til den anden knap, som er 'Setting' -knappen. Ved at tilføje '/ knap [2]' i slutningen kan vi få vores unikke XPATH til knappen 'Indstilling' som vist nedenfor.
Endelig XPATH:
“//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/../button[2]”
Her er en anden måde at generere på, hvis du tror, de kan ændre webelementtypen fra 'knap' til noget andet.
“//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/..//*[contains(text(), 'Setting')]”
eller ved hjælp af 'følgesøskende'
“//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/following-sibling::button”
# 2) Brug af variabler og brugerdefinerede værdier
Lad os sige, at der er en webapplikation, der har FTP ('File Transfer Protocol') -funktion til at uploade / downloade filer, og du har en testcase til at downloade en bestemt fil ved at klikke på downloadlinket.
For det første kan vi definere det filnavn, som vi leder efter, som en variabel.
String expectfileName = “Test1”;
Nu ved hjælp af XPATH kan vi finde det faktiske filnavn.
“String actualFileName = WebDriverAccess.getDriver().findElement (By.xpath('//*'+fileName +'/tr/td[1]')).getAttribute('title');”
I ovenstående XPath vil… ‘/ tr / td [1] .getAttribute (“ title ”)” gå til den specifikke række og første kolonne og få værdien af titelattributten. Vi kan gemme det faktiske filnavn i en anden variabel.
Når vi har både de forventede og faktiske filnavne, kan vi sammenligne begge, og hvis begge stemmer overens, kan vi blot klikke på dens downloadlink.
(if acutalFileName == expectedFileName) { WebDriverAccess.getDriver().findElement(By.xpath('//*'+fileName +'/tr/td[4]')).click(); }
Vi kan også oprette en sløjfe gennem hver række og fortsætte med at kontrollere filnavnet, indtil du finder det.
Loop(int count <30) { String actualFileName = WebDriverAccess. getDriver ().findElement (By. xpath ('//*'+acutalFileName +'/tr[' + count + ']/td[1]')).getAttribute('title'); (if acutalFileName == expectedFileName) { WebDriverAccess. getDriver ().findElement(By. xpath ('//*'+fileName +'/tr/td[4]')).click(); } Count++; }
Vi kan generere unikke XPATH ved hjælp af tilpassede tags plus tilføje andre betingelser.
For eksempel, Lad os sige, at vores tilsigtede webelement findes i hovedkoden, og der er flere adressekoder, men du vil kun finde en bestemt. Alle adressekoder har en klasseattribut, så vi kan starte med.
hvordan man åbner .swf fil
// address[@class='ng-scope ng-isolate-scope']
Vi bemærkede, at vores tilsigtede webelement er i et tag, der har en tekst kaldet 'Testing'.
// address[@class='ng-scope ng-isolate-scope']//div[contains(.,'Testing')
Vi fandt ud af, at der er flere webelementer fundet som et resultat. Derfor for at gøre det mere unikt kan vi tilføje de andre betingelser såsom 'id', som endelig vil pege os på det webelement, som vi leder efter.
// address[@class='ng-scope ng-isolate-scope']//div[contains(.,Testing') and @id='msgTitle']
# 4) Brug af attributter og tabel XPATH
Lad os antage, at vi vil skrive ind i et webelement, der er placeret inde i en tabel, og bordet er placeret inde i et formelement.
Vi kan finde alle formularerne i DOM med navnet 'myForm'.
“//*[@name='myForm']”
Find nu tabellen med alle id-former med id 'tbl_testdm'.
'//*[@name='myForm']//table[@id='tbl_ testdm’]”
Gå til en bestemt række og kolonne inden for tabellen.
'//*[@name='myForm']//table[@id='tbl_ testdm’]/tbody/tr/td[6]/”
Hvis der er flere indgange i cellen, skal du finde et input, hvor værdi = 'Åbn RFS', og dette vil give os den sidste XPath i feltet.
//*[@name='myForm']//table[@id='tbl_ testdm’]/tbody/tr/td[6]/ input[@value='Open RFS']'
# 5) Brug af attributter, tabeller og tekst
Antag, at dit tilsigtede webelement ligger i paneltabellen og har en fælles tekst.
Start først med et panel med en unik attribut, som i dette tilfælde er 'TITLE'.
//*[@title=’Songs Lis Applet']
Naviger nu gennem alle tabeltags.
//*[@title=’Songs Lis Applet']//table
Inden for alle tabellerne finder du kolonnen, der har teksten 'Forfatter'.
Endelig XPath ville være som:
//*[@title=’Songs List Applet']//table//td[contains(text(),'Author')]
# 6) Generering af XPATH ved hjælp af indlejrede attributter
Målwebelementets XPath kan også genereres ved hjælp af de indlejrede attributter. For eksempel, i dette tilfælde vil det lede efter en bestemt attribut på tværs af DOM og derefter se efter en anden attribut inden for den.
//*[@id='parameters']//*[@id='testUpdateTime']')
# 7) XPath-generation ved at kombinere attributter, divs og knap
For eksempel, i nedenstående XPath kunne jeg finde målwebelementet ved hjælp af en id (relativ XPath), nogle div-tags og en knap.
“//*[@id='MODEL/PLAN']/div[1]/div[2]/div[1]/div[1]/widget/section/div[1]/div/div[1]/div/div/button[1]'
# 8) XPATH Generering ved hjælp af CONTAINS, REVERSE LOOKUP osv.
Engang havde jeg et drop-down uden direkte identifikation. Jeg var nødt til at bruge CONTAINS, REVERSE, DIVs, attributter for at komme med den endelige XPATH som vist nedenfor.
//*[contains(text(),'Watch Dial)]/../div/select[@data-ng-model='context.questions [subqts.subHandleSubId]']'),
# 9) XPath-generation ved hjælp af relativ, CONTAINS, REVERSE, FOLLOWING SIBLING osv.
Jeg havde en situation, hvor applikationen viser en graf, og hver grafværdi skulle valideres. Men desværre havde hver værdi ingen unik identifikation, så jeg er kommet med den endelige XPATH som vist nedenfor for en grafværdi, der kombinerer relative, indeholder, omvendte, efterfølgende søskende og div-tags.
//*[@id='RESEARCH/PLAN']//*[contains(@id, 'A4')]/../../following-sibling::div[1]/div[1]/span[1]/span[1]
# 10) XPath-generering ved hjælp af attributter, indeholder, omvendt, foregående søskende, divs og span
En gang var jeg nødt til at validere forskellige alarmdata, og hver alarmværdi er blevet vist baseret på en bestemt beregning eller timings. For at fange hver værdi var jeg nødt til at komme med nedenstående XPATH, der bruger attributter, indeholder, omvendt, foregående søskende, divs og span tags.
//*[@id='ALARMDATA']//*[contains(@id, 'AFC2')]/../../preceding-sibling::div[1]/div[1]/span[1]/span[1]
# 11) Brug af attributter, XML-tags osv.
I nedenstående XPATH, attributter og XML-tags bruges en sekvens til at komme med den endelige unikke adresse på et webelement.
//*[@id='RESEARCH/REVIEW'] //widget/section/div[1]/div/div[2]/div[1]/div[3]/div[1]//span[@class='details']
# 12) XPath-generation ved ikke at se på hele siden, men se på alle links i stedet og indeholder
Nedenstående XPath ser kun efter links på en hel side, der indeholder teksten som 'Parameter Data Manual Entry'.
//a[contains(.,'Parameter Data Manual Entry')]
# 13) Brug af Indeholder og attributter
//*[contains(@style,'display: block; top:')]//input[@name='daterangepicker_end']
# 14) Brug af attributter, efter søskende og efterkommere
//*[@id='dropdown-filter-serviceTools']/following-sibling::ul/descendant::a[text()='Notepad']
# 15) Brug af attributter, efter søskende, efterkommer og tekst
//*[@id='dropdown-filter-service tools'] /following-sibling::ul/descendant::a[text()='Trigger Dashboard']
# 16) Brug af sidehoved og tekst
Hvis webelementet er en overskrift med en bestemt tekst, kan XPath være som vist nedenfor:
//h3[text()='Internal Debrief']
# 17) Brug af overskriftstekst, efter søskende, sti osv.
//h3[contains(text(),'Helium Level')]/following-sibling::div/label/input
# 18) Brug af attributter, indeholder og foregående søskende
Når jeg havde et spændvidde, der ikke havde nogen unik attribut, havde jeg oprettet XPATH ved at kombinere absolut, Indeholder, foregående søskende og en anden absolut sti.
//div[div[p[contains(text(),'Status')]]]/preceding-sibling::div/div/span[3]/span
# 19) På udkig efter rullemenu ved hjælp af Id Attribute, en bestemt tekst og Reverse Lookup
//*[@id='COUPLING']//*[contains(text(),'COUPLE Trend')]/../div/select
# 20) Kombination af 'id' -attribut og søgning efter et link med specifik tekst
//*[@id='ffaHeaderDropdown']//a[contains(text(),'Start Workflow')]
Konklusion
Når det kommer til at skrive en dræber XPATH, afhænger det virkelig af, hvor godt du forstår og analyserer koden. Jo mere du forstår koden, desto mere vil antallet af måder, du finder ved at skrive effektive XPATH'er.
Det første skridt i at skrive XPath er at finde det nærmeste unikke webelement til dit målwebselement og fortsætte med at komme tættere ved hjælp af forskellige teknikker, der er diskuteret ovenfor, såsom attributter, DIV'er, følgende, indeholder osv.
I sidste ende vil vi sige dette igen, at det virkelig vil gøre dit liv lettere, hvis du beder dit udviklingsteam om at tilføje unikke id'er i alle webelementer, som du er interesseret i.
Hver gang en sprintcyklus eller arbejde med nye krav starter, og holdet deles med nye mockups, går jeg altid igennem alle mocks ups og tænker på potentielle automatiseringstestsager i mit sind, udarbejder en liste over alle potentielle webelementer, der vil blive brugt i automatiseringstest og forberede mine egne id'er.
Når en liste over alle webelementerne sammen med mine foreslåede id'er er afsluttet, vil jeg på forhånd dele den med udvikleren for at blive brugt i udviklingskoden. På denne måde ville jeg altid få unikke id'er ved at gøre min XPATH-skrivekamp let.
Nedenfor er en kombineret liste over forskellige måder at skrive XPATH'er på:
- “// * [@ id =’ rcTEST ’] // * [indeholder (tekst (),‘ TEST interaktiv ’)] /../ knap [2]”
- “// * [@ id =’ rcTEST ’] // * [indeholder (tekst (),‘ TEST interaktiv ’)] /..//* [indeholder (tekst (),‘ Indstilling ’)]”
- “// * [@ id =’ rcTEST ’] // * [indeholder (tekst (),‘ TEST interaktiv ’)] / følgende søskende :: knap”
- 'String actualFileName = WebDriverAccess.getDriver (). FindElement (By.xpath (' // * '+ filnavn +' / tr / td [1] ')). GetAttribute (' titel ');'
- WebDriverAccess.getDriver (). FindElement (By.xpath (“// *” + filnavn + ”/ tr / td [4]”)). Klik ();
- '// adresse [@ class = 'ng-scope ng-isolate-scope'] // div [indeholder (., Testing ') og @ id =' msgTitle ']'
- “// * [@ name =’ myForm ’] // tabel [@ id =’ tbl_ testdm ’] / tbody / tr / td [6] /
- input [@ value = ’Open RFS’] ”
- “// * [@ title =’ Sangliste-applet ’] // tabel // td [indeholder (tekst (), 'Forfatter')]”
- “// * [@ id =’ parametre ’] // * [@ id =’ testUpdateTime ’]”) ”
- “// * [@ id = 'MODEL / PLAN'] / div [1] / div [2] / div [1] / div [1] / widget / sektion / div [1] / div / div [1] / div / div / knap [1] ”
- '// * [indeholder (tekst (), 'Watch Dial)] /../ div / vælg [@ data-ng-model =' context.questions [subqts.subHandleSubId] ']'), '
- “// * [@ id = 'FORSKNING / PLAN'] // * [indeholder (@id, 'A4')] /../../ følgende søskende :: div [1] / div [1] / span [1] / span [1] ”
- “// * [@ id = 'ALARMDATA'] // * [indeholder (@id, 'AFC2')] /../../ foregående søskende :: div [1] / div [1] / span [ 1] / span [1] ”
- “// * [@ id = 'FORSKNING / ANMELDELSE'] // widget / sektion / div [1] / div / div [2] / div [1] / div [3] / div [1] // span [ @ class = 'detaljer'] ”
- “//A [indeholder(.,’Parameter Data Manuel indtastning’)] ”
- “// * [indeholder (@ style,’ display: block; top: ’)] // input [@ name =’ daterangepicker_end ’]”
- “// * [@ id =’ dropdown-filter-serviceTools ’] / følgende-søskende :: ul / descendant :: a [text () =’ Notepad ’]”
- “// * [@ id =’ dropdown-filter-serviceTools ’] / efter-søskende :: ul / descendant :: a [text () =’ Trigger Dashboard ’]”
- “// h3 [text () =‘ Intern debrief ’]”
- “// h3 [indeholder (tekst (),‘ Heliumniveau ’)] / følgesøskende :: div / label / input”
- “// div [div [p [indeholder (tekst (), 'Status')]] / foregående søskende :: div / div / span [3] / span'
- '// * [@ id = 'COUPLING'] // * [indeholder (tekst (), 'COUPLE Trend')] /../ div / select'
- “// * [@ id =’ ffaHeaderDropdown ’] // a [indeholder (tekst (), 'Start arbejdsgang')]'
Håber, at denne informative artikel ville have beriget din viden om at skrive XPaths.
Forfatter Bio: Denne artikel er skrevet af Adnan Arif, en it-professionel, der har forskellig erfaring og færdigheder i sin karriere, der spænder over 9 år.
Anbefalet læsning
- Dybdegående formørkelsesvejledninger til begyndere
- Python DateTime-tutorial med eksempler
- Unix Cat Command Syntax, indstillinger med eksempler
- Unix sorteringskommando med syntaks, indstillinger og eksempler
- Unix Shell Scripting Tutorial med eksempler
- Selen Find Element By Text Tutorial med eksempler
- Pythons hovedfunktionsvejledning med praktiske eksempler
- Xpath Extractor Post-Processor i JMeter