ultimate xpath writing cheat sheet tutorial with syntax
Topp 20 måter å skrive Ultimate XPATH for ALLE typer webelementer (XPATH vil aldri være ugyldig):
En webapplikasjon består av forskjellige typer webelementer, for eksempel webelement for en knapp å klikke på, skriv inn webelement for å skrive tekst, rullegardin, radioknapper osv.
Disse webelementene kalles også koder eller noder.
Når det gjelder automatisering av webapplikasjoner, begynner det med å skrive et automatiseringsskript som finner webelementet, utfører en handling på det, for eksempel, klikk på en knapp, skriv inn tekst i inntastingsboksen, velg en avkrysningsrute, velg en alternativknapp, bla opp eller ned og til slutt verifisere forventet oppførsel i løpet av handlingen.
Hva du vil lære:
- Hva er XPath og hvordan det ser ut?
- Topp 20 måter å skrive XPath for ethvert webelement
- # 1) Omvendt oppslag
- # 2) Bruke variabler og egendefinerte verdier
- # 3) Bruke “XML” -koder, “OG” osv
- # 4) Bruke attributter og tabell XPATH
- # 5) Bruke attributter, tabeller og tekst
- # 6) Generere XPATH ved hjelp av nestede attributter
- # 7) XPath-generering ved å kombinere attributter, divs og knapp
- # 8) XPATH-generering ved hjelp av CONTAINS, REVERSE LOOKUP, etc.
- # 9) XPath-generasjon ved bruk av Relativ, INNEHOLDER, TILBAKE, FØLGENDE SYSTE osv.
- # 10) XPath-generering ved bruk av attributter, inneholder, omvendt, foregående søsken, divs og span
- # 11) Bruke attributter, XML-koder osv.
- # 12) XPath Generation ved ikke å se på hele siden, men å se på alle lenkene i stedet og inneholder
- # 13) Bruk av inneholder og attributter
- # 14) Bruke attributter, følge søsken og etterkommere
- # 15) Bruke attributter, følge søsken, etterkommere og tekst
- # 16) Bruke topptekst og tekst
- # 17) Bruke topptekst, følge søsken, sti osv.
- # 18) Bruke attributter, inneholder og tidligere søsken
- # 19) Ser etter rullegardin ved å bruke Id Attribute, litt spesifikk tekst og omvendt oppslag
- # 20) Kombinere “id” -attributt og se etter en lenke med spesifikk tekst
- Konklusjon
- Anbefalt lesing
Hva er XPath og hvordan det ser ut?
Å finne et element er som å finne noens hus på kartet. Den eneste måten vi kan finne en venns hjem uten ekstern hjelp er at vi skal ha et kart og vite hva vi skal finne (hus).
For å sette denne analogien i vårt tilfelle, vil kartet brukes som DOM (HTML-koder, JavaScript, etc.) der alle webelementene eksisterer, sammen med det spesifikke webelementet vi ønsker å finne.
Når den unike adressen eller banen til et element er funnet, vil automatiseringsskriptet utføre noen handlinger på det basert på testscenarioet. For eksempel, du vil bekrefte URL-en til siden som åpnes etter å ha klikket på en knapp.
Imidlertid er det ikke rett frem å finne en unik adresse / bane til et webelement, da det kan være lignende koder, samme attributtverdier, identiske baner som gjør det vanskelig å opprette eksakt unik adresse til et webelement kalt 'XPATH'.
Her vil vi dykke ned i noen gode og effektive teknikker for å generere gyldig og unik XPATH for alle typer webelementer.
Anbefalt lese => Identifiser nettelementer ved hjelp av XPath i selen
Noen ganger kan du enkelt lage XPaths ved hjelp av nettleserutvidelser, men i min automatiseringstesting karriere, har jeg møtt utallige situasjoner der tradisjonelle nettleserutvidelser ikke fungerer, og du må komme med dine egne tilpassede XPaths ved hjelp av din egen kreativitet. Jeg er sikker på at du har eller vil møte lignende situasjoner.
I denne opplæringen vil vi se på de 20 beste måtene å lage den ultimate XPath for et webelement, slik at selv om koden din endres, vil XPath forbli gyldig hele tiden (med mindre utvikler skriver om hele funksjon / modul).
Ved å kjenne alle disse teknikkene, vil du bli en mester i å skrive din egen XPath og vil være i stand til å skrive mordere XPaths med svært få sjanser for å bli ugyldige.
Først, la oss begynne med å forstå XPath-syntaksen og definere hver av dens deler.
Bildet nedenfor viser hvordan XPath vil se ut sammen med en beskrivelse av hver del:
- //: Velg nåværende node som inngang, div etc.
- Tagname: Tagname av webelementet / noden
- @: Velg attributt
- Egenskap: Attributtnavn på noden / det spesielle webelementet
- Verdi: Verdien av attributtet
Vil bare dele et par tips her om at 80% av tiden min automatiseringstestskript mislyktes på grunn av XPath. Dette skyldes enten at det er flere webelementer for den medfølgende XPath eller XPath er ikke gyldig, eller siden er ikke lastet inn ennå.
Så når testsaken din mislykkes:
- Kopier XPath.
- Søk i den i nettleseren (F12 eller utviklerverktøyvinduet) i DOM for å bekrefte om den er gyldig eller ikke (se bildet nedenfor).
Pro Type 1: Forsikre deg om at den er unik, og at det ikke vises noe annet webelement når du søker to ganger i DOM.
Pro Type 2: Noen ganger er det et tidspunktproblem, noe som betyr at webelementet / siden din ennå ikke er lastet inn mens skriptet lette etter det, og legg derfor til litt ventetid og prøv på nytt.
Pro Type 3: Prøv å skrive ut hele DOM før du søker etter webelementet. På denne måten kan du fortelle ved å se på Console om webelementet ditt finnes i DOM eller ikke.
Før vi dykker dypt inn i XPath slå opp, er en viktig ting jeg vil dele at hvis du har direkte tilgang til utviklingsteamet eller hvis teamet ditt er der du er, så be utviklingsteamet ditt om å gi deg unike ID-er i hvert webelement eller i det minste de du vil bruke til automatisering, og dette vil spare mye tid.
Hvis dette ikke er muligheten, må du kanskje bruke kreativiteten din og komme med dine egne tilpassede XPaths, og det er det vi skal lære nå.
Topp 20 måter å skrive XPath for ethvert webelement
La oss dykke inn i å lage de 20 beste måtene å drepe XPath på.
# 1) Omvendt oppslag
La oss si at du vil klikke på en knapp, og det er en lignende knapp. Begge knappene har id-attributter, men de er dynamiske, og ingen av attributtene er unike i begge knappelementene.
I scenariet nedenfor ønsker vi å klikke på “Setting” -knappen i “Test Interactive”.
Kode
Hvis du ser på “Setting” -knappene, er begge kodene like. Ved å bruke tradisjonelle måter som id, navn, verdi, inneholder osv., Fungerer ingen av dem for eksempel.
// * (inneholder (tekst (), ‘Setting’)), Dette vil resultere i to webelementer. Derfor er det ikke unikt.
Så her er den endelige strategien,
>> Først, finn den nærmeste taggen som er unik, og i dette tilfellet er den
XPATH: “//*(@id='rcTEST')
>> For det andre, finn det nærmeste webelementet til det tiltenkte webelementet som i dette tilfellet inneholder (tekst (), ‘TEST Interactive’). Nå er vi i det samme der 'Innstilling' -knappen eksisterer, men for å klikke på den, må vi først gå til hovedmenyen ved å bruke doble prikker som vist nedenfor.
XPATH: “//*(@id='rcTEST')//*(contains(text(), 'TEST Interactive'))/..
>> Som du kan se, er vi på nivået som har det andre webelementet som 'Setting' -knappen. Dette har to knapper i seg, og vi vil gå til den andre knappen som er 'Setting' -knappen. Ved å legge til ‘/ button (2)’ på slutten kan vi få vår unike XPATH for ‘Setting’ -knappen som vist nedenfor.
Endelig XPATH:
“//*(@id='rcTEST')//*(contains(text(), 'TEST Interactive'))/../button(2)”
Her er en annen måte å generere hvis du tror de kan endre typen webelement fra 'knapp' til noe annet.
“//*(@id='rcTEST')//*(contains(text(), 'TEST Interactive'))/..//*(contains(text(), 'Setting'))”
eller ved hjelp av 'følgesøsken'
“//*(@id='rcTEST')//*(contains(text(), 'TEST Interactive'))/following-sibling::button”
# 2) Bruke variabler og egendefinerte verdier
La oss si at det er et webapplikasjon som har FTP ('File Transfer Protocol') -funksjon for å laste opp / laste ned filer, og du har en testtilfelle for å laste ned en bestemt fil ved å klikke på nedlastingskoblingen.
Først kan vi definere filnavnet vi leter etter som en variabel.
String expectfileName = “Test1”;
hvordan åpner jeg en XML-fil
Nå med XPATH kan vi finne det faktiske filnavnet.
“String actualFileName = WebDriverAccess.getDriver().findElement (By.xpath('//*'+fileName +'/tr/td(1)')).getAttribute('title');”
I ovennevnte XPath vil… ‘/ tr / td (1) .getAttribute (“ title ”)’ gå til den spesifikke raden og den første kolonnen og få verdien av tittelattributtet. Vi kan lagre det faktiske filnavnet i en annen variabel.
Når vi har både forventede og faktiske filnavn, kan vi sammenligne begge, og hvis begge samsvarer, kan vi bare klikke på nedlastingskoblingen.
(if acutalFileName == expectedFileName) { WebDriverAccess.getDriver().findElement(By.xpath('//*'+fileName +'/tr/td(4)')).click(); }
Vi kan også lage en løkke gjennom hver rad og fortsette å bekrefte filnavnet til du finner 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 unike XPATH ved hjelp av tilpassede koder, pluss å legge til andre forhold.
For eksempel, la oss si at det tiltenkte webelementet vårt finnes i hovedkoden, og det er flere adressekoder, men du vil bare finne en bestemt. Alle adressekoder har en klasseattributt, og dermed kan vi begynne med.
// address(@class='ng-scope ng-isolate-scope')
Vi la merke til at det tiltenkte webelementet vårt er i en tagg som har litt tekst som heter 'Testing'.
// address(@class='ng-scope ng-isolate-scope')//div(contains(.,'Testing')
Vi fant ut at det er flere webelementer funnet som et resultat. Derfor, for å gjøre det mer unikt, kan vi legge til de andre forholdene som 'id' som til slutt vil peke oss på webelementet vi leter etter.
// address(@class='ng-scope ng-isolate-scope')//div(contains(.,Testing') and @id='msgTitle')
# 4) Bruke attributter og tabell XPATH
La oss anta at vi ønsker å skrive inn i et webelement som er plassert inne i en tabell og bordet er plassert i et skjemaelement.
Vi finner alle skjemaene i DOM med navnet ‘myForm’.
“//*(@name='myForm')”
Nå i alle skjemaene, finn tabellen med id ‘tbl_testdm’.
'//*(@name='myForm')//table(@id='tbl_ testdm’)”
Gå til en bestemt rad og kolonne i tabellen.
'//*(@name='myForm')//table(@id='tbl_ testdm’)/tbody/tr/td(6)/”
Hvis det er flere innganger i cellen, så finn en inngang der verdien = ‘Åpne RFS’, og dette vil gi oss den endelige XPath i feltet.
//*(@name='myForm')//table(@id='tbl_ testdm’)/tbody/tr/td(6)/ input(@value='Open RFS')'
# 5) Bruke attributter, tabeller og tekst
Anta at det tiltenkte webelementet ditt ligger i paneltabellen og har litt vanlig tekst.
Start først med et panel som har en unik attributt som i dette tilfellet er 'TITLE'.
//*(@title=’Songs Lis Applet')
Nå navigerer du gjennom alle tabellkodene.
//*(@title=’Songs Lis Applet')//table
Innenfor alle tabellene finner du kolonnen som har teksten ‘Forfatter’.
Endelig XPath vil være som:
//*(@title=’Songs List Applet')//table//td(contains(text(),'Author'))
# 6) Generere XPATH ved hjelp av nestede attributter
Målnettelementets XPath kan også genereres ved hjelp av de nestede attributtene. For eksempel, i dette tilfellet vil det se etter et bestemt attributt på tvers av DOM, og deretter se etter et annet attributt i det.
//*(@id='parameters')//*(@id='testUpdateTime')')
# 7) XPath-generering ved å kombinere attributter, divs og knapp
For eksempel, i XPath nedenfor, var jeg i stand til å finne målnettelementet ved å bruke en id (relativ XPath), noen div-koder og en knapp.
“//*(@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 hjelp av CONTAINS, REVERSE LOOKUP, etc.
En gang hadde jeg en rullegardin uten direkte identifikasjon. Jeg måtte bruke CONTAINS, REVERSE, DIVs, attributter for å komme opp med den endelige XPATH som vist nedenfor.
//*(contains(text(),'Watch Dial))/../div/select(@data-ng-model='context.questions (subqts.subHandleSubId)')'),
# 9) XPath-generasjon ved bruk av Relativ, INNEHOLDER, TILBAKE, FØLGENDE SYSTE osv.
Jeg hadde en situasjon der applikasjonen viser en graf, og hver grafverdi måtte valideres. Men dessverre hadde ikke hver verdi noen unik identifikasjon, så jeg har kommet med den endelige XPATH som vist nedenfor for en grafverdi som kombinerer relative, inneholder, omvendte, etterfølgende søsken og div-koder.
//*(@id='RESEARCH/PLAN')//*(contains(@id, 'A4'))/../../following-sibling::div(1)/div(1)/span(1)/span(1)
# 10) XPath-generering ved bruk av attributter, inneholder, omvendt, foregående søsken, divs og span
En gang måtte jeg validere forskjellige alarmdata, og hver alarmverdi ble vist basert på en spesifikk beregning eller tidspunkter. For å fange hver verdi, måtte jeg komme med XPATH nedenfor som bruker attributter, inneholder, omvendt, foregående søsken, divs og span-koder.
//*(@id='ALARMDATA')//*(contains(@id, 'AFC2'))/../../preceding-sibling::div(1)/div(1)/span(1)/span(1)
# 11) Bruke attributter, XML-koder osv.
I XPATH, attributter og XML-koder nedenfor brukes en sekvens for å komme opp med den endelige unike adressen til 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 å se på hele siden, men å se på alle lenkene i stedet og inneholder
XPath nedenfor vil bare se etter lenker på en hel side som inneholder teksten 'Parameter Data Manual Entry'.
//a(contains(.,'Parameter Data Manual Entry'))
# 13) Bruk av inneholder og attributter
//*(contains(@style,'display: block; top:'))//input(@name='daterangepicker_end')
# 14) Bruke attributter, følge søsken og etterkommere
//*(@id='dropdown-filter-serviceTools')/following-sibling::ul/descendant::a(text()='Notepad')
# 15) Bruke attributter, følge søsken, etterkommere og tekst
//*(@id='dropdown-filter-service tools') /following-sibling::ul/descendant::a(text()='Trigger Dashboard')
# 16) Bruke topptekst og tekst
Hvis webelementet er en overskrift med en bestemt tekst, kan XPath være som vist nedenfor:
//h3(text()='Internal Debrief')
# 17) Bruke topptekst, følge søsken, sti osv.
//h3(contains(text(),'Helium Level'))/following-sibling::div/label/input
# 18) Bruke attributter, inneholder og tidligere søsken
Når jeg hadde et spenn som ikke hadde noe unikt attributt, hadde jeg opprettet XPATH ved å kombinere absolutt, Inneholder, foregående søsken og en annen absolutt vei.
//div(div(p(contains(text(),'Status'))))/preceding-sibling::div/div/span(3)/span
# 19) Ser etter rullegardin ved å bruke Id Attribute, litt spesifikk tekst og omvendt oppslag
//*(@id='COUPLING')//*(contains(text(),'COUPLE Trend'))/../div/select
# 20) Kombinere “id” -attributt og se etter en lenke med spesifikk tekst
//*(@id='ffaHeaderDropdown')//a(contains(text(),'Start Workflow'))
Konklusjon
Når det gjelder å skrive en morder XPATH, kommer det virkelig an på hvor godt du forstår og analyserer koden. Jo mer du forstår koden, desto mer vil antall måter du finner ved å skrive effektive XPATHer.
Det første trinnet i å skrive XPath er å finne det nærmeste unike webelementet til målwebelementet ditt og fortsette å komme nærmere ved hjelp av forskjellige teknikker som er diskutert ovenfor, for eksempel attributter, DIV, følgende, inneholder osv.
Til slutt vil vi si dette igjen at det virkelig vil gjøre livet ditt lettere hvis du ber utviklingsteamet ditt om å legge til unike ID-er i alle webelementer du er interessert i.
Når en sprintsyklus eller arbeid med nye krav starter og teamet deles med nye mockups, går jeg alltid gjennom alle mocks ups og tenker på potensielle automatiseringstestsaker i mitt sinn, lager en liste over alle potensielle webelementer som skal brukes i automatiseringstester og utarbeide egne ID-er.
Når en liste over alle webelementene sammen med mine foreslåtte ID-er er fullført, vil jeg dele den til utvikleren på forhånd for å bli brukt i utviklingskoden. På denne måten ville jeg alltid få unike ID-er ved å gjøre skrivekampen min XPATH enkel.
Nedenfor er en kombinert liste over forskjellige måter å skrive XPATH på:
- “// * (@ id =’ rcTEST ’) // * (inneholder (tekst (),‘ TEST interaktiv ’)) /../ knapp (2)”
- “// * (@ id =’ rcTEST ’) // * (inneholder (tekst (),‘ TEST interaktiv ’)) /..//* (inneholder (tekst (),‘ Innstilling ’))”
- “// * (@ id =’ rcTEST ’) // * (inneholder (tekst (),‘ TEST interaktiv ’)) / følgesøsken :: knapp”
- “String actualFileName = WebDriverAccess.getDriver (). FindElement (By.xpath (“ // * ”+ filnavn +” / tr / td (1) ”)). GetAttribute (“ tittel ”);”
- WebDriverAccess.getDriver (). FindElement (By.xpath (“// *” + filnavn + ”/ tr / td (4)”)). Klikk ();
- '// adresse (@ class = 'ng-scope ng-isolate-scope') // div (inneholder (., Testing ') og @ id =' msgTitle ')'
- “// * (@ name =’ myForm ’) // tabell (@ id =’ tbl_ testdm ’) / tbody / tr / td (6) /
- input (@ value = ’Open RFS’) ”
- “// * (@ title =’ Songs List Applet ’) // tabell // td (inneholder (tekst (),’ Forfatter ’))”
- “// * (@ id =’ parameters ’) // * (@ id =’ testUpdateTime ’)”) ”
- “// * (@ id = 'MODELL / PLAN') / div (1) / div (2) / div (1) / div (1) / widget / seksjon / div (1) / div / div (1) / div / div / knapp (1) ”
- “// * (inneholder (tekst (),’ Watch Dial)) /../ div / velg (@ data-ng-model = ’context.questions (subqts.subHandleSubId)’) ”),”
- “// * (@ id = 'FORSKNING / PLANLEGG') // * (inneholder (@id, 'A4')) /../../ etter-søsken :: div (1) / div (1) / span (1) / span (1) ”
- “// * (@ id = 'ALARMDATA') // * (inneholder (@id, 'AFC2')) /../../ foregående søsken :: div (1) / div (1) / span ( 1) / spenn (1) ”
- “// * (@ id = 'FORSKNING / ANMELDELSE') // widget / seksjon / div (1) / div / div (2) / div (1) / div (3) / div (1) // span ( @ class = 'details') ”
- “//A (inneholder(.,’Parameter Data Manual Entry’)) ”
- “// * (inneholder (@ style,’ display: block; top: ’)) // input (@ name =’ daterangepicker_end ’)”
- “// * (@ id =’ dropdown-filter-serviceTools ’) / følgende søsken :: ul / descendant :: a (text () =’ Notisblokk ’)”
- “// * (@ id =’ dropdown-filter-serviceTools ’) / følgesøsken :: ul / descendant :: a (text () =‘ Trigger Dashboard ’)”
- “// h3 (text () =’ Internal Debrief ’)”
- “// h3 (inneholder (tekst (),’ Heliumnivå ’)) / følgesøsken :: div / label / input”
- “// div (div (p (inneholder (tekst (),‘ Status ’))) / foregående søsken :: div / div / span (3) / span”
- “// * (@ id =’ COUPLING ’) // * (inneholder (tekst (),‘ COUPLE Trend ’)) /../ div / select”
- “// * (@ id =’ ffaHeaderDropdown ’) // a (inneholder (tekst (),‘ Start arbeidsflyt ’))”
Håper denne informative artikkelen ville ha beriket din kunnskap om å skrive XPaths.
Forfatter Bio: Denne artikkelen er skrevet av Adnan Arif, en IT-profesjonell som har mangfoldig erfaring og ferdigheter i sin karriere over 9 år.
Anbefalt lesing
- In-Depth Eclipse Tutorials For Beginners
- Python DateTime Tutorial med eksempler
- Unix Cat Command Syntax, Alternativer med eksempler
- Unix sorteringskommando med syntaks, alternativer og eksempler
- Unix Shell Scripting Tutorial med eksempler
- Selen Find Element By Text Tutorial med eksempler
- Python hovedfunksjonsveiledning med praktiske eksempler
- Xpath Extractor Post-prosessor i JMeter