Савладавање КСПатх-а у Селену: Како лоцирати елементе

Inženjeri za testiranje igraju ključnu ulogu u celokupnom procesu razvoja softvera, jer osiguravaju da timovi isporučuju aplikacije koje su bez grešaka i funkcionišu kako treba. Ovi stručnjaci detaljno testiraju aplikacije pre nego što se one mogu pustiti u upotrebu ili proglasiti spremnim za korisnike.

Testeri moraju biti vešti i imati sposobnost da identifikuju i komuniciraju sa web elementima. Selenium je jedan od najpopularnijih alata za automatizaciju testiranja koje koriste moderni razvojni timovi. Ovaj alat se sastoji od četiri glavne komponente: Selenium Grid, Selenium WebDriver, Selenium IDE i Selenium RC.

U ovom članku fokusiraćemo se na Selenium WebDriver, posebno na njegovu mogućnost korišćenja XPath-a. Objasnićemo šta je XPath, analizirati osnovnu sintaksu i prikazati praktičnu primenu XPath-a u Selenium-u.

Šta je XPath?

XPath (XML Path Language) je upitni jezik koji se koristi za odabir i navigaciju kroz atribute i elemente unutar XML dokumenata. XPath definiše putanju izraza, pružajući način za adresiranje specifičnih delova XML dokumenta i preuzimanje informacija iz njega.

Njegova sintaksa podseća na putanju u sistemu datoteka. Takođe uključuje funkcije i simbole koji olakšavaju odabir elemenata na osnovu njihovih atributa i hijerarhije. XPath se može koristiti sa tehnologijama kao što su XML, HTML i XSLT za ekstrakciju i manipulaciju podacima.

Zašto koristiti XPath?

  • Fleksibilnost: Za razliku od CSS selektora koji mogu locirati elemente samo pomoću naziva taga, ID-a ili klase, XPath omogućava lociranje elemenata korišćenjem drugih atributa.
  • Višekratna upotreba: Možete sačuvati svoj XPath u varijable i ponovo ga koristiti u vašem kodu.
  • Precizan odabir čvorova: XPath obezbeđuje standardizovan način ciljanja specifičnih elemenata u web dokumentu.

Osnovna sintaksa XPath-a

XPath omogućava pronalaženje bilo kog elementa na web stranici koristeći DOM (Document Object Model). Pre nego što detaljnije analiziramo sintaksu, potrebno je da razumemo sledeće XPath izraze:

Izraz Opis
nodename/tagname Bira sve čvorove sa imenom ‘nodename’/’tagname’
/ Bira iz osnovnog čvora
// Bira čvorove u trenutnom dokumentu iz trenutnog čvora koji odgovara selekciji, bez obzira na njihovu lokaciju
@ Bira atribute
. Bira trenutni čvor

Standardna sintaksa za XPath je:

XPath=//tagname[@attribute="value"]

Kao što se vidi, sintaksa počinje sa duplom kosom crtom (//), koja označava početak od trenutnog čvora, a zatim sledi tag/ime čvora.

Apsolutni XPath naspram Relativnog XPath-a

Postoje dva načina za definisanje putanje pri radu sa XPath-om: apsolutni i relativni XPath.

Apsolutni XPath

Apsolutni XPath predstavlja direktnu putanju od korenskog elementa do željenog elementa. Počinje se od osnovnog čvora i ide se do ciljnog čvora.

Uzmimo za primer sledeći HTML dokument:

<!DOCTYPE html>
<html>
<head>
    <title>techblog.co.rs</title>
</head>
<body>
    <div>
        <h1>Welcome to techblog.co.rs</h1>
    </div>
</body>
</html>

Ako želimo da lociramo element sa sadržajem „Welcome to techblog.co.rs“, putanja bi bila:

/html/body/div/h1

U gore navedenom dokumentu imamo:

  • html kao osnovni čvor: /html
  • body kao roditeljski čvor: /html/body
  • div kao dete body čvora: /html/body/div
  • h1 kao dete div čvora: /html/body/div/h1

Da biste došli do najdubljeg elementa, morate pratiti ovu tačnu putanju.

Kada koristiti Apsolutni XPath

Apsolutni XPath prati veoma specifičnu putanju. Zbog toga je koristan kada postoji više elemenata sa sličnim atributima na stranici, osiguravajući da ciljate tačno određene elemente u dokumentu.

Međutim, XPath je vrlo osetljiv na promene u strukturi HTML dokumenta. Čak i mala izmena može pokvariti vaš Apsolutni XPath.

Relativni XPath

Relativni XPath počinje od bilo kog čvora i ide do ciljnog čvora. Na ovu putanju ne utiču promene u dokumentu, što ga čini poželjnijim u većini slučajeva. Sa Relativnim XPath-om, možete locirati elemente iz bilo kog dela dokumenta. Relativni XPath izraz počinje sa duplom kosom crtom „//“.

Ako koristimo isti HTML dokument, možemo locirati naš h1 koji kaže „Welcome to techblog.co.rs“:

<!DOCTYPE html>
<html>
<head>
    <title>techblog.co.rs</title>
</head>
<body>
    <div>
        <h1>Welcome to techblog.co.rs</h1>
    </div>
</body>
</html>

Naš relativni XPath za h1 bi bio:

//body/div/h1

Kada koristiti Relativni XPath

Relativni XPath treba koristiti kada se traži ravnoteža između fleksibilnosti i specifičnosti. Ova putanja je otporna na promene u HTML dokumentu, pod uslovom da odnos između elemenata ostane isti.

Lociranje elemenata koristeći XPath u Selenium-u

Selenium je open-source framework koji omogućava korisnicima da automatizuju web pretraživače. Framework sadrži kolekciju biblioteka i alata koji pomažu testerima da automatski i sistematski komuniciraju sa web elementima.

Pretpostavimo da imamo web dokument koji sadrži listu pesama, kao što sledi:

<!DOCTYPE html>
<html>
<head>
    <title>Song Library</title>
</head>
<body>
    <h1>Song Library</h1>
    <ul class="song-list">
        <li class="song" title="Song Title 1">Song 1 - Artist 1</li>
        <li class="song" title="Song Title 2">Song 2 - Artist 2</li>
        <li class="song" title="Song Title 3">Song 3 - Artist 1</li>
        <li class="song" title="Song Title 4">Song 4 - Artist 3</li>
    </ul>
</body>
</html>
  • Naš osnovni čvor je <html>.
  • Imamo <body> kao roditeljski čvor.
  • Imamo <h1> kao dete <body>.
  • Imamo <ul> kao dete <body>.
  • Imamo <li> kao dete <ul>.

Možemo koristiti različite XPath lokatore u ovom HTML dokumentu. Na primer, elemente možemo locirati po ID-u, nazivu, nazivu klase, sadržaju, tekstu, „završava-sa“ i „počinje-sa“, između ostalih lokatora. Selenium se može koristiti sa različitim programskim jezicima. Mi ćemo koristiti Python za demonstraciju.

Pronalaženje po indeksu

Pretpostavimo da želimo da lociramo pesmu broj 3, možemo koristiti ovaj kod:

third_song = driver.find_element_by_xpath("//li[@class='song'][3]")
print("Third Song:", third_song.text)

Koristili smo relativni XPath i počeli sa ‘li’ čvorom. Kada Selenium pronađe treću pesmu na listi, štampaće njen tekst.

Pronalaženje po atributu

Možemo imati XPath koji traži sve pesme od „Artist 1“ i štampa njihove naslove. Naš kod bi mogao biti sledeći:

songs_by_artist1 = driver.find_elements_by_xpath("//li[contains(@class, 'song') and contains(text(), 'Artist 1')]")
print("Songs by Artist 1:")
for song in songs_by_artist1:
    print(song.text)

Pronalaženje po tekstu

Ovaj lokator pomaže da se pronađu elementi sa određenim tekstom. Možemo potražiti pesmu sa tekstom „Song 4“ i štampati njen tekst. Ovaj lokator možemo predstaviti sledećim kodom:

song_with_text = driver.find_element_by_xpath("//li[contains(text(), 'Song 4')]")
print("Song with Text:", song_with_text.text)

XPath Ose

Pristupi o kojima smo do sada govorili savršeno funkcionišu sa jednostavnim web stranicama. Međutim, postoje situacije u kojima metode pretraživanja XPath elemenata kao što su tekst, ID, naziv klase i naziv taga ne funkcionišu.

XPath ose se koriste za dinamički sadržaj gde standardni lokatori nisu efikasni. Ovde lociramo elemente na osnovu njihovog odnosa sa drugim elementima. Ovo su neki od uobičajenih XPath ose lokatora:

Pretak

Metoda Ancestor Axis je idealna za rad sa XML dokumentima sa duboko ugnježdenim elementima. Možete odabrati sve pretke elementa, kao što su bake i deke i roditelj trenutnog čvora, od najbližeg do najudaljenijeg.

Uzmimo za primer sledeći kod:

<bookstore>
  <book>
    <title>The Great Gatsby</title>
    <author>F. Scott Fitzgerald</author>
    <genre>Fiction</genre>
  </book>
  <book>
    <title>The Biggest Dilemma</title>
    <author>George Orwell</author>
    <genre>Dystopian</genre>
  </book>
</bookstore>

Ako želimo da izaberemo sve pretke elementa ‘title’ za knjigu „The Biggest Dilemma“, koristimo sledeći pristup:

//title[text() = 'The Biggest Dilemma']/ancestor::*

Sledeći

Metoda Following Axis locira sve čvorove nakon završne oznake trenutnog čvora. Ova metoda ne uzima u obzir hijerarhiju ili lokaciju ciljnih čvorova. Na primer, ako imate XML dokument ili web stranicu sa više sekcija, možete identifikovati element koji se pojavljuje posle određene sekcije bez navigacije kroz celu strukturu stabla.

Roditelj

Metoda Parent Axis u XPath-u bira roditelja trenutnog čvora. Možete koristiti sledeću putanju za pronalaženje roditeljskog čvora:

//tag[@attribute="value"]/parent::tagName

Ovaj pristup je koristan kada podređeni elementi u trenutnom čvoru imaju jedinstvene atribute koje možete lako locirati i želite da ih proverite kod roditelja.

Dete

Metoda Child Axis u XPath-u bira sve potomke trenutnog čvora. Ovo je jedna od najpopularnijih metoda XPath Axis, jer pomaže pri odabiru podređenih čvorova određenog elementa.

Razmotrite ovaj deo koda:

<section id='text'>
    <p>Paragraph one</p>
    <p>Paragraph two</p>
    <p>Paragraph three</p>
    <p>Paragraph four</p>
</section>

Sve ‘p’ elemente u ovom kodu možemo locirati koristeći ovu osu:

//section[@id='text']/child::p

Česta pitanja

Zašto koristiti XPath umesto CSS selektora?

CSS selektori mogu pronaći elemente samo na osnovu njihovog ID-a, naziva taga i klase. S druge strane, XPath se može koristiti za lociranje elemenata na osnovu njihove lokacije, tekstualnog sadržaja i drugih atributa u HTML strukturi. Takođe, možete sačuvati XPath izraze u varijable i ponovo ih koristiti u aplikaciji.

Koje jezike podržava XPath u Selenium-u?

XPath se može koristiti sa bilo kojim jezikom koji podržava Selenium. Svoje skripte možete pisati u JavaScript-u, Java-i, Python-u, Ruby-u, C# i PHP-u.

Koje su alternative XPath-u?

Alternativno, možete koristiti CSS selektore, prepoznavanje slika ili Selenium-ove ugrađene lokatore. CSS selektori su najčešći; omogućavaju pronalaženje elemenata na osnovu njihovog naziva taga, ID-a ili klase. Prepoznavanje slika omogućava lociranje elemenata na osnovu slika. Ugrađeni lokatori Selenium-a su dizajnirani da budu jednostavni za korišćenje.

Zaključak

Sada ste u mogućnosti da definišete XPath u Selenium-u, razlikujete apsolutni i relativni XPath i locirate elemente koristeći različite XPath lokatore. Izbor lokatora zavisiće od prirode sadržaja i vaših krajnjih ciljeva.

Pogledajte naš članak o pitanjima za intervju sa Selenium-om ako želite da se pripremite za sledeći intervju.