java selenium selenium-webdriver webdriver katalon-studio

java - No se puede hacer clic en el elemento MyElement en el punto(x, y)... Otro elemento recibiría el clic



selenium selenium-webdriver (4)

Estoy tratando de hacer algunas pruebas usando Katalon Studio basado en selenio. En una de mis pruebas tengo que escribir dentro de un área de texto. El problema es que me sale el siguiente error:

...Element MyElement is not clickable at point (x, y)... Other element would receive the click...

De hecho, mi elemento está ubicado dentro de otra diva que podría ocultarlo, pero ¿cómo puedo hacer que el evento click llegue a mi área de texto?


Hice una publicación sobre esto en Python y fui marcado como duplicado y me remitió a esta publicación. Intenté todo lo que encontré aquí y algunas otras publicaciones.

El problema era que estaba obteniendo la excepción en un elemento Select y no podía usar un script para hacer clic, aunque lo intenté, no funcionó.

Como quería seleccionar el elemento usando texto visible (no por valor o número de opción), utilicé el siguiente código, que consiste en encontrar el elemento por Xpath [contiene (texto (), ''texto'')] y luego cambiar el html . Tal vez sea útil para otro.

self.driver.execute_script( "arguments[0].selected=true", self.driver.find_element_by_xpath( ''//*[contains(text(), "%s" )]'' % ''your_visible_text'' ), )


Prueba Thread.Sleep ()

Implícito - Thread.Sleep ()

Entonces, esto no es en realidad una característica de Selenium WebDriver, es una característica común en la mayoría de los lenguajes de programación. Pero nada de eso importa.

Thread.Sleep () hace exactamente lo que crees que hace, duerme el hilo. Entonces, cuando su programa se ejecuta, en la mayoría de sus casos, ese programa será algunas verificaciones automáticas, se están ejecutando en un hilo. Entonces, cuando llamamos a Thread.Sleep, le estamos indicando a nuestro programa que no haga absolutamente nada por un período de tiempo, solo dormir. No importa lo que haga nuestra aplicación bajo prueba, no nos importa, ¡nuestros cheques están teniendo una siesta!

Sin embargo, de manera deprimente, es bastante común ver algunas instancias de Thread.Sleep () en los marcos de verificación de Selenium WebDriver GUI. Lo que suele suceder es que un script fallará o fallará esporádicamente, y alguien lo ejecuta localmente y se da cuenta de que hay una carrera, que a veces WedDriver está perdiendo. Podría ser que una aplicación a veces demore más en cargarse, tal vez cuando tenga más datos, por lo que para solucionarlo le dicen a WebDriver que tome una siesta, para asegurarse de que la aplicación se cargue antes de que continúe la verificación.

Thread.sleep (5000);

El valor proporcionado está en milisegundos, por lo que este código suspenderá la verificación durante 5 segundos.


Supongo que ya ha verificado que no hay ningún otro componente que se superponga aquí (iframes de publicidad transparentes o algún otro componente del DOM => visto con bastante frecuencia tales cosas en los elementos de entrada / campo de texto) y, cuando se camina manualmente (lentamente) su código, funciona sin problemas, entonces las llamadas ajax pueden causar este comportamiento.

Para evitar thread.sleep, intente seguir con EventFiringWebDriver y registre un identificador. (Dependiendo del techstack de su aplicación, puede trabajarlo para Angular, JQuery o wicket en el controlador, 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 tratar 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<Boolean>() { 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(); } }


Element ... is not clickable at point (x, y). Other element would receive the click" Element ... is not clickable at point (x, y). Other element would receive the click" puede ser causado por diferentes factores. Puede abordarlos mediante uno de los siguientes procedimientos:

  1. No se hace clic en el elemento debido a las llamadas de JavaScript o AJAX presentes

Intenta usar la clase de Actions :

WebElement element = driver.findElement(By.id("id1")); Actions actions = new Actions(driver); actions.moveToElement(element).click().build().perform();

  1. No se hace clic en el elemento porque no está dentro de la Viewport

Intente 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);

  1. La página se actualiza antes de que se pueda hacer clic en el elemento.

En este caso induce un poco de wait .

  1. El elemento está presente en el DOM pero no se puede hacer clic en él.

En este caso, agregue un poco de ExplicitWait para que se pueda hacer clic en el elemento.

WebDriverWait wait2 = new WebDriverWait(driver, 10); wait2.until(ExpectedConditions.elementToBeClickable(By.id("id1")));

  1. El elemento está presente pero tiene una superposición temporal.

En este caso, induzca ExplicitWait con ExpectedConditions establecido en invisibilityOfElementLocated para que Overlay sea invisible.

WebDriverWait wait3 = new WebDriverWait(driver, 10); wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));

  1. El elemento está presente pero tiene una superposición permanente.

Use JavascriptExecutor para enviar el clic directamente en el elemento.

WebElement ele = driver.findElement(By.xpath("element_xpath")); JavascriptExecutor executor = (JavascriptExecutor)driver; executor.executeScript("arguments[0].click();", ele);