2015-04-08 11 views
11

Używam selenu do skryptu testowego. Otrzymuję następujący błąd i ten błąd pojawia się losowo. Kiedy biegnę 10 razy, otrzymuję to około dwa razy. Więc nie jest tak naprawdę odtwarzalny. Czy ktoś wie, dlaczego tak się dzieje? element, który próbuję kliknąć, jest zdecydowanie widoczny w przeglądarce i nie porusza się, więc nie ma potrzeby zmiany rozmiaru ani przeciągania elementu. Używam chrome webdriver i czytam inne sposoby rozwiązywania problemów (Debugging "Element is not clickable at point" error) i nie wydają mi się one odpowiednie dla mojego problemu. Czekałem wystarczająco dużo czasu.Selen - Element nie może być kliknięty w punkcie

UnknownError: unknown error: Element is not clickable at point (167, 403). Other element would receive the click: <div class="leftMasterBackground"></div> 
+0

Czy możesz podać nam informacje na temat elementu, który chcesz kliknąć?Interesujące byłoby również, jakie elementy go otaczają i jakie działania są wykonywane przed kliknięciem. –

+0

Użyj wyraźnego oczekiwania, aż element będzie widoczny do kliknięcia. –

+0

Czy wszystkie skrypty i style na stronie zostały załadowane po wystąpieniu tego błędu? – FDM

Odpowiedz

8

Istnieje szereg kroków, które można zrobić w celu zwiększenia stabilności podczas klikania na różnych elementów interfejsu użytkownika:

  • Jawnie czekać na to obecność w DOM
  • Przewiń do widoku elementu
  • Sprawdź, czy kliknięcie klikalne

Czy to pomaga stabilności?

WebDriverWait wait = new WebDriverWait(driver, 3) 
JavascriptExecutor js = ((JavascriptExecutor) driver) 

//presence in DOM 
wait.until(ExpectedConditions.presenceOfElement(By.id("ID"))); 

//scrolling 
WebElement element = driver.findElement(By.id("ID"))); 
js.executeScript("arguments[0].scrollIntoView(true);", element); 

//clickable 
wait.until(ExpectedConditions.elementToBeClickable(By.id("ID"))); 

Ponadto, jeśli zdecydujesz się zastąpić domyślny interfejs Actions z bardziej dostosowanych jeden, można użyć dwóch rodzajów kliknięć (na przykład): click() która będzie miała wszystkie te kroki ze stabilnością i fastClick() który będzie domyślne kliknięcie bez żadnej zmiany.

+0

Użyłem tylko // bloku przewijania z moim problemem i zadziałało. Dzięki. Prawdopodobnie istnieje więcej rozwiązania DRY, dzięki czemu jest to funkcja wielokrotnego wywoływania wszystkich testów kątomierza. Jestem pewien, że istnieje wiele miejsc, w których trzeba przewinąć do określonego miejsca na stronie, aby kliknąć. – JCC

+0

@JCC w naszym rozwiązaniu, te rodzime biblioteki selenu owinięte dodatkowym poziomem abstrakcji. Mamy więc metody takie jak: element.scrollToElement(). Click(), element.waitUntilPresence(). Click() i itp. – Stas

+1

fantastyczna robota! Kluczową sprawą jest SCROLL! – Seva

2

I zostały rozwiązane przez połowu wyjątek i zarządzania nim tak:

 WebDriver driver = new ChromeDriver(); 
     WebElement element = driver.findElement(By.id("ID")); 
     boolean clicked = false; 
     do{ 
      try { 
       element.click(); 
      } catch (WebDriverException e) { 
       continue; 
      } finally { 
       clicked = true; 
      } 
     } while (!clicked); 
+0

Spójrz na 'ExpectedConditions.isClickable()' – LeeGee

+1

Już widziałem tę funkcjonalność, ale nie działa dobrze z chromedriver. Co się dzieje: warunek zwraca 'true', ale element nie jest efektywnie klikalny. – billi90

+0

Miałem ten błąd, który doprowadził mnie do tej strony. Czy Twój element jest objęty innym (przezroczystym) elementem? Czy to animowane? Czy możliwe jest wstawienie JS z '.executeScript' (lub odpowiednikiem twojego powiązania), aby kliknąć element? – LeeGee

1

kliknięcie elementu nadrzędnego elementu, który chcesz kliknąć. może to być tylko rozwiązanie zastępcze.

2

Miałem też ten sam problem z Chrome. I zostały rozwiązane, że wprowadzenie jednego wiersza kodu przed kliknięciem na elemencie:

scrollToViewElement(driver,xpath); 
0
  • Dzieje się tak tylko na chromie tak to działa na IE i Firefox
  • ChromeDriver zawsze kliknie na środku elementu
  • Powód, dla którego sterownik Chrome nie obliczył prawidłowej lokalizacji łącza.

Rozwiązanie:

// Znajdź element i zdefiniować to

WebElement elementToClick = driver.findElement(By.xpath("some xpath")); // Scroll the browser to the element's Y position ((JavascriptExecutor) driver).executeScript("window.scrollTo(0,"+elementToClick.getLocation().y+")"); // Click the element elementToClick.click();

0

Mam ten sam problem, ze względu na jeden z turbinki ukrywa element.

Dałem xpath i rozwiązało problem. Inni ludzie sugerowali, aby 1. przewinąć 2. sen też pracował dla nich.

+0

można również rozwiązać następujący błąd przy użyciu warunku wait: waitUntilTrueOrTimeout (ExpectedConditions.invisibilityOfElementLocated (elementHidingOtherElement)); chronione V waitUntilTrueOrTimeout (final ExpectedCondition isTrue) { return waitUntilTrueOrTimeout (isTrue, waitTimeOutSeconds); } chroniony V waitUntilTrueOrTimeout (końcowe ExpectedCondition isTrue końcowe Int waitTimeSeconds) { powrotu nowy WebDriverWait (this.driver, waitTimeSeconds) .ignoring (StaleElementReferenceException.class) ważnych elementów.Dopóki (isTrue); – dimyo

Powiązane problemy