Inżynierowie zajmujący się testowaniem odgrywają kluczową rolę w procesie tworzenia oprogramowania, ponieważ to oni gwarantują, że zespół programistów dostarcza aplikacje bez defektów i w pełni funkcjonalne. Ci specjaliści przeprowadzają rozmaite testy aplikacji, zanim zostaną one udostępnione użytkownikom lub uznane za gotowe do użytku.
Testerzy muszą posiadać odpowiednie umiejętności, w tym zdolność do identyfikacji elementów na stronach internetowych i interakcji z nimi. Selenium jest jednym z najpopularniejszych narzędzi wykorzystywanych przez nowoczesne zespoły programistyczne do automatyzacji testów. To narzędzie składa się z czterech komponentów: Selenium Grid, Selenium WebDriver, Selenium IDE i Selenium RC.
Dziś skupimy się na Selenium WebDriver, ponieważ obsługuje on język XPath. W tym artykule wyjaśnimy, czym jest XPath, omówimy jego podstawową składnię i przedstawimy, jak używa się XPath w Selenium.
Co to jest XPath?
XPath, czyli XML Path Language, to język zapytań służący do wybierania i nawigowania po atrybutach i elementach w dokumentach XML. XPath pozwala na tworzenie wyrażeń ścieżki, które umożliwiają precyzyjne adresowanie określonych fragmentów dokumentu XML i pobieranie z niego potrzebnych informacji.
Jego składnia przypomina strukturę ścieżek w systemie plików. Używa także funkcji i symboli, które ułatwiają wybieranie elementów na podstawie ich właściwości i hierarchii. XPath można stosować z takimi technologiami jak XML, HTML i XSLT w celu wyodrębniania i modyfikowania danych.
Dlaczego warto stosować XPath?
- Elastyczność: W przeciwieństwie do selektorów CSS, które pozwalają na lokalizowanie elementów jedynie za pomocą nazwy znacznika, identyfikatora lub klasy, XPath umożliwia wybieranie elementów przy użyciu innych atrybutów.
- Wielokrotne użycie: Wyrażenia XPath można zapisać w zmiennych i ponownie wykorzystywać w kodzie.
- Precyzyjne wybieranie węzłów: XPath zapewnia standardowy sposób precyzyjnego wskazywania konkretnych elementów na stronie internetowej.
Podstawowa składnia XPath
XPath umożliwia wyszukiwanie dowolnego elementu na stronie internetowej za pomocą DOM (Document Object Model). Zanim jednak przyjrzymy się składni, warto zrozumieć poniższe wyrażenia XPath:
Wyrażenie | Opis
—|—
nazwa węzła | Wybiera wszystkie węzły o podanej nazwie.
/ | Wybiera z węzła głównego.
// | Wybiera węzły w bieżącym dokumencie, niezależnie od ich lokalizacji.
@ | Wybiera atrybuty.
.. | Wybiera węzeł nadrzędny.
. | Wybiera bieżący węzeł.
Standardowa składnia XPath wygląda następująco:
XPath=//nazwa_znacznika[@atrybut="wartość"]
Jak widać, składnia zaczyna się od podwójnego ukośnika (//), oznaczającego rozpoczęcie wyszukiwania od bieżącego węzła, a następnie podajemy nazwę znacznika.
Bezwzględna XPath a Względna XPath
Podczas pracy z XPath mamy do dyspozycji dwie ścieżki: bezwzględną XPath i względną XPath.
Absolutna XPath
Bezwzględna ścieżka XPath to bezpośrednia ścieżka od korzenia dokumentu do konkretnego elementu. Zaczyna się ona od węzła głównego i prowadzi bezpośrednio do poszukiwanego węzła docelowego.
Rozważmy przykładowy dokument HTML o następującej strukturze:
<!DOCTYPE html> <html> <head> <title>newsblog.pl</title> </head> <body> <div> <h1>Witamy na newsblog.pl</h1> </div> </body> </html>
Jeśli chcemy zlokalizować element zawierający tekst „Witamy na newsblog.pl”, ścieżka bezwzględna będzie wyglądać tak:
/html/body/div/h1
W tym dokumencie mamy:
- HTML jako węzeł główny: /html
- body jako węzeł nadrzędny: /html/body
- div jako dziecko węzła body: /html/body/div
- h1 jako dziecko węzła div: /html/body/div/h1
Aby dotrzeć do najgłębszego elementu, musimy podążać tą całą ścieżką.
Kiedy używać absolutnej XPath?
Absolutna XPath jest bardzo precyzyjna, ponieważ podąża konkretną ścieżką. Jest idealna, gdy na stronie znajduje się wiele elementów o podobnych atrybutach, co pozwala na dokładne wskazanie tych, które nas interesują.
Jednak bezwzględna XPath jest bardzo wrażliwa na zmiany w strukturze dokumentu HTML. Nawet drobna modyfikacja może spowodować, że ścieżka przestanie działać.
Względna ścieżka XPath
Względna ścieżka XPath może zaczynać się od dowolnego węzła i prowadzić do węzła docelowego. Zmiany w dokumencie nie wpływają na jej działanie, dlatego jest preferowana w większości przypadków. Względna XPath umożliwia wyszukiwanie elementów z dowolnego miejsca w dokumencie. Wyrażenie względnej XPath zaczyna się od podwójnego ukośnika „//”.
Jeśli użyjemy tego samego dokumentu HTML, możemy zlokalizować nasz nagłówek h1, który zawiera tekst „Witamy na newsblog.pl” w następujący sposób:
<!DOCTYPE html> <html> <head> <title>newsblog.pl</title> </head> <body> <div> <h1>Witamy na newsblog.pl</h1> </div> </body> </html>
Nasza względna ścieżka XPath do h1 będzie wyglądać tak:
//body/div/h1
Kiedy używać względnej XPath?
Względnej XPath należy używać, gdy potrzebujemy kompromisu między elastycznością a precyzją. Ta ścieżka jest odporna na zmiany w strukturze HTML, pod warunkiem że relacja między elementami pozostaje zachowana.
Lokalizowanie elementów za pomocą XPath w Selenium
Selenium to platforma open-source, która pozwala na automatyzację przeglądarek internetowych. Framework ten zawiera biblioteki i narzędzia, które pomagają testerom w automatycznej interakcji z elementami na stronach internetowych.
Załóżmy, że mamy stronę internetową z listą utworów:
<!DOCTYPE html> <html> <head> <title>Biblioteka utworów</title> </head> <body> <h1>Biblioteka utworów</h1> <ul class="lista-utworów"> <li class="utwór" title="Tytuł utworu 1">Utwór 1 - Wykonawca 1</li> <li class="utwór" title="Tytuł utworu 2">Utwór 2 - Wykonawca 2</li> <li class="utwór" title="Tytuł utworu 3">Utwór 3 - Wykonawca 1</li> <li class="utwór" title="Tytuł utworu 4">Utwór 4 - Wykonawca 3</li> </ul> </body> </html>
- Naszym węzłem głównym jest <html>.
- <body> jest naszym węzłem nadrzędnym.
- <h1> jest dzieckiem <body>.
- <ul> jest dzieckiem <body>.
- <li> jest dzieckiem <ul>.
W tym dokumencie HTML możemy użyć różnych lokalizatorów XPath. Możemy na przykład lokalizować elementy na podstawie ich identyfikatora, nazwy, klasy, zawartości, tekstu, fragmentów tekstu i wielu innych. Selenium może być używane z różnymi językami programowania. W przykładach użyjemy języka Python.
Lokalizowanie według indeksu
Załóżmy, że chcemy zlokalizować utwór numer 3, kod będzie wyglądał następująco:
third_song = driver.find_element_by_xpath("//li[@class='utwór'][3]") print("Trzeci utwór:", third_song.text)
Używamy tutaj względnej ścieżki XPath, zaczynając od węzła „li”. Kiedy Selenium zlokalizuje trzeci utwór na liście, wyświetli jego tekst.
Lokalizowanie według atrybutu
Możemy użyć XPath do znalezienia wszystkich utworów „Wykonawcy 1” i wyświetlić ich tytuły. Kod może wyglądać tak:
songs_by_artist1 = driver.find_elements_by_xpath("//li[contains(@class, 'utwór') and contains(text(), 'Wykonawca 1')]") print("Utwory Wykonawcy 1:") for song in songs_by_artist1: print(song.text)
Lokalizowanie według tekstu
Ten lokalizator pomaga znaleźć elementy o określonym tekście. Możemy na przykład wyszukać utwór o tekście „Utwór 4” i wyświetlić jego tekst. Kod może wyglądać tak:
song_with_text = driver.find_element_by_xpath("//li[contains(text(), 'Utwór 4')]") print("Utwór z tekstem:", song_with_text.text)
Osie XPath
Metody, które omówiliśmy do tej pory, dobrze sprawdzają się na prostych stronach internetowych. Jednak zdarzają się sytuacje, gdy standardowe lokalizatory XPath oparte na tekście, identyfikatorze, klasie czy nazwie, nie działają.
Osie XPath są wykorzystywane w przypadku treści dynamicznych, gdzie zwykłe lokalizatory są nieskuteczne. W takim przypadku elementy są lokalizowane na podstawie ich relacji z innymi elementami. Oto niektóre z popularnych osi XPath:
Przodek
Oś „ancestor” jest idealna do pracy z dokumentami XML o rozbudowanej, zagnieżdżonej strukturze. Pozwala wybrać wszystkie elementy nadrzędne, np. dziadków i rodziców, bieżącego węzła, od najbliższego do najdalszego.
Rozważmy poniższy kod:
<bookstore> <book> <title>Wielki Gatsby</title> <author>F. Scott Fitzgerald</author> <genre>Fikcja</genre> </book> <book> <title>Rok 1984</title> <author>George Orwell</author> <genre>Dystopia</genre> </book> </bookstore>
Jeśli chcemy wybrać wszystkich przodków elementu „title” dla książki „Rok 1984”, możemy użyć osi „ancestor”:
//title[text() = 'Rok 1984']/ancestor::*
Następny
Oś „following” lokalizuje wszystkie węzły znajdujące się za znacznikiem zamykającym bieżącego węzła. Ta metoda nie uwzględnia hierarchii ani lokalizacji węzłów. Na przykład, gdy masz dokument XML lub stronę internetową z wieloma sekcjami, możesz zidentyfikować element, który znajduje się po określonej sekcji, bez konieczności przechodzenia przez całą strukturę drzewa.
Rodzic
Oś „parent” w XPath pozwala wybrać rodzica bieżącego węzła. Możesz użyć poniższej ścieżki, aby zlokalizować węzeł nadrzędny:
//nazwa_znacznika[@atrybut="wartość"]/parent::nazwa_znacznika
To podejście jest skuteczne, gdy elementy potomne w bieżącym węźle mają unikalne atrybuty, które można łatwo zlokalizować i chcesz je sprawdzić u rodzica.
Dziecko
Oś „child” w XPath wybiera wszystkie elementy potomne bieżącego węzła. Jest to jedna z najczęściej używanych osi XPath, ponieważ pomaga w wybieraniu węzłów potomnych konkretnego elementu.
Rozważmy poniższy fragment kodu:
<section id='tekst'> <p>Akapit pierwszy</p> <p>Akapit drugi</p> <p>Akapit trzeci</p> <p>Akapit czwarty</p> </section>
Używając tej osi, możemy zlokalizować wszystkie elementy „p” w kodzie:
//section[@id='tekst']/child::p
Często zadawane pytania
Po co używać XPath zamiast selektorów CSS?
Selektory CSS pozwalają na wyszukiwanie elementów tylko na podstawie identyfikatora, nazwy znacznika i klasy. Natomiast XPath umożliwia lokalizowanie elementów na podstawie ich położenia, tekstu i innych atrybutów w strukturze HTML. Dodatkowo wyrażenia XPath można zapisywać w zmiennych i wielokrotnie wykorzystywać w aplikacji.
Jakie języki obsługuje XPath w Selenium?
XPath można używać w Selenium z każdym językiem, który jest przez nie obsługiwany. Skrypty można tworzyć w językach JavaScript, Java, Python, Ruby, C# i PHP.
Jakie są alternatywy dla XPath?
Jako alternatyw dla XPath można używać selektorów CSS, rozpoznawania obrazu lub wbudowanych lokalizatorów Selenium. Najbardziej popularne są selektory CSS, pozwalające na wyszukiwanie elementów na podstawie nazwy znacznika, identyfikatora lub klasy. Rozpoznawanie obrazu umożliwia lokalizowanie elementów na podstawie ich wyglądu. Wbudowane lokalizatory Selenium są zaprojektowane z myślą o łatwości użycia.
Wnioski
Teraz już wiesz, czym jest XPath w Selenium, umiesz rozróżnić XPath bezwzględny i względny oraz wiesz jak lokalizować elementy za pomocą różnych lokalizatorów XPath. Wybór lokalizatora zależy od rodzaju treści i celów, jakie chcesz osiągnąć.
Zachęcamy również do zapoznania się z naszym artykułem na temat pytań na rozmowę kwalifikacyjną z Selenium, jeśli planujesz kolejną rozmowę o pracę.
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.