Inginerii specializați în testarea software joacă un rol crucial în procesul de dezvoltare, asigurându-se că produsele software sunt funcționale și lipsite de erori înainte de a fi lansate. Acești profesioniști supun aplicațiile la diverse teste amănunțite, garantând astfel calitatea și stabilitatea acestora pentru utilizatori.
Un aspect important al muncii testerilor este abilitatea de a identifica și interacționa cu elementele paginilor web. În acest context, Selenium se distinge ca un instrument de automatizare a testelor extrem de popular. Acesta este structurat în patru componente principale: Selenium Grid, Selenium WebDriver, Selenium IDE și Selenium RC.
În acest articol, vom explora în detaliu Selenium WebDriver, cu accent pe utilizarea XPath. Vom defini ce este XPath, vom analiza sintaxa sa de bază și vom oferi exemple practice de utilizare a XPath în Selenium.
Ce este XPath?
XPath (XML Path Language) este un limbaj de interogare conceput pentru selectarea și navigarea prin atributele și elementele documentelor XML. Acesta permite definirea expresiilor de cale care facilitează accesarea anumitor secțiuni ale unui document XML și extragerea informațiilor relevante.
Sintaxa XPath este similară cu structura unui sistem de fișiere. În plus, limbajul oferă diverse funcții și simboluri care permit selectarea elementelor pe baza atributelor și ierarhiei lor. XPath poate fi utilizat în conjuncție cu tehnologii precum XML, HTML și XSLT pentru a extrage și manipula eficient date.
De ce să folosim XPath?
- Flexibilitate: Spre deosebire de selectorii CSS, care se limitează la nume de etichete, ID-uri sau clase, XPath permite localizarea elementelor folosind o gamă mai largă de atribute.
- Reutilizabilitate: Expresiile XPath pot fi stocate în variabile și refolosite în cod, economisind timp și efort.
- Precizie: XPath oferă o metodă standardizată pentru a identifica cu exactitate anumite elemente dintr-un document web.
Sintaxa de bază a XPath
XPath permite localizarea oricărui element dintr-o pagină web, folosind Document Object Model (DOM). Pentru a înțelege sintaxa, este necesar să definim câteva expresii XPath cheie:
| Expresie | Descriere |
| nodename/tagname | Selectează toate nodurile cu numele „nodename”/„tagname” |
| / | Selectează din nodul rădăcină |
| // | Selectează nodurile din documentul curent care se potrivesc cu selecția, indiferent de locul în care se află |
| @ | Selectează atributele |
| .. | Selectează părintele nodului curent |
| . | Selectează nodul curent |
Sintaxa standard pentru XPath este:
XPath=//tagname[@attribute="value"]
Această sintaxă începe cu o bară oblică dublă (//), urmată de numele etichetei sau nodului, definind punctul de pornire pentru selecție.
XPath absolut vs. XPath relativ
În cadrul XPath, avem două abordări principale: XPath absolut și XPath relativ.
XPath absolut
Un XPath absolut reprezintă calea completă de la nodul rădăcină până la elementul vizat. Aceasta începe întotdeauna cu nodul rădăcină și descrie fiecare nivel al structurii documentului până la elementul dorit.
De exemplu, considerăm următorul fragment de cod HTML:
<!DOCTYPE html>
<html>
<head>
<title>tipstrick.ro</title>
</head>
<body>
<div>
<h1>Welcome to tipstrick.ro</h1>
</div>
</body>
</html>
Pentru a localiza elementul h1 cu textul „Welcome to tipstrick.ro”, calea XPath absolută ar fi:
/html/body/div/h1
În acest exemplu:
- html este nodul rădăcină: /html
- body este nodul părinte: /html/body
- div este un copil al nodului body: /html/body/div
- h1 este un copil al nodului div: /html/body/div/h1
Pentru a ajunge la un element specific, trebuie să parcurgem întreaga cale.
Când să folosim XPath absolut?
XPath absolut oferă o cale foarte precisă. Este util în situații unde există multiple elemente cu atribute similare, permițând vizarea cu exactitate a elementelor dorite.
Totuși, trebuie să reținem că XPath absolut este sensibil la modificări ale structurii documentului HTML. Chiar și o mică modificare poate invalida calea XPath.
XPath relativ
XPath relativ începe de la orice nod și se oprește la nodul țintă. Această abordare este mai flexibilă, deoarece nu este afectată de schimbările în structura documentului. Cu XPath relativ, elementele pot fi localizate din orice punct al documentului. Expresiile XPath relative încep cu bare oblice duble „//”.
În același document HTML, putem localiza elementul h1 cu textul „Welcome to tipstrick.ro” folosind următorul XPath relativ:
//body/div/h1
Când să folosim XPath relativ?
XPath relativ este recomandat când se dorește un echilibru între flexibilitate și specificitate. Acesta rezistă mai bine la modificări ale structurii HTML, menținând în același timp relația specifică dintre elemente.
Localizarea elementelor folosind XPath în Selenium
Selenium este un framework open-source care permite automatizarea browserelor web. Acesta oferă o varietate de biblioteci și instrumente ce ajută testerii să interacționeze cu elementele web într-un mod sistematic și automat.
Să presupunem că avem un document web ce conține o listă de melodii:
<!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>
- Nodul rădăcină este <html>.
- <body> este nodul părinte.
- <h1> este un copil al <body>.
- <ul> este un copil al <body>.
- <li> sunt copii ai <ul>.
Putem utiliza diverși localizatori XPath în acest document, inclusiv ID, nume, nume de clasă, conține, texte, se termină cu și începe cu. Selenium poate fi folosit cu diverse limbaje de programare; vom folosi Python în exemplele noastre.
Localizare după index
Pentru a localiza a treia melodie din listă, putem folosi următorul cod:
third_song = driver.find_element_by_xpath("//li[@class="song"][3]")
print("Third Song:", third_song.text)
În acest caz, folosim XPath relativ, începând cu nodul „li”. Selenium va identifica a treia melodie și va afișa textul său.
Localizare după atribut
Pentru a localiza toate melodiile interpretate de „Artist 1”, putem utiliza codul următor:
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)
Localizare după text
Pentru a găsi un element după un text specific, de exemplu, melodia cu textul „Song 4”, putem folosi:
song_with_text = driver.find_element_by_xpath("//li[contains(text(), 'Song 4')]")
print("Song with Text:", song_with_text.text)
Axe XPath
Metodele prezentate până acum sunt eficiente pentru pagini web simple. Totuși, în cazurile în care elementele sunt dinamice sau metodele uzuale de localizare (text, ID, nume de clasă) nu funcționează, axele XPath devin esențiale.
Axele XPath ajută la localizarea elementelor pe baza relațiilor lor cu alte elemente, fiind foarte utile în cazul conținutului dinamic. Câteva exemple comune sunt:
Ancestor
Metoda Ancestor este ideală pentru documente XML cu elemente imbricate. Aceasta permite selectarea tuturor elementelor strămoși, de la părinte la bunic, în ordinea apropierii de nodul curent.
Considerăm următorul exemplu:
<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>
Pentru a selecta toți strămoșii elementului „title” pentru cartea „The Biggest Dilemma”, putem utiliza:
//title[text() = 'The Biggest Dilemma']/ancestor::*
Following
Metoda Following selectează toate nodurile care urmează după eticheta de închidere a nodului curent, ignorând ierarhia sau locația nodurilor țintă. Este utilă pentru a localiza elemente dintr-o secțiune după o alta, fără a naviga prin structura arborescentă.
Parent
Metoda Parent din XPath selectează părintele nodului curent. Putem folosi:
//tag[@attribute="value"]/parent::tagName
Aceasta este utilă când elementele copil au atribute unice, iar dorim să verificăm părintele.
Child
Metoda Child din XPath selectează toți copiii nodului curent. Este printre cele mai utilizate axe XPath pentru a selecta nodurile secundare ale unui element.
De exemplu:
<section id='text'>
<p>Paragraph one</p>
<p>Paragraph two</p>
<p>Paragraph three</p>
<p>Paragraph four</p>
</section>
Pentru a localiza toate elementele „p”, putem folosi:
//section[@id='text']/child::p
Întrebări frecvente
De ce să folosim XPath în loc de selectori CSS?
Selectorii CSS se limitează la localizarea elementelor pe baza ID-ului, a numelui etichetei și a clasei. XPath oferă posibilitatea de a localiza elemente pe baza locației lor, a conținutului textului și a altor atribute. În plus, expresiile XPath pot fi stocate în variabile și reutilizate.
Ce limbaje acceptă XPath în Selenium?
XPath poate fi utilizat cu orice limbaj suportat de Selenium, cum ar fi JavaScript, Java, Python, Ruby, C# și PHP.
Care sunt alternativele la XPath?
Alternativele la XPath includ selectorii CSS, recunoașterea imaginilor și localizatorii încorporați ai Selenium. Selectorii CSS sunt cei mai comuni, permițând localizarea elementelor pe baza numelui, ID-ului sau clasei. Recunoașterea imaginilor folosește imagini pentru localizare, iar localizatorii încorporați ai Selenium sunt concepuți pentru o utilizare simplă.
Concluzie
Acum aveți o înțelegere clară a conceptului XPath în Selenium, a diferenței dintre XPath absolut și relativ și a diverselor metode de localizare a elementelor folosind XPath. Alegerea localizatorului depinde de natura conținutului web și de obiectivele specifice ale testelor.
Vă invităm să consultați articolul nostru despre întrebările interviului Selenium pentru a vă pregăti cu succes pentru următoarele interviuri.