在我的Django项目上运行Selenium测试时,我开始收到错误:
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>
奇怪的是有两个原因:第一,先前通过的测试,我没有编辑代码库的那部分。其次,当弹出Selenium驱动的Firefox窗口并且我最大化页面时,测试通过。但是当我让Selenium测试运行时,Firefox浏览器没有最大化,它们会失败。
我没有使用任何花哨的javascript(只是基本的Bootstrap 3模板),只是普通的旧HTML和CSS。我在Python 3.4上使用Django 1.9。我已经运行了pip来检查Selenium的升级,并且我是最新的。
Here is a pastebin link到我的视图和模板输出的html。
其中一项失败的测试是:
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()
最后一行产生错误:
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>
答案 0 :(得分:19)
聚会非常晚,但我有一个非常简单的解决方案,对我有用。而不是做.click(),只需做
.send_keys(selenium.webdriver.common.keys.Keys.SPACE)
选中元素后,空格键可以切换选择。为我工作!
答案 1 :(得分:8)
你的答案在于你的问题。
not clickable at point - (61, 24.300003051757812)
这是另一个元素 - Other element would receive the click: <a class="navbar-brand" href="#"></a>
,其中正在尝试点击。由于您没有最大化浏览器,因此无法正确获得点坐标。答案 2 :(得分:3)
遇到类似的问题(同样的错误),并使用send_keys +发送空白栏来模拟点击而非鼠标点击,尝试使用Major Major的解决方案。
主要专业解决方案:
.send_keys(selenium.webdriver.common.keys.Keys.SPACE)
我尝试运行此操作时遇到了一个新错误,指向了#selenium&#39;。从代码中删除该关键字解决了问题,并允许我单击该元素。
使用的最终成功代码段:
my_variable = driver.find_element_by_xpath('//*[@id="myId"]') #this is the checkbox
my_variable.send_keys(webdriver.common.keys.Keys.SPACE)
答案 3 :(得分:1)
我遇到了同样的问题:由于弹出窗口,我不得不点击的元素会从屏幕上移开并变得无法点击。
将页面滚动到有效的元素。
在Python中:
elem = driver.find_element_by_tag_name("html")
elem.send_keys(Keys.END)
答案 4 :(得分:0)
这更多地与元素&#39;覆盖&#39;彼此。如果它发生在非最大化的窗口上,这是有道理的。如果有一个弹出/浮动div或其他元素覆盖你实际上试图点击的元素,也会发生这种情况。
请记住,selenium正在模仿用户,因此您通常无法执行用户无法执行的操作 - 例如点击其他人所覆盖的元素。
可能的解决方法是使用Javascript查找元素并单击它。 Example here:
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)
答案 5 :(得分:0)
在我目前的Capybara项目中,我经常得到&#34;元素不可点击&#34;错误。造成这种错误的原因是网页的加载不足以定位元素。正如您所提到的那样,之前的测试已经过去了,您还没有编辑代码库的那一部分,所以您可以执行以下操作来完成此操作:
答案 6 :(得分:0)
最近,Firefox驱动程序检查点击位置的元素是否应该被点击的元素。 此错误意味着当驱动程序尝试单击该元素时,另一个元素位于其上。 不幸的是,驱动程序不会自动滚动容器并反而引发此错误。
在处理此问题的方法是滚动屏幕中心的元素并尝试再次单击。 点击方法的猴子补丁:
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