Controlador web Selenium y Java. No se puede hacer clic en el elemento en el punto (x, y). Otro elemento recibiría el clic

91

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);
}
Maria
fuente
¿Estás usando Chrome versión 61+?
demouser123
@ demouser123 estoy usando Firefox 47.0.1 y seleniumWebDriver 2.51.0
Maria
@Maria ¿En qué línea aparece el error? Gracias
DebanjanB
@DebanjanB En línea: driver.findElement (By.id ("navigationPageButton")). Click ();
Maria
Ese error significa que hay otro elemento que se superpone al elemento de destino (superposición de posición fija / absoluta) o que el índice z es demasiado bajo. Esto puede deberse a efectos de desplazamiento que utilizan transiciones (más lento que el tiempo de espera mínimo, en este caso 393 ms). debe esperar a #navigationPageButtonque se vuelva visible (o que se pueda hacer clic elementToBeClickable()en ese elemento también) o verificar si se cumplen todas las condiciones previas para que se pueda hacer clic en el botón.
intenta atrapar finalmente

Respuestas:

192

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:

  • 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

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 waitcomo, WebDriverWait wait = new WebDriverWait(driver, 10);pero está llamando al click()método en el elemento antes de que ExplicitWaitentre en juego como en until(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 ActionsClass:

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 JavascriptExecutorpara 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 ExpectedConditionsestablecido en elementToBeClickablepara 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 ExplicitWaitcon ExpectedConditionsestablecido 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 JavascriptExecutorpara 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);
DebanjanB
fuente
1
Para # 6 / # 2 arriba: El método .ExecuteScript ahora es accesible desde el propio controlador web en lugar de JavascriptExecutor. ¡Gracias por la respuesta bien escrita!
Tabrock
6
Ha cubierto muchas posibilidades en las que solo 5 y 6 son la forma correcta de manejar el error mencionado. Los primeros cuatro arrojan un error diferente para el que la solución que dio no funcionará. Por ejemplo, el punto número 3 es en realidad un problema de elemento obsoleto que no funcionaría a pesar de cuánto tiempo esperas con el método elementToBeClickble. Eso tiene que manejarse de manera diferente.
Rajagopalan
6 no es realmente correcto; un truco para solucionar el problema, 5 sería correcto si se estuviera utilizando la condición esperada correcta. 4 parece la única respuesta correcta.
Ardesco
1
Una cosa importante a tener en cuenta es que, cuando estamos emulando las acciones del usuario, puede ser muy indeseable usar javascript para hacer clic en un elemento en el que no se puede hacer clic (# 6). El usuario final nunca haría eso, simplemente se desplazaría hasta el elemento para llevarlo a la ventana gráfica o descartaría cualquier superposición (si la página lo permite) para interactuar con él.
p_champ
17

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);
Prueba de Rester
fuente
¡Trabajos! No puedo imaginar cómo funciona, pero de lo contrario, hace clic en la capa de superposición (la espera del cierre de la superposición por 'invisibilityOfElementLocated' demora unos 30 segundos).
Fisk
¿Puede escribir la explicación completa, ya que escribo en Java y no es una guerra familiar, puede proporcionar un flujo completo?
Bastian
4

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 elementFromPointAPI 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
rescdsk
fuente
2

Puedes probar

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();
fg78nc
fuente
No me ayuda.
Maria
Sí: org.openqa.selenium.WebDriverException: No se puede hacer clic en el elemento en el punto (36, 72). Otro elemento recibiría el clic: <div tabindex = "0" class = "waiter-ui-lock"> </div> Duración o tiempo de espera del comando: 70 milisegundos
María
1
intente lo siguienteWebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
fg78nc
Tampoco es de ayuda. Tengo dos Exception y un AssertionError y luego un error "No se puede hacer clic en el elemento en un punto"
Maria
1
Si uso Thread.Sleep, entonces todo funciona. Pero estoy usando Wait all fail.
Maria
2

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

Sudheesh.MS
fuente
0

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;
        }
    }
}
usuario2274204
fuente
0

En C #, tuve problemas con la verificación RadioButton, y esto funcionó para mí:

driver.ExecuteJavaScript("arguments[0].checked=true", radio);
Ayub
fuente
0

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();
    }
Nagarjuna Yalamanchili
fuente