python - Selenio: Elemento no seleccionable... Otro elemento recibiría Click
django selenium (7)
Al ejecutar las pruebas de Selenium en mi proyecto Django, comencé a obtener el error:
selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (61, 24.300003051757812). Other element would receive the click: <a class="navbar-brand" href="#"></a>
Es extraño por dos razones: primero, las pruebas aprobadas previamente y no he editado esa parte de la base de códigos. En segundo lugar, cuando aparece la ventana de Firefox impulsada por Selenium y maximizo la página, las pruebas pasan. Pero cuando dejo que las pruebas de Selenium se ejecuten con el navegador Firefox no maximizado, fallan.
No estoy usando ningún javascript elegante (solo la plantilla básica de Bootstrap 3), simplemente viejo html y css. Estoy usando Django 1.9 en Python 3.4. He corrido pip para buscar actualizaciones de Selenium, y estoy actualizado.
Aquí hay un enlace pastebin al html de la salida de mi vista y plantilla.
Una de las pruebas fallidas es:
def test_create_task_and_check_that_it_shows_up_in_the_task_manager_index_and_filter(self):
# Create user
self.user = User.objects.get(username=test_superuser_username)
# Log the user in
self.log_user_in(user_object=self.user, password=test_superuser_password)
self.browser.implicitly_wait(10)
# Pull up the main task manager page
self.browser.get(str(self.live_server_url) + reverse(''task_manager:index''))
# Make sure we go to the task manager index
task_index_url = str(self.live_server_url) + reverse(''task_manager:index'')
self.browser.get(task_index_url)
self.browser.implicitly_wait(4)
self.assertTrue(str(task_index_url) == self.browser.current_url,
msg=(''Assertion that current_url is %s failed. Current_url is %s'' %
(str(reverse(''task_manager:index'')), self.browser.current_url)))
# Click the ''add task'' button on the sidebar
add_task_taskbar_button = self.browser.find_element_by_name(''add_task_sidebar_link'')
add_task_taskbar_button.click()
La última línea produce el error:
ERROR: test_create_task_and_check_that_it_shows_up_in_the_task_manager_index_and_filter (tasks.tests.test_functional.SeleniumTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/mint/Python_Projects/[project_name]/tasks/tests/test_functional.py", line 94, in test_create_task_and_check_that_it_shows_up_in_the_task_manager_index_and_filter
add_task_taskbar_button.click()
File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/selenium/webdriver/remote/webelement.py", line 75, in click
self._execute(Command.CLICK_ELEMENT)
File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/selenium/webdriver/remote/webelement.py", line 469, in _execute
return self._parent.execute(command, params)
File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/selenium/webdriver/remote/webdriver.py", line 201, in execute
self.error_handler.check_response(response)
File "/home/mint/Python_Projects/venv/lib/python3.4/site-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Element is not clickable at point (61, 24.300003051757812). Other element would receive the click: <a class="navbar-brand" href="#"></a>
Esto tiene más que ver con que los elementos se "cubran" entre sí. Lo cual tiene sentido si ocurre en ventanas no maximizadas. También podría suceder si hubiera un elemento emergente / elemento flotante u otro elemento que cubra el elemento en el que intentas hacer clic.
Recuerde, el selenio imita al usuario, por lo que normalmente no puede realizar una acción que el usuario no podría haber hecho, como hacer clic en un elemento que está cubierto por otro.
Una posible solución para esto sería usar Javascript para encontrar el elemento y hacer clic en él. Ejemplo aquí :
labels = driver.find_elements_by_tag_name("label")
inputs = driver.execute_script(
"var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" +
"inputs.push(document.getElementById(labels[i].getAttribute(''for''))); } return inputs;", labels)
En mi proyecto actual de Capybara, a menudo obtengo errores de "Element no clickable". El motivo de este tipo de error es que la página web no se carga lo suficiente como para ubicar el elemento. Como mencionó que las pruebas pasaron anteriormente y no ha editado esa parte de la base de códigos, puede hacer lo siguiente para pasar por esto:
- Ponga un poco más de tiempo de espera antes de ubicar "add_task_sidebar_link". Para que la página se cargue por completo
- Sin embargo, si la prueba falla incluso después de agregar esperar, agregue algún método para tomar una captura de pantalla antes de hacer clic en el elemento. Esto ayudará a depurar la prueba.
Desde hace poco, el controlador de Firefox comprueba que el elemento en la posición de hacer clic es el elemento al que se supone que debe hacer clic. Este error significa que cuando el controlador intenta hacer clic en el elemento, otro se encuentra encima. Desafortunadamente, el controlador no desplaza automáticamente los contenedores y en su lugar genera este error.
En el camino para manejar este problema es desplazar el elemento en el centro de la pantalla e intentar hacer clic de nuevo. Parche de mono para el método de clic:
JS_SCROLL_ELEMENT_CENTER_WINDOW = """/
var element = arguments[0];
element.scrollIntoView(true);
var y = (window.innerHeight - element.offsetHeight) / 2;
if (y > 0) {
for (var e=element; e; e=e.parentElement) {
if (e.scrollTop) {
var yy = Math.min(e.scrollTop, y);
e.scrollTop -= yy;
if ((y -= yy) < 1)
return;
}
}
window.scrollBy(0, -y);
}
"""
def click(self):
try:
self._execute(Command.CLICK_ELEMENT)
except:
self._parent.execute(Command.EXECUTE_SCRIPT, /
{''script'': JS_SCROLL_ELEMENT_CENTER_WINDOW, ''args'': [self]})
self._execute(Command.CLICK_ELEMENT)
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.remote.command import Command
WebElement.click = click
Su respuesta se encuentra dentro de su pregunta.
- El error dice ''add_task_sidebar_link''
not clickable at point - (61, 24.300003051757812)
Aquí es donde está el otro elemento -Other element would receive the click: <a class="navbar-brand" href="#"></a>
donde el se está haciendo clic. Como no maximizó el navegador, no puede obtener las coordenadas del punto correctamente. - Para que las pruebas futuras no se rompan, los pls se desplazan a ese elemento. Consulte esta publicación ( Python Selenium no puede desplazarse hacia abajo ). Compruebe las cadenas de acción ( http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.common.action_chains )
Muy tarde para la fiesta, pero tengo una solución extremadamente simple que funcionó para mí. En lugar de hacer .click (), simplemente hazlo
.send_keys(selenium.webdriver.common.keys.Keys.SPACE)
Con el elemento seleccionado, la barra espaciadora puede alternar la selección. ¡Trabajó para mi!
Se encontró con un problema similar (el mismo error) y probó la solución de Major Major anterior utilizando send_keys + enviando la barra espaciadora para simular un clic en lugar de un clic del mouse.
La solución de Major Major:
.send_keys(selenium.webdriver.common.keys.Keys.SPACE)
Golpeé un nuevo error al intentar ejecutar esto, apuntando a ''selenio''. Eliminar esa palabra clave del código solucionó el problema y me permitió hacer clic en el elemento.
Fragmento de código final exitoso utilizado:
my_variable = driver.find_element_by_xpath(''//*[@id="myId"]'') #this is the checkbox
my_variable.send_keys(webdriver.common.keys.Keys.SPACE)
Tuve el mismo problema: debido a una ventana emergente, el elemento en el que tuve que hacer clic desapareció de la pantalla y dejó de aparecer.
Desplazando la página al elemento trabajado.
En Python:
elem = driver.find_element_by_tag_name("html")
elem.send_keys(Keys.END)