webentwicklung-frage-antwort-db.com.de

Selen: Element nicht anklickbar ... Anderes Element würde Klick erhalten

Beim Ausführen von Selenium-Tests für mein Django-Projekt habe ich den Fehler angezeigt: 

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 ist aus zwei Gründen ungerade: Erstens, die Tests bestanden vorher und ich habe diesen Teil der Codebasis nicht bearbeitet. Zweitens: Wenn das mit Selenium betriebene Firefox-Fenster angezeigt wird und ich die Seite maximiere, werden die Tests bestanden. Wenn ich jedoch die Selenium-Tests mit nicht maximiertem Firefox-Browser ausführen lasse, schlagen sie fehl.

Ich verwende kein schickes Javascript (nur die grundlegende Bootstrap 3-Vorlage), sondern nur alte HTML und CSS. Ich verwende Django 1.9 auf Python 3.4. Ich habe Pip getestet, um nach Upgrades für Selenium zu suchen, und ich bin auf dem neuesten Stand.

Hier ist ein Pastebin-Link zum HTML-Code der Ausgabe meiner Ansicht und Vorlage.

Einer der fehlgeschlagenen Tests ist:

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()

Die letzte Zeile erzeugt den Fehler:

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

Ihre Antwort liegt in Ihrer Frage. 

  1. Fehler sagt 'add_task_sidebar_link' not clickable at point - (61, 24.300003051757812) Hier befindet sich ein anderes Element - Other element would receive the click: <a class="navbar-brand" href="#"></a>, wo der Klick versucht wird. Da Sie den Browser nicht maximiert haben, können Sie die Punktkoordinaten nicht korrekt ermitteln.
  2. Damit zukünftige Tests nicht abbrechen, scrollen Sie bitte zu diesem Element. Siehe diesen Beitrag ( Selenium Python kann nicht nach unten scrollen ). Aktionsketten überprüfen ( http://Selenium-python.readthedocs.org/api.html#module-Selenium.webdriver.common.action_chains )
7
Makjb lh

Extrem spät zur Party, aber ich habe eine extrem einfache Lösung, die für mich funktioniert hat. Anstelle von .click () machen Sie einfach 

.send_keys(Selenium.webdriver.common.keys.Keys.SPACE)

Wenn das Element ausgewählt ist, kann die Leertaste die Auswahl umschalten. Arbeitete für mich!

18
Major Major

Trat in ein ähnliches Problem (gleicher Fehler) und versuchte die oben beschriebene Lösung von Major Major mit send_keys + Senden der Leertaste, um einen Klick zu simulieren, statt einen Mausklick.

Major Majors Lösung:

.send_keys(Selenium.webdriver.common.keys.Keys.SPACE)

Ich habe beim Versuch, dies auszuführen, einen neuen Fehler gefunden und auf 'Selenium' hingewiesen. Durch das Entfernen dieses Schlüsselworts aus dem Code wurde das Problem behoben und ich konnte auf das Element klicken.

Letztes erfolgreiches Code-Snippet verwendet:

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

Dies hat mehr mit Elementen zu tun, die sich gegenseitig bedecken. Was sinnvoll ist, wenn es auf nicht maximierten Fenstern geschieht. Kann auch vorkommen, wenn ein Popup/Floating-Div oder ein anderes Element vorhanden ist, das das Element umfasst, auf das Sie klicken möchten.

Denken Sie daran, dass Selen den Benutzer nachahmt, so dass Sie normalerweise keine Aktion ausführen können, die der Benutzer nicht hätte ausführen können - wie das Klicken auf ein Element, das von einem anderen Element verdeckt wird.

Eine mögliche Lösung für dieses Problem wäre die Verwendung von JavaScript, um das Element zu finden und darauf zu klicken. Beispiel hier :

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

Seit vor kurzem überprüft der Firefox-Treiber, dass das Element an der Klickposition das Element ist, das angeklickt werden soll .. Dieser Fehler bedeutet, dass ein anderes Element auf dem Element angezeigt wird, wenn der Treiber versucht, auf das Element zu klicken Der Container rollt die Container nicht automatisch und gibt stattdessen diesen Fehler aus.

Um dieses Problem zu lösen, scrollen Sie einfach das Element in der Mitte des Bildschirms und versuchen Sie erneut zu klicken. Monkey-Patch für die Click-Methode:

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.

In meinem aktuellen Capybara-Projekt bekomme ich häufig "Element nicht anklickbare" Fehler. Der Grund für diese Art von Fehler ist, dass die Webseite nicht gut genug geladen wird, um das Element zu finden. Wie Sie bereits erwähnt haben, haben die Tests zuvor bestanden und Sie haben diesen Teil der Codebasis nicht bearbeitet.

  1. Warten Sie etwas länger, bevor Sie "add_task_sidebar_link" finden. Damit die Seite voll geladen wird.
  2. Wenn der Test auch nach dem Hinzufügen von wait fehlschlägt, fügen Sie eine Methode hinzu, um einen Screenshot zu erstellen, bevor Sie auf das Element klicken. Dies hilft beim Debuggen des Tests.
0
Sarabjit Singh

Ich hatte das gleiche Problem: Durch ein Popup-Fenster würde das Element, auf das ich klicken musste, vom Bildschirm abdriften und nicht mehr anklickbar werden.

Scrollen Sie die Seite zu dem bearbeiteten Element.

In Python:

elem = driver.find_element_by_tag_name("html")
elem.send_keys(Keys.END)
0
rp2017