Lokowanie elementów

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *