我使用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)
任何想法都將不勝感激。我很難過。
你可能會如果您使用基於URL動態構建的xpath或css定位器,而不是遍歷頁面上的每個標記,則可以實現更快,更可靠的測試。該代碼也將更具可讀性。 –
雖然如果我使用另一個系統,我的測試移動得更快,但速度並不是我目前主要關心的問題。我的最終目標是使代碼足夠健壯以自動處理大多數基於Javascript的鏈接。大多數時候,我看到Xpaths是通過手動檢查鏈接信息而獲得的,比如Firebug,它比我想要的要少。 我不同意可讀性說明。這看起來像是讀取xPaths和讀取小型嵌套循環結構之間的「六合一」情況。不過,我仍然需要添加評論。 – Magoo111
可以將xpath或css定位器讀爲「給我帶有包含文本xxxx的標籤的元素;單擊它」。循環讀取「用一個標籤檢查每個元素,如果它包含與xxxx匹配的文本,退出循環;單擊我們上次在循環中檢查的任何元素」。第一個更容易理解。如果鏈接不存在或您的識別方法錯誤,它也會給你一個「找不到元素」的錯誤,而循環會給你一個更難理解的錯誤,關於某些不可點擊的錯誤(或者可能是JS錯誤看這裏)。 –