2016-02-25 153 views
9

当运行在我的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窗口弹出时,我最大化页面,测试通过。但是当我让Firefox浏览器运行的Selenium测试不能最大化时,它们就会失败。

我没有使用任何花哨的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

让我知道如果下面是好的 - 给予好评/标记为已回答 –

回答

5

你的答案就在于你的问题中。

  1. 错误说“add_task_sidebar_link” not clickable at point - (61, 24.300003051757812)这是另一个要素是 - Other element would receive the click: <a class="navbar-brand" href="#"></a>在点击正在尝试。由于您没有最大化浏览器,因此无法正确获取点坐标。
  2. 为了未来的测试不会中断,请滚动到该元素。参考这篇文章(Selenium python unable to scroll down)。检查动作链(http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.common.action_chains
+0

我应该一直滚动到与当我去叫点击硒元素()方法呢?或者当我有这个错误? – jejy2343

+0

我相信最新的硒自动卷轴。 –

0

这与更多元素'覆盖'对方。如果它发生在非最大化窗口上,这是有意义的。如果弹出/浮动div或其他元素覆盖了您实际尝试点击的元素,也可能发生。

请记住,硒是模仿用户,所以你通常不会做一个用户不会做的动作 - 比如点击一个被另一个覆盖的元素。

对此的潜在解决方法是使用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) 
+0

@ aneroid如果上面是真的 - 测试**应该可能失败**。 @ jejy2343 - 以上确认了应用程序中的代码缺陷。我猜测你什么时候不能最大化你的元素应该是1.可以滚动并且垂直/水平地保持它的跨度或者2.重新排列自己 - 适用于跨平台的Web UI。他们中的任何一个都应该发生。当您使用Javascript使用上述答案时,您需要通过潜在的健康检查并绕过该缺陷。反过来也可能是真的 - 你的测试用例可能不足,你试图点击它。 –

+0

Lemme总结上面::一个Web UI不应该覆盖其用户试图使用它的元素。我会说这可以被认为是一个外观和感觉缺陷 –

+0

感谢您的快速回答。我认为可能发生的情况是,当Firefox窗口没有最大化时,它会滚动到链接将位于左上角的位置。但是,即使您正在滚动,导航栏也会设置在页面的顶部,因此它也位于页面的左上角。这是一个猜测 - 我不确定硒在选择链接时如何处理滚动。 – jejy2343

0

在我目前的水豚的项目,我经常收到“元素不能点击”错误。这种错误的原因是,网页加载不足以定位元素。正如你所提到的测试以前过去了,你还没有编辑的代码库的一部分,所以你可以做以下的事情,才能通过此:定位之前

  1. 多放些等待时间“add_task_sidebar_link ”。以便页面完全加载。
  2. 即使在添加等待之后测试仍然失败,请在单击元素之前添加一些方法以进行屏幕截图。这将有助于调试测试。
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 
8

非常迟到了,但我有一个非常简单的解决方案,为我工作。而不是做.click(),只需做

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

选中元素后,空格键可以切换选择。为我工作!

+0

谢谢你,这整个上午都让我疯狂,而且这个修复了它。 –

+0

你是男人/女人。 – Speakeasys

2

跑到类似的问题(相同的错误),并尝试使用send_keys +发送空格键来模拟点击而不是鼠标点击上面的Major Major的解决方案。

主要主要的解决方案:

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

我打了一个新的错误尝试运行这一点,在“硒”指点。从代码中删除该关键字解决了问题,并允许我单击该元素。使用

最终成功的代码片段:

my_variable = driver.find_element_by_xpath('//*[@id="myId"]') #this is the checkbox 
my_variable.send_keys(webdriver.common.keys.Keys.SPACE) 
0

我有同样的问题:由于弹出窗口,我有件点击就昏昏屏幕,成为无法点击。

将页面滚动到工作元素。

在Python:

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