Strona główna > Dlaczego lokator nie działa?

Dlaczego lokator nie działa?

Uczysz się budowania lokatorów już od tygodnia. Niezależnie od tego czy to sleektory CSS czy XPath, masz wrażenie, że potrafisz ogarnąć naprawdę świrskie przypadki. Tymczasem piszesz testy Selenium, Twój lokator nie jest nawet bardzo skomplikowany, a wciąż dostajesz ten sam błąd.

NoSuchElementException.

Sprawdzasz go pięć razy, wszystko wygląda ok, lokator działa w narzędziach deweloperskich, więc dlaczego nie działa w testach??!?!!

Dzisiaj Ci pokażę możliwe powody.

Twój lokator nie jest prawidłowy

Może sprawdziłeś lub sprawdziłaś ten lokator pięć razy i działa, ale pytanie jak to sprawdzałeś? Pewnie korzystasz z konsoli deweloperskiej. Żeby ją otworzyć dla otwartej strony wystarczy, że wciśniesz F12 (Chrome). Następnie w zakładce Elements wciśnij CTRL+F. Otworzy się małe pole na dole, do którego możesz wpisać swój lokator i sprawdzić czy działa. Problem jest taki, że to pole bierze pod uwagę nie tylko prawidłowe lokatory ale pełni też rolę zwykłej szukajki. Możesz tam na przykład wpisać nazwę klasy, której szukasz w źródle strony i dostaniesz informację o tym ile takich wystąpień namierzono.

Czy sama nazwa klasy to poprawny selektor CSS albo XPath? Nie. Jest lepsza metoda, żeby sprawdzić czy nasz selektor CSS albo XPath rzeczywiście działa. Wystarczy, że w konsoli deweloperskiej przejdziesz do zakładki “Console”. Tam możesz namierzyć elementy w poniższy sposób:

  • $x(„twój-xpath”)

albo

  • $$(„twój-selektor-css”)

Minusy? Ta metoda, podobnie jak poprzednia, wskaże element nawet jeżeli jest w ramce. Selenium natomiast zachowa się inaczej.

Element jest w ramce

Ramka to element o tagu <iframe>. Takie coś zobaczymy na stronie wtedy, kiedy mamy jakąś osadzoną zawartość z innej aplikacji. Na przykład moje filmy z YouTube’a osadzam w ten sposób w różnych miejscach na testelka.pl. Żeby dostać się do elementu, który jest wewnątrz ramki, najpierw musimy się do tej ramki przełączyć. Nawet jeżeli Twój lokator jest ok, to jak nie przełączysz się do ramki, w której znajduje się element, nie znajdziesz go za pomocą Selenium.

Do przełączenia się do wybranej ramki w Selenium w Javie służy metoda driver.switchTo().frame(iframe). Pamiętaj także, że gdy chcesz wrócić do głównego kontekstu i zacząć wykonywać jakieś operacje poza ramką, musisz z niej “wyjść”: driver.switchTo().defaultContent();

Element jest w shadow root

Jeżeli w źródle strony, nad elementem, który próbujesz namierzyć znajdziesz “#shadow-root”, to czeka Cię trochę zabawy. Sytuacja będzie trochę podobna jak w przypadku ramek: trzeba będzie najpierw “wbić” do tego shadow-roota, żeby móc coś z niego wygrzebać.

Więcej o tym jak sobie poradzić w takim przypadku znajdziesz tutaj: Shadow DOM w Selenium.

Elementu jeszcze nie ma

Selenium działa dużo szybciej niż nasze oczy i ręce, gdy sami wykonujemy te same kroki. Może być tak, że gdy Selenium szuka jakiegoś elementu ten jeszcze nie pojawił się na stronie. W takim wypadku trzeba na niego poczekać. W Selenium mamy dwa mechanizmy, które mogą nam pomóc: implicit wait i explixit wait. Więcej tutaj: Implicit i explicit wait w Selenium.

Zdarzyło Ci się dostać NoSuchElementException i ciężko Ci było dojść o co chodzi? Daj znać co to było 😀