Usé esperas explícitas y tengo la advertencia:
org.openqa.selenium.WebDriverException: No se puede hacer clic en el elemento en el punto (36, 72). Otro elemento recibiría el clic: ... Duración o tiempo de espera del comando: 393 milisegundos
Si lo uso Thread.sleep(2000)
, no recibo ninguna advertencia.
@Test(dataProvider = "menuData")
public void Main(String btnMenu, String TitleResultPage, String Text) throws InterruptedException {
WebDriverWait wait = new WebDriverWait(driver, 10);
driver.findElement(By.id("navigationPageButton")).click();
try {
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(btnMenu)));
} catch (Exception e) {
System.out.println("Oh");
}
driver.findElement(By.cssSelector(btnMenu)).click();
Assert.assertEquals(driver.findElement(By.cssSelector(TitleResultPage)).getText(), Text);
}
#navigationPageButton
que se vuelva visible (o que se pueda hacer clicelementToBeClickable()
en ese elemento también) o verificar si se cumplen todas las condiciones previas para que se pueda hacer clic en el botón.Respuestas:
WebDriverException: no se puede hacer clic en el elemento en el punto (x, y)
Esta es una típica excepción org.openqa.selenium.WebDriverException que extiende java.lang.RuntimeException .
Los campos de esta excepción son:
protected static final java.lang.String BASE_SUPPORT_URL
public static final java.lang.String DRIVER_INFO
public static final java.lang.String SESSION_ID
Acerca de su caso de uso individual, el error lo dice todo:
WebDriverException: Element is not clickable at point (x, y). Other element would receive the click
Está claro a partir de su bloque de código que ha definido
wait
como,WebDriverWait wait = new WebDriverWait(driver, 10);
pero está llamando alclick()
método en el elemento antes de queExplicitWait
entre en juego como enuntil(ExpectedConditions.elementToBeClickable)
.Solución
El error
Element is not clickable at point (x, y)
puede deberse a diferentes factores. Puede abordarlos mediante cualquiera de los siguientes procedimientos:1. No se hace clic en el elemento debido a la presencia de llamadas JavaScript o AJAX
Intenta usar
Actions
Class:WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().build().perform();
2. No se hace clic en el elemento porque no está dentro de la ventana gráfica
Intente usar
JavascriptExecutor
para traer el elemento dentro de la ventana gráfica:WebElement myelement = driver.findElement(By.id("navigationPageButton")); JavascriptExecutor jse2 = (JavascriptExecutor)driver; jse2.executeScript("arguments[0].scrollIntoView()", myelement);
3. La página se actualiza antes de que se pueda hacer clic en el elemento.
En este caso, induzca ExplicitWait, es decir, WebDriverWait como se menciona en el punto 4.
4. El elemento está presente en el DOM pero no se puede hacer clic.
En este caso, induzca ExplicitWait con
ExpectedConditions
establecido enelementToBeClickable
para que se pueda hacer clic en el elemento:WebDriverWait wait2 = new WebDriverWait(driver, 10); wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));
5. El elemento está presente pero tiene una superposición temporal.
En este caso, inducir
ExplicitWait
conExpectedConditions
establecido eninvisibilityOfElementLocated
para que la superposición sea invisible.WebDriverWait wait3 = new WebDriverWait(driver, 10); wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
6. El elemento está presente pero tiene una superposición permanente.
Utilice
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);
fuente
En caso de que necesite usarlo con Javascript
Podemos usar argumentos [0] .click () para simular la operación de clic.
var element = element(by.linkText('webdriverjs')); browser.executeScript("arguments[0].click()",element);
fuente
Me encontré con este error al intentar hacer clic en algún elemento (o su superposición, no me importó), y las otras respuestas no funcionaron para mí. Lo arreglé usando la
elementFromPoint
API DOM para encontrar el elemento en el que Selenium quería que hiciera clic en su lugar:element_i_care_about = something() loc = element_i_care_about.location element_to_click = driver.execute_script( "return document.elementFromPoint(arguments[0], arguments[1]);", loc['x'], loc['y']) element_to_click.click()
También he tenido situaciones en las que un elemento se movía , por ejemplo, porque un elemento encima de él en la página estaba haciendo una expansión o contracción animada. En ese caso, esta clase de condición esperada ayudó. Le da los elementos que están animados , no los que desea hacer clic. Esta versión solo funciona para animaciones jQuery.
class elements_not_to_be_animated(object): def __init__(self, locator): self.locator = locator def __call__(self, driver): try: elements = EC._find_elements(driver, self.locator) # :animated is an artificial jQuery selector for things that are # currently animated by jQuery. return driver.execute_script( 'return !jQuery(arguments[0]).filter(":animated").length;', elements) except StaleElementReferenceException: return False
fuente
Puedes probar
WebElement navigationPageButton = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton"))); navigationPageButton.click();
fuente
WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
Desplazar la página hasta el punto cercano mencionado en la excepción funcionó para mí. A continuación se muestra el fragmento de código:
$wd_host = 'http://localhost:4444/wd/hub'; $capabilities = [ \WebDriverCapabilityType::BROWSER_NAME => 'chrome', \WebDriverCapabilityType::PROXY => [ 'proxyType' => 'manual', 'httpProxy' => PROXY_DOMAIN.':'.PROXY_PORT, 'sslProxy' => PROXY_DOMAIN.':'.PROXY_PORT, 'noProxy' => PROXY_EXCEPTION // to run locally ], ]; $webDriver = \RemoteWebDriver::create($wd_host, $capabilities, 250000, 250000); ........... ........... // Wait for 3 seconds $webDriver->wait(3); // Scrolls the page vertically by 70 pixels $webDriver->executeScript("window.scrollTo(0, 70);");
NOTA: uso Facebook php webdriver
fuente
La mejor solución es anular la funcionalidad de clic:
public void _click(WebElement element){ boolean flag = false; while(true) { try{ element.click(); flag=true; } catch (Exception e){ flag = false; } if(flag) { try{ element.click(); } catch (Exception e){ System.out.printf("Element: " +element+ " has beed clicked, Selenium exception triggered: " + e.getMessage()); } break; } } }
fuente
En C #, tuve problemas con la verificación
RadioButton
, y esto funcionó para mí:driver.ExecuteJavaScript("arguments[0].checked=true", radio);
fuente
Puede probar con el siguiente código
WebDriverWait wait = new WebDriverWait(driver, 30);
Pasar otro elemento recibiría el clic :
<a class="navbar-brand" href="#"></a>
boolean invisiable = wait.until(ExpectedConditions .invisibilityOfElementLocated(By.xpath("//div[@class='navbar-brand']")));
Pase la identificación del botón en el que se puede hacer clic como se muestra a continuación
if (invisiable) { WebElement ele = driver.findElement(By.xpath("//div[@id='button']"); ele.click(); }
fuente