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:
-
BASE_SUPPORT_URL
:
protected static final java.lang.String BASE_SUPPORT_URL
-
DRIVER_INFO
:
public static final java.lang.String DRIVER_INFO
-
SESSION_ID
:
public static final java.lang.String SESSION_ID
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();