google chrome - googleapis - Error de depuración "Elemento no se puede hacer clic en el punto"
selenium webdriver chrome python (30)
Veo esto solo en Chrome.
El mensaje de error completo dice:
"org.openqa.selenium.WebDriverException: el 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 lado del elemento en cuestión, no encima de él y no se superpone, no se mueve alrededor de la página.
He intentado agregar una compensación, pero eso tampoco funciona. El elemento está en la ventana mostrada sin necesidad de desplazarse.
Al parecer, este es el resultado de un error "No se corrige" en el controlador binario de Chrome.
Una solución que funcionó para mí (nuestro Mileage May Vary) se puede encontrar en esta discusión del Grupo de Google, Comentario # 3:
https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc
La parte relevante está aquí:
Desde entonces he resuelto el problema navegando directamente a la href del ancla 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 usé
driver.get(ViewElm.get_attribute(''href''))
Esperaría que esto solo funcione, sin embargo, si el elemento en el que intenta hacer clic es un enlace ...
Al usar Protractor esto me ayudó:
var elm = element(by.css(''.your-css-class''));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();
Después de probar todas las sugerencias mencionadas, nada funcionó. Hice este código. Funciona, pero no es bello.
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();
}
}
}
}
El motivo de este error es que el elemento que intenta hacer clic no se encuentra en la ventana gráfica (región que ve el usuario) del navegador. Así que la forma de superar esto es desplazarse primero al elemento deseado y luego hacer clic.
Javascript:
async scrollTo (webElement) {
await this.driver.executeScript(''arguments[0].scrollIntoView(true)'', webElement)
await this.driver.executeScript(''window.scrollBy(0,-150)'')
}
Java:
public void scrollTo (WebElement e) {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeAsyncScript(''arguments[0].scrollIntoView(true)'', e)
js.executeAsyncScript(''window.scrollBy(0,-150)'')
}
En Drupal cuando se usa Selenium :
// 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();
Es gracioso, todo el tiempo que pasé mirando las diversas respuestas, nadie había intentado lo obvio, lo cual, por supuesto, yo tampoco. Si su página tiene la misma identificación utilizada varias veces, como la mía ("newButton",) y la que desea no es la primera que se encuentra, es muy probable que reciba este error. Lo más fácil de hacer (C #):
var testIt = driver.FindElements(By.Id("newButton"));
Tenga en cuenta que es FindElements, no FindElement.
Y luego prueba para ver cuántos resultados regresaron de la recuperación. Si es la segunda, puedes usar:
testit[1].Click();
O consigue a quien reutilice las identificaciones para corregirlas.
Estaba teniendo el mismo problema mientras ejecutaba el script de selenio 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()
Esto es causado por los siguientes 3 tipos:
1.El elemento no es visible para hacer clic.
Utilice Acciones 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 haga clic en el elemento.
2. La página se actualiza antes de hacer clic en el elemento.
Para ello, haz que la página espere unos segundos.
3. Se puede hacer clic en el elemento pero hay una ruleta / superposición encima
El siguiente código esperará hasta que desaparezca la superposición
By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));
Luego haga clic en el elemento.
Esto puede suceder si el elemento cambia de posición mientras el controlador intenta hacer clic en él (también lo he visto con IE). El conductor conserva la posición inicial, pero cuando llega a hacer clic en ella, esa posición ya no apunta a ese elemento. Por cierto, el controlador FireFox no tiene este problema, aparentemente "hace clic" en los elementos mediante programación.
De todos modos, esto puede ocurrir cuando usa animaciones o simplemente cambia la altura de los elementos dinámicamente (por ejemplo, $("#foo").height(500)
). Debe asegurarse de que solo haga clic en los elementos después de que su altura se haya "asentado". Terminé con un código que se parece a esto (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 espere a 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;
});
Hago una especie de fuerza bruta de clics y funciona para mí.
try:
elem.click()
except:
print "failed to click"
size = elem.size
mid_of_y = int(size["height"])/2
stepts_to_do_to_left = int(size["width"])
while stepts_to_do_to_left > 0:
try:
print stepts_to_do_to_left, mid_of_y
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(elem, mid_of_y, stepts_to_do_to_left)
action.click()
action.perform()
print "DONE CLICK"
break
except:
pass
He visto esto en la situación cuando la ventana de Chrome impulsada por selenio se abrió demasiado pequeña. El elemento sobre el que se debe hacer clic estaba fuera de la ventana gráfica y, por lo tanto, fallaba.
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 indicarle al controlador de selenio que configurara el tamaño de la ventana de manera adecuada, estos problemas desaparecieron para mí. La API webdriver se describe here .
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
Me encontré con este problema y parece ser causado (en mi caso) al hacer clic en un elemento que abre un div delante del elemento pulsado. Resolví esto envolviendo mi clic en un bloque grande ''catch catch''.
Me encontré con esto porque una cubierta de diálogo de carga en 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!
Me enfrentaba a un problema similar cuando tengo que marcar dos casillas de verificación una después de la otra. Pero estaba recibiendo el mismo error anterior. Por lo tanto, agregué, espere entre mis pasos para verificar las casillas de verificación ... está funcionando 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
Me enfrentaba al mismo problema con clj-webdriver (clojure port of 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))))
Parece que hay un error en Chromedriver para eso (el problema es que está marcado como que no se solucionará) -> GitHub Link
(¿ FreedomSponsors una recompensa por FreedomSponsors ?)
Hay una solución sugerida en el comentario # 27. Tal vez funcione para ti.
Primero, intente obtener el último controlador de Chrome y verifique si soluciona 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: Concéntrese en el elemento utilizando el objeto Acciones de Selenium,
Paso 2: Luego haz click en el elemento.
Paso 3: Si hay una excepción, entonces activamos un evento "Click" de javascript en el elemento ejecutando el script javascript a través del método "ExecuteScript" del controlador del navegador Selenium.
También puede omitir los pasos 1 y 2 e intentar solo el paso 3 también. El paso 3 funcionaría solo, pero noté un comportamiento extraño en un escenario en el que el paso 3, aunque hizo clic en el elemento con éxito, causó 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();");
}
Re la respuesta de Tony Lâmpada, el comentario # 27 resolvió el problema para mí, excepto que proporcionó el 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 en él.
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 solucionó el problema para mí en Chrome 34.0. No causó 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.
Recibí este error porque probé un hover 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
antes de hacer click_link
en el click_link
para obtener la información sobre herramientas fuera del camino.
Recibía este error al ejecutar pruebas sin cabeza con xvfb-run. Estaban trabajando perfectamente a nivel local. Usando Chrome, las versiones de webdriver / chromedriver / chrome / java, etc. son todas idénticas.
El error "no solucionará" en Chromedriver - GitHub Link señalado por Tony Lâmpada sugirió que esto podría estar relacionado con lo que no está 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")
Cambiar la resolución para xvfb hizo que el error desapareciera:
xvfb-run -s "-screen 0 1280x1024x16" ...
Si tiene jQuery
cargado en la página, puede ejecutar el siguiente comando javascript:
"$(''#" + element_id + "'').click()"
Ejemplo usando un ejecutor de python:
driver.execute_script("$(''#%s'').click()" % element_id)
Tal vez no sea una solución realmente 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
También puede utilizar el clic de JavaScript y el desplazamiento no sería necesario entonces.
IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
Tuve el mismo problema y fue causado por un conflicto de identificación entre el div y el enlace dentro del div. Así que el conductor estaba haciendo clic en el div en lugar del enlace que quería. Cambié la identificación del div y funcionó correctamente.
Antes de:
<div id="logout"><a id="logout" href="logoutLink">logout</a></div>
Después:
<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>
Tuve el mismo problema, probé todas las soluciones ofrecidas pero no funcionaron para mí. eventualmente 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
Wow, muchas respuestas aquí, y muchas buenas.
Espero agregar algo a esto de mi experiencia.
Bueno chicos, en mi caso había una superposición de cookies que ocultaba el elemento de vez en cuando. Desplazarse hasta el elemento también funciona; pero en mi humilde opinión (para mi caso, no una panacea para todos), la solución más sencilla es ir a pantalla completa (estaba ejecutando mis scripts en una ventana de 3/4 de la pantalla). Así que, aquí vamos:
driver.manage().window().maximize();
¡Espero que ayude!
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 de verificación: si no estaba a la vista, me desplazaría para ver y luego hacer clic. Incluso el desplazamiento a la vista funciona en Chrome, solo los pocos píxeles inferiores de la casilla de verificación no eran visibles, por lo que el controlador web se negó a hacer clic en él.
Mi solución es la siguiente:
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, a veces es necesario usar Acciones. Obviamente, necesita saber en qué dirección y cuánto debe ir para que su kilometraje pueda variar. Pero prefiero esto al hack de javascript, así que lo estoy publicando aquí en caso de que alguien más lo encuentre útil.
ruby / watir-webdriver / chrome
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")
Explicación del mensaje de error :
El mensaje de error simplemente dice que el elemento que desea hacer clic está presente, pero no es visible. Podría estar cubierto por algo o temporal no visible.
Puede haber muchas razones por las que el elemento no es visible en el momento de la prueba. Vuelva a analizar su página y encuentre la solución adecuada para su caso.
Solución para el caso particular :
En mi caso, este error ocurre cuando una información sobre herramientas del elemento de la pantalla en la que acabo de hacer clic, aparecía sobre el elemento en el que quería hacer clic a continuación. Desenfoque fue una solución que necesitaba.
- La solución rápida de cómo desenfocar sería hacer clic en algún otro elemento en otra parte de la pantalla que haga "nada" resp. no pasa nada después de una acción de clic.
- La solución adecuada sería llamar a
element.blur()
en el elemento que muestra la información sobre herramientas, lo que haría que la información sobre herramientas desaparezca.