Lors de l'exécution des tests Selenium sur mon projet Django, j'ai commencé à avoir l'erreur suivante:
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>
C'est étrange pour deux raisons: premièrement, les tests précédents ont été réussis et je n'ai pas édité cette partie de la base de code. Deuxièmement, lorsque la fenêtre Firefox pilotée par Selenium apparaît et que la page est agrandie, les tests réussissent. Mais lorsque je laisse les tests Selenium s'exécuter avec le navigateur Firefox non maximisés, ils échouent.
Je n'utilise pas de javascript sophistiqué (uniquement le modèle de base Bootstrap 3), mais simplement du vieux html et css. J'utilise Django 1.9 sur Python 3.4. J'ai lancé pip pour vérifier les mises à jour de Selenium et je suis au courant.
Voici un lien Pastebin vers le code HTML de la sortie de ma vue et de mon modèle.
L'un des tests ayant échoué est:
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 dernière ligne produit l'erreur:
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>
Votre réponse se situe dans votre question.
not clickable at point - (61, 24.300003051757812)
C'est là qu'un autre élément est - Other element would receive the click: <a class="navbar-brand" href="#"></a>
où le clic est tenté. Étant donné que vous n'avez pas optimisé le navigateur, vous ne pouvez pas obtenir les coordonnées du point correctement.Extrêmement tard pour la fête, mais j'ai une solution extrêmement simple qui a fonctionné pour moi. Au lieu de faire .click (), faites simplement
.send_keys(Selenium.webdriver.common.keys.Keys.SPACE)
Lorsque l'élément est sélectionné, la barre d'espacement peut basculer la sélection. Travaillé pour moi!
Couru dans un problème similaire (même erreur) et essayé la solution de Major Major ci-dessus en utilisant send_keys + envoyant la barre d'espace pour simuler un clic plutôt qu'un clic de souris.
La solution du major majeur:
.send_keys(Selenium.webdriver.common.keys.Keys.SPACE)
Je frappe une nouvelle erreur en essayant d'exécuter ceci, en pointant sur 'Selenium'. Supprimer ce mot clé du code a résolu le problème et m'a permis de cliquer sur l'élément.
Le dernier extrait de code réussi a été utilisé:
my_variable = driver.find_element_by_xpath('//*[@id="myId"]') #this is the checkbox
my_variable.send_keys(webdriver.common.keys.Keys.SPACE)
Cela a plus à voir avec les éléments qui se "recouvrent" les uns les autres. Ce qui est logique si cela se produit sur des fenêtres non maximisées. Cela pourrait également arriver s'il y avait un div/popup flottant ou un autre élément qui recouvrait l'élément sur lequel vous essayez de cliquer.
N'oubliez pas que Selenium imite l'utilisateur. Vous ne pouvez donc normalement pas effectuer d'action que l'utilisateur n'aurait pas été capable de faire - comme cliquer sur un élément couvert par un autre.
Une solution de contournement pourrait consister à utiliser le langage Javascript pour trouver l’élément et à cliquer dessus. Exemple ici :
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)
Depuis récemment, le pilote Firefox vérifie que l’élément à la position de clic est l’élément supposé sur lequel il a été cliqué . Cette erreur signifie que lorsque le pilote tente de cliquer sur l’élément, un autre est au-dessus de celui-ci . , le pilote ne fait pas automatiquement défiler les conteneurs et lève cette erreur.
Pour régler ce problème, il suffit de faire défiler l’élément au centre de l’écran et d’essayer de cliquer à nouveau. Le patch Monkey pour la méthode 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
Dans mon projet Capybara actuel, les erreurs "Élément non cliquable" sont fréquentes. La raison de ce type d'erreur est que la page Web ne se charge pas assez bien pour localiser l'élément. Comme vous avez mentionné que les tests précédents avaient réussi et que vous n'aviez pas modifié cette partie de la base de code, vous pouvez donc effectuer les opérations suivantes pour passer à travers ceci:
J'avais le même problème: à cause d'une fenêtre contextuelle, l'élément sur lequel je devais cliquer serait dérouté de l'écran et deviendrait cliquable.
Faire défiler la page jusqu'à l'élément travaillé.
En Python:
elem = driver.find_element_by_tag_name("html")
elem.send_keys(Keys.END)