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>
Ihre Antwort liegt in Ihrer Frage.
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.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!
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)
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)
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
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.
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)