web-dev-qa-db-fra.com

Sélénium: Élément non cliquable ... Un autre élément recevrait un clic

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>
13
jejy2343

Votre réponse se situe dans votre question. 

  1. Erreur dit 'add_task_sidebar_link' 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.
  2. Afin que les prochains tests ne se brisent pas, les pls défilent jusqu'à cet élément. Reportez-vous à ce message ( Python sélénium incapable de faire défiler ). Chaînes d'action de contrôle ( http://Selenium-python.readthedocs.org/api.html#module-Selenium.webdriver.common.action_chains )
7
Makjb lh

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!

18
Major Major

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)
3
Will Rus

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)
0
aneroid

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
0
Florent B.

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:

  1. Mettez un peu plus de temps d'attente avant de localiser "add_task_sidebar_link". Alors que la page se charge complètement.
  2. Toujours si le test échoue même après avoir ajouté wait, ajoutez une méthode pour effectuer une capture d'écran avant de cliquer sur l'élément. Cela aidera à déboguer le test.
0
Sarabjit Singh

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)
0
rp2017