Selenium element jest nieklikalny

0

Witam.

Mam taki problem. Wchodzę w jakaś zakładkę na stronie, po wejściu dostaję pop-up, w którym wybieram element i go klikam, po tym pop-up się zamyka i chcę kliknąć następny element. Problem polega na tym, że przez ten pop-up element następny element jest "niewidoczny". Gdy zastosuję Thread.sleep wszystko działa elegancko, ale wiem, że takie podejście jest złe. Poczytałem trochę w necie i znalazłem WebDriverWait, więc robię coś takiego:

WebElement selectDbProducts = driver.findElement(By.id("selectDbProducts"));
WebDriverWait driverWait = new WebDriverWait(driver, 5);
driverWait.until(ExpectedConditions.visibilityOf(selectDbProducts));
selectDbProducts.click();

Dodam jeszcze, że nie muszę czekać na ten element, aż się załaduje bo on już jest pod tym pop-upem, ale kiedy będzie widoczny. Czyli jak ten pop-up zniknie. Do tego zależy mi na tam, żeby nie używać JS.

1

Nie do końca rozumiem jaki masz problem, rozwiązanie z WebDriverWait nie działa, czy zastanawiasz się czy takie podejście jest poprawne?

0

No wydaje mi się, że jest bo jeśli uśpię wątek na 5 sekund to wtedy ten popup po kliknięciu zdąży zniknąć i następny element można kliknąć bez problemu.

0

Tak, zdecydowanie rozwiązanie z wykorzystaniem WebDriverWait jest preferowane. Jest to tzw. explicit wait, polegający na tym, że WebDriver sprawdza podany warunek przez określany czas (timeout) z pewnym małym interwałem. To rozwiązanie ma dwie główne zalety w porównaniu do time.sleep(). Po pierwsze, nie czeka przez 5s na sprawdzenie warunku, tylko wykonuje sprawdzenie co pewien krótki czas. Więc jeśli pop-up zniknie po 1s, to WebDriver wait zakończy się po 1s. Oszczędzamy 4s, co w perspektywie dłuższego testu daje nam spory zysk. Drugą zaletą jest fakt, że w przypadku nie pojawienia się tego elemetu otrzymujemy TimeoutException, który dość dokładnie pomaga nam zlokalizować źródło problemu. Gdy korzystasz z time.sleep(), a potem próbujesz kliknąć na element, możesz dostać wyjątek "Element is not clickable ..." który niekoniecznie możę być spowodowany niewidocznością elementu.

0

Nie zrozumiałeś mnie. Wiem jak działa WebDriverWait umiem czytać. W przypadku gdy korzystam z Thread.sleep() test jest pozytywny, a w przypadku gdy korzystam z WebDriverWait test jest negatywny i tu tkwi problem. Tzn. problemu jako takiego nie ma, ale tak jak napisałeś z tym czasem. Czekam 1s a nie 5s...

0
barslo napisał(a):

Tzn. problemu jako takiego nie ma, ale tak jak napisałeś z tym czasem. Czekam 1s a nie 5s...

Ok, nie rozumiemy się nawzajem.

  1. Jaki jest Twój problem? Rozwiązanie z thread.sleep() działa, a z WebDriverWait już nie?
  2. Jaki błąd otrzymujesz? WebDriverWait czeka w nieskończoność, selectDbProducts.click() rzuca wyjątkiem, ... ?
  3. Ewentualnie, czy możesz załączyć jakiegoś screena?

Może lepszym rozwiązaniem będzie zaczekanie, aż pop-up się schowa, ale bez zrozumienia problemu nie jestem w stanie Ci pomóc.

0
  1. Tak
  2. selectDbProducts.click() rzuca wyjątkiem.
org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (332, 562). Other element would receive the click: <div class="ui-widget-overlay ui-front" style="display: block; opacity: 0.279111;"></div>
0

Ten błąd może być spowodowany tym, że okno przeglądarki sterowanej webdriverem nie jest zmaksymalizowane. Ustaw proszę komendę na początku testu na maksymalizację okna, jeżeli tego wcześniej nie zrobiłeś.

0

Niestety i to nie pomaga.

0

Dobra udało się. Wymyśliłem inny sposób. Pobrałem sobie id tego popupa i ustawiłem driverWait żeby czekał, aż element zlokalizowany po tym pobranym id będzie niewidoczny. Btw. dzięki za pomoc :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.