2016-02-25 150 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)