2013-05-31 35 views
2

我使用Selenium for Python與PhantomJS Ghost驅動程序,以便點擊鏈接中包含href中的Javascript的鏈接,例如this鏈接。作爲一個元素,我可以很好地獲得鏈接,但是當我嘗試點擊它時,事情就會出錯。下面是一些代碼(注意 - URL是一個列表,其中第一個元素是JScript鏈接,二是鏈接文本)Python Selenium Javascript鏈接單擊執行失敗

def get_jscript_down(self,url): 
    driver = webdriver.PhantomJS() 
    print(self.exact_url) 
    driver.get(self.exact_url) 
    elements = driver.find_elements_by_tag_name("a") 
    for ele in elements: 
     if ele.text == url[1].encode("utf-8").replace(" "," "): 
      break 
    ele.click() 
    print("Cannot yet download %s" % url) 

    return False 

一切工作,因爲我需要它除了ele.click()。當我執行它時,我看到一個醜陋的WebDriverException。

selenium.common.exceptions.WebDriverException: Message: u'Error Message => \'Click failed: ReferenceError: Can\'t find variable: __doPostBack\'\n caused by Request => {"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"81","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:34441","User-Agent":"Python-urllib/2.6"},"httpVersion":"1.1","method":"POST","post":"{\"sessionId\": \"71c20b50-ca21-11e2-a03c-f58c49e5a1bc\", \"id\": \":wdc:1370025577147\"}","url":"/click","urlParsed":{"anchor":"","query":"","file":"click","directory":"/","path":"/click","relative":"/click","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/click","queryKey":{},"chunks":["click"]},"urlOriginal":"/session/71c20b50-ca21-11e2-a03c-f58c49e5a1bc/element/%3Awdc%3A1370025577147/click"}' ; Screenshot: available via screen

我真的不知道爲什麼點擊失敗。據我所讀,我應該可以用這種方式使用點擊。以下是堆棧跟蹤的相關部分(從正式開始分解到結束之前)

 
line 283, in get_jscript_down 
    ele.click() 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/webelement.py", line 54, in click 
    self._execute(Command.CLICK_ELEMENT) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/webelement.py", line 228, in _execute 
    return self._parent.execute(command, params) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 165, in execute 
    self.error_handler.check_response(response) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/errorhandler.py", line 158, in check_response 
    raise exception_class(message, screen, stacktrace) 

任何想法都將不勝感激。我很難過。

+0

你可能會如果您使用基於URL動態構建的xpath或css定位器,而不是遍歷頁面上的每個標記,則可以實現更快,更可靠的測試。該代碼也將更具可讀性。 –

+0

雖然如果我使用另一個系統,我的測試移動得更快,但速度並不是我目前主要關心的問題。我的最終目標是使代碼足夠健壯以自動處理大多數基於Javascript的鏈接。大多數時候,我看到Xpaths是通過手動檢查鏈接信息而獲得的,比如Firebug,它比我想要的要少。 我不同意可讀性說明。這看起來像是讀取xPaths和讀取小型嵌套循環結構之間的「六合一」情況。不過,我仍然需要添加評論。 – Magoo111

+0

可以將xpath或css定位器讀爲「給我帶有包含文本xxxx的標籤的元素;單擊它」。循環讀取「用一個標籤檢查每個元素,如果它包含與xxxx匹配的文本,退出循環;單擊我們上次在循環中檢查的任何元素」。第一個更容易理解。如果鏈接不存在或您的識別方法錯誤,它也會給你一個「找不到元素」的錯誤,而循環會給你一個更難理解的錯誤,關於某些不可點擊的錯誤(或者可能是JS錯誤看這裏)。 –

回答

2

單擊this page上的「Privatperson」時出現同樣的錯誤。該按鈕的ID爲'btnSelectB2C'。我最後怎麼了使用提交元素是這樣做的:

driver.find_element(:id, 'btnSelectB2C').submit 

(這是Ruby代碼,但我相信它應該是微不足道的適應,如果它是適合你的情況)

+0

對不起,在任何迴應的長時間延遲。該項目的這一部分早已擱置。雖然我會盡可能地看一看,並讓你知道它是如何發展的! – Magoo111