Selenium WebDriver udostępnia osiem strategii lokalizowania elementów. Poniżej streszczam, których z nich powinniśmy używać (i kiedy). Zacznijmy od tabeli zalet i wad każdego z nich.
Wady i zalety lokatorów
Lokalizator | Przykład | Zalety | Wady |
---|---|---|---|
id, name, klasa CSS | By.name("sample-name") | Najczęściej stabilny, prosty w użyciu | Przeważnie nie mamy możliwości ich użycia |
tekst odnośnika | dokładna wartość testowa w znaczniku HTML | Prosty w użyciu | Wrażliwy na zmiany w opisach odnośników |
nazwa znacznika | div | Prosty w użyciu | Bezużyteczny, jeśli na stronie jest więcej niż jeden taki element |
selektor CSS | By.cssSelector("input[type=hidden]") | Daje dużą plastyczność i spore możliwości | Należy napisać stabilny selektor, a nie zawsze jest to łatwe |
XPATH | /html/body/a | Daje dużą plastyczność i spore możliwości | Należy napisać stabilny selektor, a nie zawsze jest to łatwe |
Lokalizator złożony | ByIdOrName(String idOrName) | Wygodne, kiedy chcemy połączyć lokatory | Rzadki w użyciu |
Lokalizator względny | below() | Stosunkowo łatwe w użyciu | Zależne od innych elementów |
Których lokatorów powinniśmy używać?
Odpowiedź niestety brzmi – to zależy.
- jeśli to możliwe, staramy się używać ID, name lub klasy CSS – jeśli oczywiście nie są auto-generowane, unikalne i stabilne. Niestety, najczęściej takie atrybuty nie są dostępne
- gdy potrzebujemy selektora „ostatniej szansy”, możemy użyć XPATH lub CSS, ale musimy zadbać o ich stabilność
- w przypadku odnośników, w grę wchodzi korzystanie z ich tekstów
- z nazw znaczników korzystam przeważnie tylko w przypadku budowania list lokatorów (np. kiedy potrzebuję pobrać wszystkie komórki tabeli). Rzadko stosuję je w testach, ponieważ przeważnie na stronach znaczniki pojawiają się więcej niż raz
CSS vs XPATH
Kilka różnić między tymi dwoma selektorami:
- Selektory CSS są szybsze
- XPATH pozwala na wyszukiwanie na podstawie widocznego tekstu (np.
//div[text()='sample-text']
) - XPATH umożliwia lokalizowanie elementów w obu kierunkach (od rodzica do dziecka i odwrotnie), CSS pozwala jedynie na lokalizowanie od rodzica do dziecka