ultimate xpath writing cheat sheet tutorial with syntax
20 najboljih načina za pisanje ultimativnog XPATH-a za BILO KOJU vrstu web-elementa (XPATH nikada neće biti nevaljan):
Web aplikacija sastoji se od različitih vrsta web elemenata poput web elementa za gumb na koji treba kliknuti, unosa web elementa za upisivanje teksta, padajućeg izbornika, radio gumba itd.
Ti se web elementi nazivaju i oznakama ili čvorovima.
Kada je riječ o automatizaciji web aplikacija, započinje pisanjem skripte za automatizaciju koja će pronaći web element, izvršiti radnju na njemu, poput, kliknuti gumb, unijeti tekst u okvir za unos, označiti potvrdni okvir, odabrati radio gumb, pomaknite se prema gore ili dolje i konačno provjerite očekivano ponašanje zauzvrat radnje.
Što ćete naučiti:
- Što je XPath i kako to izgleda?
- 20 najboljih načina za pisanje XPath-a za bilo koji web element
- # 1) Obrnuto pretraživanje
- # 2) Korištenje varijabli i prilagođenih vrijednosti
- # 3) Korištenje oznaka 'XML', 'AND' itd
- # 4) Korištenje atributa i tablice XPATH
- # 5) Korištenje atributa, tablica i teksta
- # 6) Generiranje XPATH pomoću ugniježđenih atributa
- # 7) Generacija XPath kombiniranjem atributa, dijeljenja i gumba
- # 8) XPATH Generiranje pomoću CONTAINS, REVERSE LOOKUP, itd.
- # 9) XPath generacija pomoću relativnog, SADRŽI, REVERZNO, SLIJEDEĆE SIBLIRANJE itd.
- # 10) Generiranje XPath-a pomoću atributa, sadrži, obrnuto, pre-srodstvo, dijeljenja i raspon
- # 11) Korištenje atributa, XML oznaka itd.
- # 12) Generacija XPath-a ne pregledavanjem cijele stranice, već proučavanjem svih poveznica i sadržaja
- # 13) Upotreba Sadržaja i Atributa
- # 14) Korištenje atributa, praćenja braće i sestara i potomka
- # 15) Korištenje atributa, praćenja braće i sestara, potomka i teksta
- # 16) Korištenje zaglavlja i teksta
- # 17) Korištenje teksta zaglavlja, praćenja braće i sestara, puta itd.
- # 18) Korištenje atributa, sadržaja i prethodne braće i sestara
- # 19) Traženje padajućeg izbornika pomoću atributa identiteta, određenog teksta i obrnutog pretraživanja
- # 20) Kombiniranje atributa 'id' i traženje poveznice s određenim tekstom
- Zaključak
- Preporučena literatura
Što je XPath i kako to izgleda?
Pronaći element je poput pronalaska nečije kuće na karti. Jedini način na koji možemo pronaći prijateljev dom bez ikakve vanjske pomoći je da bismo trebali imati kartu i znati što pronaći (kuću).
Da bi se ova analogija stavila u naš slučaj, karta će se koristiti kao DOM (HTML oznake, JavaScript, itd.) Gdje postoje svi web elementi, zajedno sa određenim web elementom koji želimo pronaći.
Jednom kada se pronađe jedinstvena adresa ili putanja elementa, skripta automatizacije će na njemu izvršiti neke radnje na temelju testnog scenarija. Na primjer, želite provjeriti URL stranice koja se otvara nakon klika na gumb.
Međutim, nije ravno naprijed pronaći jedinstvenu adresu / put web elementa jer mogu postojati slične oznake, iste vrijednosti atributa, identične staze zbog kojih je teško stvoriti tačnu jedinstvenu adresu web elementu nazvanom 'XPATH'.
Ovdje ćemo duboko zaroniti u neke sjajne i učinkovite tehnike za generiranje valjanih i jedinstvenih XPATH za bilo koju vrstu web elemenata.
Preporučeno čitanje => Prepoznajte web elemente pomoću XPath-a u selenu
Ponekad možete lako stvoriti XPaths pomoću proširenja preglednika, ali u mojem ispitivanje automatizacije u karijeri suočio sam se s bezbroj situacija u kojima tradicionalna proširenja preglednika ne rade i morate sami izraditi svoje prilagođene XPaths koristeći svoju kreativnost. Siguran sam da ste se i suočavali sa sličnim situacijama.
U ovom uputstvu ćemo pogledati 20 najboljih načina kako stvoriti konačni XPath za web element na takav način da čak i kada se vaš kôd promijeni vaš XPath ostaje cijelo vrijeme valjan (osim ako programer ne prepiše cijeli značajka / modul).
Poznavajući sve ove tehnike, postat ćete majstor pisanja vlastitog XPath-a i moći ćete pisati ubojite XPath-ove s vrlo malo šansi da postanu nevaljani.
Prvo, krenimo s razumijevanjem sintakse XPath i definirajmo svaki njegov dio.
Slika dolje pokazat će kako će XPath izgledati zajedno s opisom svakog dijela:
- //: Odaberite trenutni čvor kao što su ulaz, div itd.
- Oznaka: Oznaka web elementa / čvora
- @: Odaberite atribut
- Atribut: Ime atributa čvora / određenog web elementa
- Vrijednost: Vrijednost atributa
Želim ovdje podijeliti nekoliko savjeta da 80% vremena moja skripta za automatizaciju nije uspjela zbog XPath-a. To je uzrokovano time što za ponuđeni XPath postoji više web elemenata ili XPath nije valjan ili stranica još nije učitana.
Dakle, kad god test test ne uspije:
- Kopirajte svoj XPath.
- Pretražite ga u pregledniku (F12 ili prozor alata za programere) u DOM-u da biste provjerili je li valjan ili ne (pogledajte donju sliku).
Pro tip 1: Provjerite je li jedinstven i da se pri pretraživanju DOM-a dvaput ne pojavljuje nijedan drugi web element.
aplikacija za špijuniranje android telefona
Pro tip 2: Ponekad postoji problem s vremenom, što znači da vaš web element / stranica još nije učitan dok ga je skripta tražila, pa dodajte malo vremena čekanja i ponovite test.
Pro tip 3: Pokušajte ispisati cijeli DOM prije nego što potražite web element. Na taj način uvidom u Konzolu možete utvrditi postoji li vaš web element u DOM-u ili ne.
Prije nego što zaronimo duboko u XPath potragu, jedna važna stvar koju želim podijeliti jest da ako imate izravan pristup razvojnom timu ili ako se vaš tim nalazi tamo gdje se nalazite, zatražite od svog razvojnog tima da vam pruži jedinstvene ID-ove u svaki web element ili barem one koje želite koristiti za automatizaciju, a to će vam uštedjeti puno vremena.
Ako to nije mogućnost, tada ćete možda trebati iskoristiti svoju kreativnost i osmisliti vlastite prilagođene XPaths i što ćemo sada naučiti.
20 najboljih načina za pisanje XPath-a za bilo koji web element
Zaronimo u stvaranje 20 najboljih načina za ubojiti XPath.
# 1) Obrnuto pretraživanje
Recimo da želite kliknuti gumb i postoji sličan gumb. Oba gumba imaju atribute id, ali su dinamični i niti jedan od atributa nije jedinstven u oba elementa gumba.
U donjem scenariju želimo kliknuti gumb 'Postavljanje' na 'Test Interactive'.
Kodirati
Ako pogledate tipke 'Postavljanje', oba su koda slična. Korištenjem tradicionalnih načina kao što su id, ime, vrijednost, sadrži itd., Niti jedan od njih neće raditi, na primjer.
// * [sadrži (text (), ‘Setting’)], To će rezultirati dvama web elementima. Stoga nije jedinstven.
Evo konačne strategije,
>> Prvo pronađite najbližu oznaku koja je jedinstvena i u ovom slučaju jest
XPATH: “//*[@id='rcTEST']
>> Drugo, pronađite web element najbliži predviđenom web elementu koji u ovom slučaju sadrži (text (), „TEST Interactive“). Sada smo u istom mjestu gdje postoji gumb 'Postavljanje', ali da bismo ga kliknuli, prvo moramo otići na glavno pomoću dvostrukih točaka kao što je prikazano dolje.
XPATH: “//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/..
>> Kao što vidite, nalazimo se na razini koja ima drugi web element kao gumb 'Postavljanje'. U njemu se nalaze dva gumba i želimo prijeći na drugi gumb koji je gumb 'Postavka'. Dodavanjem '/ gumba [2]' na kraju možemo dobiti naš jedinstveni XPATH za gumb 'Postavka' kako je prikazano dolje.
Konačni XPATH:
“//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/../button[2]”
Evo još jednog načina generiranja ako mislite da bi mogli promijeniti vrstu web elementa iz 'gumb' u nešto drugo.
“//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/..//*[contains(text(), 'Setting')]”
ili pomoću 'srodnika ili srodnika'
“//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/following-sibling::button”
# 2) Korištenje varijabli i prilagođenih vrijednosti
Recimo da postoji web aplikacija koja ima FTP ('File Transfer Protocol') značajku za prijenos / preuzimanje datoteka, a vi imate testni slučaj za preuzimanje određene datoteke klikom na vezu za preuzimanje.
Prvo, možemo definirati naziv datoteke koju tražimo kao varijablu.
Niz očekujefileName = “Test1”;
kako pronaći xpath u kromu za selen
Sada pomoću XPATH-a možemo pronaći stvarno ime datoteke.
“String actualFileName = WebDriverAccess.getDriver().findElement (By.xpath('//*'+fileName +'/tr/td[1]')).getAttribute('title');”
U gore navedenom XPathu,… ‘/ tr / td [1] .getAttribute (“ title ”)“ ići će na određeni redak i prvi stupac i dobiti vrijednost atributa naslova. Stvarno ime datoteke možemo pohraniti u drugu varijablu.
Nakon što dobijemo i očekivana i stvarna imena datoteka, možemo ih usporediti i ako se oba podudaraju, jednostavno možemo kliknuti na vezu za preuzimanje.
(if acutalFileName == expectedFileName) { WebDriverAccess.getDriver().findElement(By.xpath('//*'+fileName +'/tr/td[4]')).click(); }
Također možemo stvoriti petlju kroz svaki redak i nastaviti provjeravati naziv datoteke dok ga ne pronađete.
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++; }
Možemo generirati jedinstveni XPATH pomoću prilagođenih oznaka i dodati druge uvjete.
Na primjer, recimo da naš namjeravani web element postoji u glavnoj oznaci i da postoji više oznaka adresa, ali želite pronaći samo određenu. Sve adresne oznake imaju atribut klase, pa možemo započeti s.
// address[@class='ng-scope ng-isolate-scope']
Primijetili smo da se naš namjeravani web element nalazi u oznaci koja sadrži tekst koji se naziva 'Testiranje'.
// address[@class='ng-scope ng-isolate-scope']//div[contains(.,'Testing')
Shvatili smo da je kao rezultat pronađeno više web elemenata. Stoga da bismo ga učinili jedinstvenijim, možemo dodati i ostale uvjete poput 'id' koji će nas napokon uputiti na web element koji tražimo.
// address[@class='ng-scope ng-isolate-scope']//div[contains(.,Testing') and @id='msgTitle']
# 4) Korištenje atributa i tablice XPATH
Pretpostavimo da želimo upisati web element koji se nalazi unutar tablice, a tablica unutar elementa obrasca.
U DOM-u možemo pronaći sve obrasce s imenom ‘myForm’.
“//*[@name='myForm']”
Sada u svim oblicima pronađite tablicu s id-om 'tbl_testdm'.
'//*[@name='myForm']//table[@id='tbl_ testdm’]”
Unutar tablice idite na određeni redak i stupac.
'//*[@name='myForm']//table[@id='tbl_ testdm’]/tbody/tr/td[6]/”
Ako postoji više ulaza unutar ćelije, pronađite ulaz gdje je vrijednost = 'Otvori RFS', a to će nam dati konačni XPath polja.
//*[@name='myForm']//table[@id='tbl_ testdm’]/tbody/tr/td[6]/ input[@value='Open RFS']'
# 5) Korištenje atributa, tablica i teksta
Pretpostavimo da se vaš namjeravani web element nalazi u tablici ploča i ima neki uobičajeni tekst.
Prvo započnite s pločom koja ima jedinstveni atribut koji je u ovom slučaju 'TITLE'.
//*[@title=’Songs Lis Applet']
Sada se krećite kroz sve oznake tablice.
//*[@title=’Songs Lis Applet']//table
Unutar svih tablica pronađite stupac s tekstom 'Autor'.
Završni XPath bio bi poput:
youtube to mp3 pretvarač besplatno sef
//*[@title=’Songs List Applet']//table//td[contains(text(),'Author')]
# 6) Generiranje XPATH pomoću ugniježđenih atributa
XPath ciljanog web elementa također se može generirati pomoću ugniježđenih atributa. Na primjer, u ovom će slučaju tražiti određeni atribut u DOM-u, a zatim potražiti drugi atribut unutar njega.
//*[@id='parameters']//*[@id='testUpdateTime']')
# 7) Generacija XPath kombiniranjem atributa, dijeljenja i gumba
Na primjer, u donjem XPath-u uspio sam pronaći ciljani web element koristeći id (relativni XPath), neke div oznake i gumb.
“//*[@id='MODEL/PLAN']/div[1]/div[2]/div[1]/div[1]/widget/section/div[1]/div/div[1]/div/div/button[1]'
# 8) XPATH Generiranje pomoću CONTAINS, REVERSE LOOKUP, itd.
Jednom sam imao padajući meni bez izravne identifikacije. Morao sam koristiti atribute CONTAINS, REVERSE, DIV, da bih došao do konačnog XPATH-a kao što je prikazano dolje.
//*[contains(text(),'Watch Dial)]/../div/select[@data-ng-model='context.questions [subqts.subHandleSubId]']'),
# 9) XPath generacija pomoću relativnog, SADRŽI, REVERZNO, SLIJEDEĆE SIBLIRANJE itd.
Imao sam situaciju u kojoj aplikacija prikazuje grafikon, a svaka vrijednost grafa morala je biti provjerena. Ali, nažalost, svaka vrijednost nije imala jedinstvenu identifikaciju, pa sam smislio konačni XPATH, kao što je prikazano u nastavku, za jednu vrijednost grafa koja kombinira relativne, sadrži, obrnute, sljedive i div oznake.
//*[@id='RESEARCH/PLAN']//*[contains(@id, 'A4')]/../../following-sibling::div[1]/div[1]/span[1]/span[1]
# 10) Generiranje XPath-a pomoću atributa, sadrži, obrnuto, pre-srodstvo, dijeljenja i raspon
Jednom sam morao provjeriti valjanost različitih podataka alarma i svaka vrijednost alarma prikazana je na temelju određenog izračuna ili vremena. Da bih uhvatio svaku vrijednost, morao sam smisliti donji XPATH koji koristi atribute, sadrži oznake obrnutog, prethodnog pobratima, divs i span.
//*[@id='ALARMDATA']//*[contains(@id, 'AFC2')]/../../preceding-sibling::div[1]/div[1]/span[1]/span[1]
# 11) Korištenje atributa, XML oznaka itd.
U donjem XPATH, atributima i XML oznakama, slijed se koristi za dobivanje konačne jedinstvene adrese web elementa.
//*[@id='RESEARCH/REVIEW'] //widget/section/div[1]/div/div[2]/div[1]/div[3]/div[1]//span[@class='details']
# 12) Generacija XPath-a ne pregledavanjem cijele stranice, već proučavanjem svih poveznica i sadržaja
Donji XPath tražit će samo poveznice na cijeloj stranici koje sadrže tekst kao 'Ručni unos podataka parametara'.
//a[contains(.,'Parameter Data Manual Entry')]
# 13) Upotreba Sadržaja i Atributa
//*[contains(@style,'display: block; top:')]//input[@name='daterangepicker_end']
# 14) Korištenje atributa, praćenja braće i sestara i potomka
//*[@id='dropdown-filter-serviceTools']/following-sibling::ul/descendant::a[text()='Notepad']
# 15) Korištenje atributa, praćenja braće i sestara, potomka i teksta
//*[@id='dropdown-filter-service tools'] /following-sibling::ul/descendant::a[text()='Trigger Dashboard']
# 16) Korištenje zaglavlja i teksta
Ako je web element zaglavlje s određenim tekstom, tada bi XPath mogao biti kao što je prikazano dolje:
//h3[text()='Internal Debrief']
# 17) Korištenje teksta zaglavlja, praćenja braće i sestara, puta itd.
//h3[contains(text(),'Helium Level')]/following-sibling::div/label/input
# 18) Korištenje atributa, sadržaja i prethodne braće i sestara
Jednom kad sam imao raspon koji nije imao jedinstveni atribut, stvorio sam XPATH kombinirajući apsolut, Sadrži, prethodnu braću i sestre i još jedan apsolutni put.
//div[div[p[contains(text(),'Status')]]]/preceding-sibling::div/div/span[3]/span
# 19) Traženje padajućeg izbornika pomoću atributa identiteta, određenog teksta i obrnutog pretraživanja
//*[@id='COUPLING']//*[contains(text(),'COUPLE Trend')]/../div/select
# 20) Kombiniranje atributa 'id' i traženje poveznice s određenim tekstom
//*[@id='ffaHeaderDropdown']//a[contains(text(),'Start Workflow')]
Zaključak
Što se tiče pisanja ubojitog XPATH-a, to stvarno ovisi o tome koliko dobro razumijete i analizirate kôd. Što više razumijete kôd, to će biti više načina koje ćete pronaći u pisanju učinkovitih XPATH-ova.
Prvi korak u pisanju XPath-a je pronalaženje najbližeg jedinstvenog web-elementa vašem ciljanom web-elementu i neprestano približavanje koristeći se gore spomenutim tehnikama kao što su atributi, DIV-ovi, sljedeći sadržaji itd.
Na kraju bismo to još jednom rekli da će vam stvarno olakšati život ako zatražite da vaš razvojni tim doda jedinstvene ID-ove u sve web elemente koji vas zanimaju.
Kad god započne sprint ciklus ili rad na novim zahtjevima, a tim se podijeli s novim maketama, uvijek prođem kroz sve makete i u mislima razmišljam o potencijalnim testnim slučajevima automatizacije, pripremim popis svih potencijalnih web elemenata koji će se koristiti u testovima automatizacije i pripremam vlastite ID-ove.
Jednom kada se završi popis svih web elemenata zajedno s mojim predloženim ID-ovima, prethodno bih ga podijelio programeru kako bi se koristio u razvojnom kodu. Na taj bih način uvijek dobivao jedinstvene ID-ove olakšavajući svoju bitku za pisanje XPATH-a.
Ispod je kombinirani popis različitih načina za pisanje XPATH-a:
- “// * [@ id =’ rcTEST ’] // * [sadrži (tekst (),‘ TEST Interactive ’)] /../ gumb [2]”
- “// * [@ id =’ rcTEST ’] // * [sadrži (text (),‘ TEST Interactive ’)] /..//* [sadrži (text (),‘ Setting ’)]”
- “// * [@ id =’ rcTEST ’] // * [sadrži (text (),‘ TEST Interactive ’)] / follow-sibling :: button”
- 'String actualFileName = WebDriverAccess.getDriver (). FindElement (By.xpath (' // * '+ fileName +' / tr / td [1] ')). GetAttribute (' title ');'
- WebDriverAccess.getDriver (). FindElement (By.xpath (“// *” + FileName + ”/ tr / td [4]”)). Click ();
- '// adresa [@ class = 'ng-scope ng-isolate-scope'] // div [sadrži (., Testiranje ') i @ id =' msgTitle ']'
- “// * [@ name =’ myForm ’] // // tablica [@ id =’ tbl_ testdm ’] / tbody / tr / td [6] /
- ulaz [@ value = 'Open RFS'] '
- “// * [@ title =’ Aplet s popisom pjesama ’] // tablica // td [sadrži (tekst (),‘ Autor ’)]”
- “// * [@ id =’ parametri ’] // * [@ id =’ testUpdateTime ’]”) ”
- “// * [@ id = 'MODEL / PLAN'] / div [1] / div [2] / div [1] / div [1] / widget / section / div [1] / div / div [1] / div / div / gumb [1] '
- '// * [sadrži (tekst (), 'Biranje broja)] /../ div / odaberite [@ data-ng-model =' context.questions [subqts.subHandleSubId] ']'), '
- “// * [@ id = 'ISTRAŽIVANJE / PLAN'] // * [sadrži (@id, 'A4')] /../../ following-sibling :: div [1] / div [1] / raspon [1] / raspon [1] '
- “// * [@ id = 'ALARMDATA'] // * [sadrži (@id, 'AFC2')] /../../ preceding-sibling :: div [1] / div [1] / span [ 1] / raspon [1] ”
- “// * [@ id = 'ISTRAŽIVANJE / PREGLED'] // dodatak / odjeljak / div [1] / div / div [2] / div [1] / div [3] / div [1] // raspon [ @ class = 'detalji'] '
- “//A[ Sadrži(.,’Ručni unos podataka parametara’)] ”
- '// * [sadrži (@ stil, 'prikaz: blok; vrh:')] // unos [@ ime = 'datumski opseg_end']'
- “// * [@ id =’ dropdown-filter-serviceTools ’] / following-sibling :: ul / descendant :: a [text () = 'Notepad']'
- “// * [@ id =’ dropdown-filter-serviceTools ’] / following-sibling :: ul / descendant :: a [text () = 'Nadzorna ploča okidača']'
- '// h3 [text () = 'Interni opis']'
- '// h3 [sadrži (tekst (), 'Razina helija')] / slijedeći brat / sestra :: div / label / input'
- '// div [div [p [sadrži (tekst (), 'Status')]]]] / prethodni-srodnik :: div / div / span [3] / span'
- “// * [@ id =‘ SPOJNICA ’] // * [sadrži (tekst (),‘ PAR PAD ’)] /../ div / select”
- “// * [@ id =’ ffaHeaderDropdown ’] // a [sadrži (tekst (),‘ Pokreni tijek rada ’)]”
Nadam se da bi vam ovaj informativni članak obogatio znanje o pisanju XPaths-a.
Autor bio: Ovaj članak napisao je Adnan Arif, IT stručnjak s raznolikim iskustvom i vještinama u svojoj karijeri koja traje više od 9 godina.
Preporučena literatura
- Dubinski vodiči za pomračenje za početnike
- Python DateTime Vodič s primjerima
- Sintaksa naredbe Unix Cat, mogućnosti s primjerima
- Unix naredba za sortiranje sa sintaksom, opcijama i primjerima
- Vodič za skripte za Unix Shell sa primjerima
- Selen Pronađi element pomoću udžbenika teksta s primjerima
- Vodič za glavne funkcije Pythona s praktičnim primjerima
- Postprocesor ekstraktora Xpath u JMeteru