java - ¿Cómo resolver ElementNotInteractableException: Element no es visible en Selenium webdriver?
selenium-webdriver webdriverwait (4)
ElementNotInteractableException
ElementNotInteractableException es la excepción W3C que se genera para indicar que aunque un elemento está presente en el DOM HTML , no está en un estado con el que se pueda interactuar.
Razones y soluciones:
La razón para que ElementNotInteractableException ocurra puede ser numerosa.
-
Superposición temporal de otro elemento
WebElement
sobre el elementoWebElement
de nuestro interés :En este caso, la solución directa habría sido inducir
ExplicitWait
es decir,WebDriverWait
en combinación conExpectedCondition
comoinvisibilityOfElementLocated
como sigue:WebDriverWait wait2 = new WebDriverWait(driver, 10); wait2.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("xpath_of_element_to_be_invisible"))); driver.findElement(By.xpath("xpath_element_to_be_clicked")).click();
Una mejor solución será obtener un poco más granular y, en lugar de usar
ExpectedCondition
comoinvisibilityOfElementLocated
, podemos usarExpectedCondition
comoelementToBeClickable
siguiente manera:WebDriverWait wait1 = new WebDriverWait(driver, 10); WebElement element1 = wait1.until(ExpectedConditions.elementToBeClickable(By.xpath("xpath_of_element_to_be_clicked"))); element1.click();
-
Superposición permanente de otro elemento
WebElement
sobre el elementoWebElement
de nuestro interés :Si la superposición es permanente en este caso, tenemos que convertir la instancia de
WebDriver
comoJavascriptExecutor
y realizar la operación de clic de la siguiente manera:WebElement ele = driver.findElement(By.xpath("element_xpath")); JavascriptExecutor executor = (JavascriptExecutor)driver; executor.executeScript("arguments[0].click();", ele);
En realidad, la excepción es
Element Not Visible
La mejor práctica es
Implicit wait
al usuario por debajo de la instanciación del controlador para que tenga suficiente tiempo como elemento antes de la excepción
driver.get("http://www.testsite.com");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Aún enfrenta problemas ya que algunos elementos requieren más tiempo para usar
ExplicitWait
para que cada elemento satisfaga cierta condición
En su caso, se enfrenta a
not visible exception
elemento
not visible exception
luego use la condición de espera de la siguiente manera
WebDriverWait wait = new WebDriverWait(driver, 120);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.your_Elemetnt));
Obtuve esto porque el elemento con el que quería interactuar estaba cubierto por otro elemento. En mi caso, era una superposición opaca para hacer que todo funcionara bien.
Cuando intentamos hacer clic en un elemento BAJO otro elemento, normalmente obtenemos "... otro Elemento recibiría el clic" pero no siempre:. (
Una solución a esto para Javascript se ve así. Deberá modificar el tiempo para adaptarlo a sus necesidades.
driver.manage().setTimeouts({ implicit: 30000 });
Espero que esto sea útil para alguien. ver los docs para referencia