tutorial chrome java selenium selenium-webdriver webdriver

chrome - Selenium Web Driver y Java. No se puede hacer clic en el elemento en el punto(x, y). Otro elemento recibiría el clic



selenium webdriver python (5)

WebDriverException: no se puede hacer clic en el elemento en el punto (x, y)

Esta es una org.openqa.selenium.WebDriverException típica que extiende java.lang.RuntimeException .

Los campos de esta excepción son:

Sobre 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 en su bloque de código que ha definido la wait como WebDriverWait wait = new WebDriverWait(driver, 10); pero está llamando al método click() en el elemento antes de que ExplicitWait entre en juego como until(ExpectedConditions.elementToBeClickable) .

Solución

El Element is not clickable at point (x, y) error Element is not clickable at point (x, y) puede surgir de 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("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 Viewport

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 él.

En este caso, induzca ExplicitWait con ExpectedConditions establecido en elementToBeClickable 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, 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")));

6. 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);

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 del comando o tiempo de espera: 393 milisegundos

Si 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); }


Desplazar la página al punto cercano mencionado en la excepción me sirvió. 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 el controlador web php de Facebook


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


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 API elementFromPoint DOM para encontrar el elemento en el que Selenium quería que elementFromPoint clic:

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 estaba moviendo , por ejemplo, porque un elemento encima de él en la página estaba haciendo una expansión o colapso animado. En ese caso, esta clase de condición esperada ayudó. Le das los elementos que están animados , no los que quieres 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


Puedes probar

WebElement navigationPageButton = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton"))); navigationPageButton.click();