Error de depuración “No se puede hacer clic en el elemento en el punto”

Veo esto solo en Chrome.

El mensaje de error completo dice:

“org.openqa.selenium.WebDriverException: Elemento no se puede hacer clic en el punto (411, 675). Otro elemento recibiría el clic: …”

El elemento que “recibiría el clic” está al costado del elemento en cuestión, no sobre él y no superpuesto, sin moverse por la página.

He intentado agregar un desplazamiento, pero eso tampoco funciona. El artículo está en la ventana que se muestra sin necesidad de desplazarse.

Esto es causado por los siguientes 3 tipos:

1.El elemento no es visible para hacer clic.

Use Actions o JavascriptExecutor para hacer clic.

Por acciones:

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

Por JavascriptExecutor:

 JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript("scroll(250, 0)"); // if the element is on top. jse.executeScript("scroll(0, 250)"); // if the element is on bottom. 

o

 JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript("arguments[0].scrollIntoView()", Webelement); 

Luego haz clic en el elemento.

2. La página se actualiza antes de hacer clic en el elemento.

Para esto, haga que la página espere unos segundos.

3. Se puede hacer clic en el elemento, pero hay un spinner / overlay en la parte superior

El siguiente código esperará hasta que la superposición desaparezca

 By loadingImage = By.id("loading image ID"); WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage)); 

Luego haz clic en el elemento.

También puede usar el clic de JavaScript y no sería necesario desplazarse.

 IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver; ex.ExecuteScript("arguments[0].click();", elementToClick); 

Parece que hay un error en chromedriver para eso (el problema es que está marcado como no se corregirá) -> http://code.google.com/p/selenium/issues/detail?id=2766

(¿ Poner una recompensa en FreedomSponsors quizás?)

Hay una solución sugerida en el comentario # 27. Tal vez te funcione.

Tuve el mismo problema, intenté todas las soluciones ofrecidas, pero no funcionaron para mí. finalmente usé esto:

 JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element)); 

Espero que esto ayude

He visto esto en la situación cuando la ventana de Chrome impulsada por selenium se abrió demasiado pequeña. El elemento al que se hizo clic estaba fuera de la ventana gráfica y, por lo tanto, estaba fallando.

Eso suena lógico … el usuario real tendría que cambiar el tamaño de la ventana o desplazarse para que sea posible ver el elemento y, de hecho, hacer clic en él.

Después de instruir al controlador de selenium para establecer el tamaño de la ventana de forma adecuada, estos problemas se fueron para mí. La API de webdriver está descrita aquí .

Guau, muchas respuestas aquí, y muchas buenas.

Espero que agregue algo a esto desde mi experiencia.

Bueno chicos, en mi caso había una superposición de cookies que ocultaba el elemento de vez en cuando. Desplazarse al elemento también funciona; pero en mi humilde opinión (en mi caso, no es una panacea para todos), la solución más simple es simplemente ir a pantalla completa (¡estaba ejecutando mis guiones en un 3/4 de la ventana de la pantalla)! Así que, aquí vamos:

 driver.manage().window().maximize(); 

¡Espero que ayude!

Estaba recibiendo este error al ejecutar pruebas sin cabeza con xvfb-run. Ellos estaban trabajando impecablemente a nivel local. Usando Chrome, las versiones de webdriver / chromedriver / chrome / java etc. son idénticas.

El error “no se solucionará” en chromedriver – http://code.google.com/p/selenium/issues/detail?id=2766 señalado por Tony Lâmpada sugiere que esto puede estar relacionado con lo que es / no es visible en la pantalla.

El mensaje de ayuda para xvfb-run muestra lo siguiente:

 -s ARGS --server-args=ARGS arguments (other than server number and "-nolisten tcp") to pass to the Xvfb server (default: "-screen 0 640x480x8") 

Al cambiar la resolución de xvfb, el error desapareció:

 xvfb-run -s "-screen 0 1280x1024x16" ... 

ruby / watir-webdriver / cromo

Uso el siguiente truco y parece que funciona:

 #scroll to myelement @browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})" # click myelement myelement.when_present.fire_event("click") 

Yo también luché con este problema. El código funciona bien en FF, falla en Chrome. Lo que intentaba hacer era hacer clic en una casilla: si no estaba a la vista, me desplazaría para ver y luego haré clic. Incluso el desplazamiento hacia la vista funciona en Chrome, solo los píxeles inferiores de la checkbox no estaban visibles, por lo que webdriver se negó a hacer clic en él.

Mi solución es esta:

 WebElement element = _sectorPopup.findElement(...); ((Locatable) element).getCoordinates().inViewPort(); try { element.click(); } catch (Exception e) { new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform(); element.click(); } 

Chrome también tiene problemas con sendKeys, el uso de Acciones a veces es necesario. Obviamente, necesita saber en qué dirección y cuánto debe ir para que su millaje pueda variar. Pero prefiero esto al javascript, así que lo publico aquí en caso de que alguien más lo encuentre útil.

Primero, intente obtener el último controlador de Chrome y verifique si resuelve el problema.

En mi caso, no solucionó el problema. Pero la siguiente solución funcionó para mí hasta ahora. El siguiente es el código C # pero puede seguir la misma lógica en su idioma específico. Lo que hacemos aquí es

Paso 1: Enfócate en el elemento usando el objeto Selenium Actions,

Paso 2: luego haga un clic en el elemento

Paso 3: Si hay una excepción, activamos un evento javascript “Click” en el elemento ejecutando el script javascript a través del método “ExecuteScript” del controlador de navegador Selenium.

También puede saltear los pasos 1 y 2 e intentar solo el paso 3 también. El paso 3 funcionaría por sí mismo, pero noté un comportamiento extraño en un escenario en el que el paso 3, aunque hizo clic con éxito en el elemento, provocó un comportamiento inesperado en otras partes de mi código después de hacer clic en el elemento.

  try { //Setup the driver and navigate to the web page... var driver = new ChromeDriver("folder path to the Chrome driver"); driver.Navigate().GoToUrl("UrlToThePage"); //Find the element... var element = driver.FindElement(By.Id("elementHtmlId")); //Step 1 new Actions(driver).MoveToElement(element).Perform(); //Step 2 element.Click(); } catch (Exception) { //Step 3 driver.ExecuteScript("document.getElementById('elementHtmlId').click();"); } 

Cuando uso Transportador esto me ayudó:

 var elm = element(by.css('.your-css-class')); browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement()); elm.click(); 

Me enfrentaba a un problema similar cuando tengo que marcar dos casillas de verificación una detrás de la otra. Pero estaba obteniendo el mismo error anterior. Por lo tanto, agregué esperar entre mis pasos para comprobar las casillas de verificación … está funcionando bien y muy bien. aquí están los pasos:

  When I visit /administrator/user_profiles And I press xpath link "//*[@id='1']" Then I should see "Please wait for a moment..." When I wait for 5 seconds And I press xpath link "//*[@id='2']" Then I should see "Please wait for a moment..." When I visit /administrator/user_profiles_updates 

Hice este método basado en un comentario de la respuesta de Tony Lâmpada. Funciona muy bien.

 def scroll_to(element) page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})") end 

Aparentemente, este es el resultado de un error de “No reparar” en el controlador binario de Chrome.

Una solución que funcionó para mí (Our Mileage May Vary) se puede encontrar en esta discusión de Grupo de Google, Comentario # 3:

https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc

La parte relevante está aquí:

Desde entonces, he solucionado el problema navegando directamente al href del anclaje principal del tramo.

driver.Navigate (). GoToUrl (driver.FindElement (By.Id (embeddedSpanIdToClick)). FindElement (By.XPath (“..”)). GetAttribute (“href”));

En mi caso, estoy usando Python, así que una vez que obtuve el elemento deseado, simplemente utilicé

 driver.get(ViewElm.get_attribute('href')) 

Sin embargo, espero que esto solo funcione si el elemento en el que intentas hacer clic es un enlace …

Estaba enfrentando el mismo problema con clj-webdriver (puerto clojure de Selenium). Acabo de traducir la solución anterior a clojure para mayor comodidad. Puede llamar a esta función antes de hacer clic o lo que sea para evitar ese problema.

 (defn scrollTo "Scrolls to the position of the given css selector if found" [q] (if (exists? q) (let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ] (execute-script jscript)))) 

Esto podría suceder si el elemento cambia de posición mientras el controlador intenta hacer clic en él (esto también lo he visto con IE). El controlador retiene la posición inicial, pero cuando llega a hacer clic en ella, esa posición ya no apunta a ese elemento. El controlador FireFox no tiene este problema por cierto, aparentemente “hace clic” en los elementos mediante progtwigción.

De todos modos, esto puede suceder cuando usa animaciones o simplemente cambia dinámicamente la altura de los elementos (por ejemplo, $("#foo").height(500) ). Debe asegurarse de que solo haga clic en los elementos después de que su altura se haya “resuelto”. Terminé con un código que se ve así (enlaces C #):

 if (!(driver is FirefoxDriver)) { new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until( d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize); } 

En el caso de una animación o cualquier otro factor que no pueda consultar fácilmente, puede utilizar un método “genérico” que espera que el elemento esté estacionario:

 var prevLocation = new Point(Int32.MinValue, Int32.MinValue); int stationaryCount = 0; int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms return new WebDriverWait(driver, timeout).Until(d => { var e = driver.FindElement(By.Id(someId)); if (e.Location == prevLocation) { stationaryCount++; return stationaryCount == desiredStationarySamples; } prevLocation = e.Location; stationaryCount = 0; return false; }); 

Me encontré con esto porque un diálogo de carga cubre este elemento. Simplemente lo resuelvo agregando una espera antes de trabajar con este elemento.

 try { Thread.sleep((int) (3000)); } catch (InterruptedException e) { // e.printStackTrace(); } 

¡Espero que esto ayude!

Estaba teniendo el mismo problema al ejecutar el script de selenium en Python. Aquí es lo que solía hacer clic en el elemento:

 from selenium.webdriver.common.action_chains import ActionChains ActionChains(driver).click(element).perform() 

La respuesta de Re Tony Lâmpada, el comentario # 27 en verdad resolvió el problema para mí, excepto que proporcionaba código Java y necesitaba Python. Aquí hay una función de Python que se desplaza a la posición del elemento y luego hace clic.

 def scroll_to_and_click(xpath): element = TestUtil.driver.find_element_by_xpath(xpath) TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');') element.click() 

Esto me solucionó el problema en Chrome 34.0. No causó ningún daño en Firefox 28.0 e IE 11; esos navegadores no están sujetos al problema, pero desplazarse a la posición del elemento antes de hacer clic en él todavía no es algo malo.

Tal vez no es realmente una solución limpia, pero funciona:

 try: el.click() except WebDriverException as e: if 'Element is not clickable at point' in e.msg: self.browser.execute_script( '$("{sel}").click()'.format(sel=el_selector) ) else: raise 

Estaba obteniendo este error porque probé un elemento emergente y luego tuve que hacer clic en el enlace debajo de la información sobre herramientas. La solución fue agregar page.find('.sp-logo').hover click_link hacia click_link antes de click_link para click_link la información sobre herramientas.

Después de probar todas las sugerencias mencionadas, nada funcionó. Hice este código. Funciona, pero no es hermoso

 public void click(WebElement element) { //https://code.google.com/p/selenium/issues/detail?id=2766 (fix) while(true){ try{ element.click(); break; }catch (Throwable e){ try { Thread.sleep(200); } catch (InterruptedException e1) { e1.printStackTrace(); } } } } public void click(String css) { //https://code.google.com/p/selenium/issues/detail?id=2766 (fix) while(true){ try{ driver.findElement(By.cssSelector(css)).click(); break; }catch (Throwable e){ try { Thread.sleep(200); } catch (InterruptedException e1) { e1.printStackTrace(); } } } } 

Explicación del mensaje de error :

El mensaje de error simplemente dice que el elemento en el que desea hacer clic está presente, pero no está visible. Podría estar cubierto por algo o temporalmente no visible.

Puede haber muchas razones por las cuales el elemento no es visible en el momento de la prueba. Por favor, vuelva a analizar su página y encuentre la solución adecuada para su caso.

Solución para un caso particular :

En mi caso, este error se produce cuando una información sobre herramientas del elemento de pantalla en el que acabo de hacer clic apareció sobre el elemento que deseaba hacer clic a continuación. Defocus era una solución que necesitaba.

  • Solución rápida de cómo desenfocar sería hacer clic en algún otro elemento en otra parte de la pantalla que no responda “nada”. no sucede nada después de una acción de clic.
  • La solución adecuada sería llamar a element.blur() en el elemento que abre la información sobre herramientas, lo que haría que la información sobre herramientas desaparezca.

Tuve el mismo problema y fue causado por un conflicto de id entre el div y el enlace dentro del div. Entonces, el controlador estaba haciendo clic en el div en lugar del enlace que yo quería. Cambié la identificación del div y funcionó correctamente.

Antes de:

  

Después:

  

Me encontré con este problema y parece ser causado (en mi caso) haciendo clic en un elemento que aparece un div delante del elemento en el que se hace clic. Lo solucioné al envolver mi clic en un gran bloque de captura de prueba.

En Drupal cuando usas Selenio :

  // Get element. $element = $this->driver->getElement('xpath=//input'); // Get screen location. $location = $element->getLocation(); // To make sure that Chrome correctly handles clicking on the elements // outside of the screen, we must move the cursor to the element's location. $this->driver->moveCursor($location['x'], $location['y']); // Optionally, set some sleep time (0.5 sec in the example below) if your // elements are visible after some animation. time_nanosleep(0, 500000000); // Click on the element. $element->click(); 

Tuve el mismo problema y obtuve el error “el otro elemento recibiría el clic” para un elemento visualizado y visible. No encontré ninguna otra solución para activar el clic con un javascript.

He reemplazado:

 WebElement el = webDriver.findElement(By.id("undo-alert")); WebElement closeButton = el.findElement(By.className("close")); // The following throws 'Element is not clickable at point ... Other element // would receive the click' closeButton.click(); 

con:

 ((JavascriptExecutor) webDriver).executeScript( "$('#undo-alert').find('.close').click();" ); 

y todo funcionó bien

Tuve el mismo problema y pasé horas buscando la solución. Traté de hacer clic en una celda en la parte inferior de un ngGrid largo usando un transportador. Aquí hay una instantánea de mi ngGrid html:

 ....many rows here.. < !- row in renderedRows -> < !- column in renderedColumns ->  

toda la función de hacer clic no funcionó. La solución es usar evaluar en el scope actual del elemento:

 element(by.cssContainingText("a", "the test link 100000")) .evaluate("selectRow(row)") 

Tenía otro error donde find_link en Chrome y Poltergeist no podían hacer clic en una etiqueta A con una etiqueta EM y algún texto dentro de ella, aunque funcionaba bien en Firefox y en rack_test. La solución fue reemplazar click_link(link) con:

 find('a em', text: link).click 

En Visual Studio 2013, si habilita BrowserLink, muestra una barra de navegación BrowserLink en la parte inferior de la pantalla. Si el artículo que desea hacer clic está detrás de esa barra de navegación, se muestra el error. Deshabilitar BrowserLink me solucionó el problema.