Lokowanie jednego elementu
Jedną z najbardziej podstawowych technik, których należy się nauczyć używając WebDrivera jest znajdowanie elementów na stronie. WebDriver oferuje wiele wbudowanych selektorów, między innymi wyszukiwanie elementów po atrybucie ID:
Jak widać na przykładzie, lokalizowanie elementów w WebDriver odbywa się na obiekcie instancjiWebDriver
. Metoda findElement(By)
zwraca inny podstawowy typ obiektu, WebElement
.
-
WebDriver
reprezentuje przeglądarkę -
WebElement
reprezentuje konkretny węzeł DOM (kontrolkę, np. link lub pole wejściowe, itp.)
Gdy już masz odniesienie do elementu sieciowego, który został „znaleziony”, możesz zawęzić zakres wyszukiwania poprzez użycie tego samego wywołania na instancji obiektu:
Możesz to zrobić, ponieważ zarówno WebDriver jak i WebElement implementują interfejs SearchContext. W WebDriver, jest to znane jako interfejs oparty na rolach. Interfejsy oparte na rolach pozwalają na określenie, czy dana implementacja sterownika obsługuje daną funkcjonalność. Interfejsy te są jasno zdefiniowane i starają się przestrzegać zasady posiadania tylko jednej roli odpowiedzialności. Więcej o konstrukcji WebDrivera i o tym, jakie role są obsługiwane w poszczególnych sterownikach można przeczytać w Some Other Section WhichMust Be Named.
W konsekwencji, interfejs By użyty powyżej obsługuje również szereg dodatkowych strategii lokalizatorów. Zagnieżdżony lookup może nie być najbardziej efektywną strategią lokalizacji sera, ponieważ wymaga wydania przeglądarce dwóch oddzielnych poleceń; najpierw przeszukania DOM w poszukiwaniu elementu o ID „cheese”, a następnie wyszukania „cheddar” w zawężonym kontekście.
Aby nieco poprawić wydajność, powinniśmy spróbować użyć bardziej specyficznego lokalizatora: WebDriver obsługuje wyszukiwanie elementów po lokalizatorach CSS, co pozwala nam połączyć dwa poprzednie lokalizatory w jedno wyszukiwanie:
Lokowanie wielu elementów
Możliwe jest, że dokument, z którym pracujemy, może okazać się mieć uporządkowaną listę serów, które najbardziej lubimy:
<ol id=cheese> <li id=cheddar>… <li id=brie>… <li id=rochefort>… <li id=camembert>…</ol>
Ponieważ więcej sera jest bezdyskusyjnie lepsze, a pobieranie każdego z tych elementów z osobna byłoby uciążliwe, doskonałą techniką pobierania sera jest użycie spolszczonej wersji findElements(By)
. Metoda ta zwraca kolekcję webelementów. Jeśli zostanie znaleziony tylko jeden element, to i tak zwróci acollection (z jednego elementu). Jeśli żaden element nie pasuje do lokalizatora, zwrócona zostanie pusta lista.
Strategie wyboru elementów
W WebDriver istnieje osiem różnych wbudowanych strategii lokalizacji elementów:
Lokalizator | Opis |
---|---|
nazwa klasy | Lokalizuje elementy, których nazwa klasy zawiera szukaną wartość. elementy, których nazwa klasy zawiera szukaną wartość (złożone nazwy klas nie są dozwolone) |
css selector | Lokalizuje elementy pasujące do selektora CSS |
id | Lokalizuje elementy, których atrybut ID pasuje do szukanej wartości |
name | Lokalizuje elementy, których atrybut NAME pasuje do szukanej wartości |
link text | Lokalizuje elementy zakotwiczenia, których widoczny tekst odpowiada wyszukiwanej wartości |
partial link text | Lokalizuje elementy zakotwiczenia, których widoczny tekst zawiera wyszukiwaną wartość. W przypadku dopasowania wielu elementów, zostanie wybrany tylko pierwszy z nich. |
tag name | Lokalizuje elementy, których nazwa tagu odpowiada wartości wyszukiwania |
xpath | Lokalizuje elementy pasujące do wyrażenia XPath |
Wskazówki dotyczące używania selektorów
Ogólnie, jeśli identyfikatory HTML są dostępne, unikalne i konsekwentnie przewidywalne, są one preferowaną metodą lokalizowania elementu na stronie. Działają one bardzo szybko i pozwalają na rezygnację z wielu procesów związanych ze skomplikowanym przemierzaniem DOM.
Jeśli unikalne ID są niedostępne, dobrze napisany selektor CSS jest preferowaną metodą lokalizacji elementu. XPath działa równie dobrze jak selektory CSS, ale jego składnia jest skomplikowana i często trudna do odszyfrowania. Chociaż selektory XPath są bardzo elastyczne, zazwyczaj nie są testowane pod względem wydajności przez producentów przeglądarek i mają tendencję do bycia dość powolnymi.
Strategie selekcji oparte na linkText i partialLinkText mają wady, ponieważ działają tylko na elementach linków. Dodatkowo, wewnętrznie w WebDriverze odwołują się one do selektorów XPath.
Nazwa tagu może być niebezpiecznym sposobem lokalizacji elementów. Często zdarza się, że na stronie znajduje się wiele elementów o tym samym tagu.
Przydaje się to głównie przy wywoływaniu metody findElements(By), która zwraca kolekcję elementów.
Zalecane jest aby lokalizatory były tak zwarte i czytelne jak to tylko możliwe. Wymaganie od WebDrivera, aby przemierzył strukturę DOM jest kosztowną operacją, a im bardziej możesz zawęzić zakres wyszukiwania, tym lepiej.
Lokatory relatywne
Selenium 4 wprowadza lokalizatory relatywne, które wcześniej były nazywane lokalizatorami przyjaznymi. Ta funkcjonalność została dodana, aby pomóc Ci zlokalizować elementy, które znajdują się w pobliżu innych elementów.Dostępne lokalizatory relatywne to:
- above
- below
- toLeftOf
- toRightOf
- near
metodafindElement akceptuje teraz nową metodę withTagName()
która zwraca RelativeLocator.
Jak to działa
Selenium używa funkcji JavaScriptgetBoundingClientRect()do znalezienia względnych elementów. Funkcja ta zwraca właściwości elementu takie jakright, left, bottom, and top.
Rozważmy poniższy przykład, aby zrozumieć względne lokalizatory.
above()
Zwraca WebElement, który pojawia sięabove do określonego elementu
below()
Zwraca WebElement, który pojawia się poniżej podanego elementu
toLeftOf()
Zwraca WebElement, który pojawia się na lewo od podanego elementu
toLeftOf()
Zwraca WebElement, który znajduje się na lewo od podanego elementu
toRightOf()
Zwraca WebElement, który znajduje się na prawo od podanego elementu
near()
Zwraca WebElement, który znajduje się w odległości 50px
od podanego elementu.