Indagamos por todo el mundo on line y así darte la solución para tu duda, si continúas con alguna duda deja tu inquietud y contestaremos sin falta.
Solución:
Element ... is not clickable at point (x, y). Other element would receive the click"
puede ser causado por diferentes factores. Puede abordarlos mediante cualquiera de los siguientes procedimientos:
- No se hace clic en el elemento debido a la presencia de llamadas JavaScript o AJAX
Tratar de usar Actions
Clase:
WebElement element = driver.findElement(By.id("id1"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
- No se hace clic en el elemento porque no está dentro de la ventana gráfica
Tratar de usar JavascriptExecutor
para traer el elemento dentro de Viewport:
JavascriptExecutor jse1 = (JavascriptExecutor)driver;
jse1.executeScript("scroll(250, 0)"); // if the element is on top.
jse1.executeScript("scroll(0, 250)"); // if the element is at bottom.
O
WebElement myelement = driver.findElement(By.id("id1"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement);
- La página se actualiza antes de que se pueda hacer clic en el elemento.
En este caso inducir wait
.
- El elemento está presente en el DOM pero no se puede hacer clic.
En este caso agregue algunos ExplicitWait
para que se pueda hacer clic en el elemento.
WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("id1")));
- El elemento está presente pero tiene una superposición temporal.
En este caso inducir ExplicitWait
con ExpectedConditions
ajustado a invisibilityOfElementLocated
para que la superposición sea invisible.
WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
- El elemento está presente pero tiene una superposición permanente.
Usar JavascriptExecutor
para enviar el clic directamente sobre el elemento.
WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
Supongo que ya ha comprobado que no hay ningún otro componente superpuesto aquí (publicidad transparente-iframes o algún otro componente del DOM => visto con bastante frecuencia tales cosas en los elementos de entrada / campo de texto) y, cuando se avanza manualmente (lentamente) su código, está funcionando sin problemas, entonces las llamadas ajax pueden causar este comportamiento.
Para evitar thread.sleep, intente seguir con EventFiringWebDriver y registre un identificador. (Dependiendo de la pila de tecnología de su aplicación, puede trabajar para Angular, JQuery o wicket en el controlador, por lo que requiere diferentes implementaciones) (Por cierto: este enfoque también me libró de las cosas “StaleElementException” muchas veces)
ver:
org.openqa.selenium.support.events.EventFiringWebDriver org.openqa.selenium.support.events.WebDriverEventListener
driveme = new ChromeDriver();
driver = new EventFiringWebDriver(driveme);
ActivityCapture handle=new ActivityCapture();
driver.register(handle);
=> ActivityCapture implementa WebDriverEventListener, por ejemplo, javascriptExecutor para hacer frente a las llamadas Ajax en un wicket / dojo techstack
@Override
public void beforeClickOn(WebElement arg0, WebDriver event1)
try
System.out.println("After click "+arg0.toString());
//System.out.println("Start afterClickOn - timestamp: System.currentTimeMillis(): " + System.currentTimeMillis());
JavascriptExecutor executor = (JavascriptExecutor) event1;
StringBuffer javaScript = new StringBuffer();
javaScript.append("for (var c in Wicket.channelManager.channels) ");
javaScript.append(" if (Wicket.channelManager.channels[c].busy) ");
javaScript.append(" return true;");
javaScript.append(" ");
;
;
;
javaScript.append("");
javaScript.append("return false;");
//Boolean result = (Boolean) executor.executeScript(javaScript.toString());
WebDriverWait wait = new WebDriverWait(event1, 20);
wait.until(new ExpectedCondition()
public Boolean apply(WebDriver driver)
return !(Boolean) executor.executeScript(javaScript.toString());
);
//System.out.println("End afterClickOn - timestamp: System.currentTimeMillis(): " + System.currentTimeMillis());
catch (Exception ex)
//ex.printStackTrace();
Aquí tienes las reseñas y puntuaciones
Al final de todo puedes encontrar las aclaraciones de otros usuarios, tú además eres capaz insertar el tuyo si lo deseas.