WebDriverException: elementu nie można kliknąć w punkcie (x, y)
Jest to typowy wyjątek org.openqa.selenium.WebDriverException, który rozszerza wyjątek java.lang.RuntimeException .
Pola tego wyjątku to:
- BASE_SUPPORT_URL :
protected static final java.lang.String BASE_SUPPORT_URL
- DRIVER_INFO :
public static final java.lang.String DRIVER_INFO
- SESSION_ID :
public static final java.lang.String SESSION_ID
O Twoim indywidualnym przypadku użytkowania, błąd mówi wszystko:
WebDriverException: Element is not clickable at point (x, y). Other element would receive the click
Z bloku kodu jasno wynika, że zdefiniowałeś wait
as, WebDriverWait wait = new WebDriverWait(driver, 10);
ale wywołujesz click()
metodę na elemencie, zanim ExplicitWait
wejdzie do gry, jak w until(ExpectedConditions.elementToBeClickable)
.
Rozwiązanie
Błąd Element is not clickable at point (x, y)
może wynikać z różnych czynników. Możesz się z nimi skontaktować, korzystając z jednej z następujących procedur:
1. Element nie jest klikany z powodu wywołań JavaScript lub AJAX
Spróbuj użyć Actions
klasy:
WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
2. Element nie jest klikany, ponieważ nie znajduje się w rzutni
Spróbuj użyć, JavascriptExecutor
aby przenieść element do rzutni:
WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement);
3. Strona jest odświeżana, zanim element stanie się klikalny.
W takim przypadku wywołaj ExplicitWait, czyli WebDriverWait, jak wspomniano w punkcie 4.
4. Element jest obecny w DOM, ale nie można go kliknąć.
W tym przypadku indukuj ExplicitWait z ExpectedConditions
ustawioną na, elementToBeClickable
aby element był klikalny:
WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));
5. Element jest obecny, ale ma tymczasową nakładkę.
W takim przypadku indukuj ExplicitWait
z ExpectedConditions
ustawieniem na, invisibilityOfElementLocated
aby nakładka była niewidoczna.
WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
6. Element jest obecny, ale ma trwałą nakładkę.
Służy JavascriptExecutor
do wysyłania kliknięcia bezpośrednio na element.
WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);