2017-08-19 45 views
0

我有一個測試,我點擊頁面上的鏈接列表。如果我在新頁面中打開鏈接,則可以使用browser.switchTo()。窗口和原始窗口的句柄遍歷列表,並單擊每個頁面。使用量角器訪問上一頁元素的正確方法是什麼?

但是,如果我在同一個頁面(_self)中打開一個鏈接,並使用browser.navigate()。back()返回到原始鏈接列表,當它迭代點擊下一個鏈接:

StaleElementReferenceError: stale element reference: element is not attached to the page document 

什麼是正確的方式來訪問先前頁面上的元素,一旦你已經導航了?

回答

0

當請求從與一個內部的唯一ID對象硒,硒ID的對象。看到下面的命令

>>> driver.find_element_by_tag_name("a") 
<selenium.webdriver.firefox.webelement.FirefoxWebElement 
(session="93fc2bec-c9f8-0c46-aec3-1939af00c917", 
element="5173f7fb-63ca-e447-b176-4a226d956834")> 

正如你所看到的元素有一個獨特的uuid。 Selenium會在內部維護這些列表,因此當您執行點擊操作時,它會從緩存中提取元素並對其執行操作。

一旦刷新頁面或一個新的頁面加載,這個緩存是不再有效。但是你在語言綁定中創建的對象仍然是。如果我嘗試並對其執行某些操作,那麼總之,沒有辦法使用同一個對象。這意味着你需要改變你的方法。考慮下面的代碼

for elem in driver.find_elements_by_tag_name("a"): 
    elem.click() 
    driver.back() 

上面的代碼將失敗的elem.click()的第二次嘗試。所以解決方法是確保不要重複使用集合對象。而是使用基於數字的循環。我可以用許多不同的方式編寫上面的代碼。考慮下面

方法1

elems = driver.find_elements_by_tag_name("a") 
count = len(elems) 
for i in range(0, count): 
    elems[i].click() 
    driver.back() 
    elems = driver.find_elements_by_tag_name("a") 

幾種方法這不是一個很大的方法,因爲我得到的對象的集合,並只使用其中的一個。這將有超過500個多鏈接的頁面將使這個代碼相當緩慢

方法2

elems = driver.find_elements_by_tag_name("a") 
count = len(elems) 
for i in range(1, count + 1): 
    elem = driver.find_element_by_xpath("(//a)[{}]".format(i)) 
    driver.back() 

這比方法1更好,因爲我想起來了一個所有對象。後者我得到一個使用一個

方法3

elems = driver.find_elements_by_tag_name("a") 
links = [] 

for elem in elems: 
    links.append(elem.get_attribute("href")) 

for link in links: 
    driver.get(link) 
    # do some action 

當鏈接的href基於這種方法纔有效。所以它是基於這種情況我會選擇或改變我的方法

相關問題