WebDriverException: l'elemento non è selezionabile nel punto (x, y)
Questa è una tipica org.openqa.selenium.WebDriverException che estende java.lang.RuntimeException .
I campi di questa eccezione sono:
- 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
Riguardo al tuo caso d'uso individuale, l'errore dice tutto:
WebDriverException: Element is not clickable at point (x, y). Other element would receive the click
È chiaro dal blocco di codice che hai definito wait
as WebDriverWait wait = new WebDriverWait(driver, 10);
ma stai chiamando il click()
metodo sull'elemento prima che ExplicitWait
entri in gioco come in until(ExpectedConditions.elementToBeClickable)
.
Soluzione
L'errore Element is not clickable at point (x, y)
può derivare da diversi fattori. Puoi risolverli con una delle seguenti procedure:
1. L'elemento non viene cliccato a causa della presenza di chiamate JavaScript o AJAX
Prova a usare Actions
Class:
WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
2. L'elemento non viene cliccato perché non è all'interno di Viewport
Prova a utilizzare JavascriptExecutor
per portare l'elemento all'interno del Viewport:
WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement);
3. La pagina viene aggiornata prima che l'elemento sia selezionabile.
In questo caso indurre ExplicitWait ovvero WebDriverWait come indicato al punto 4.
4. L'elemento è presente nel DOM ma non è cliccabile.
In questo caso indurre ExplicitWait con ExpectedConditions
impostato su elementToBeClickable
affinché l'elemento sia cliccabile:
WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));
5. L'elemento è presente ma ha una sovrapposizione temporanea.
In questo caso, indurre ExplicitWait
con ExpectedConditions
impostato su invisibilityOfElementLocated
affinché la sovrapposizione sia invisibile.
WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
6. L'elemento è presente ma ha una sovrapposizione permanente.
Utilizzare JavascriptExecutor
per inviare il clic direttamente sull'elemento.
WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);