當請求從與一個內部的唯一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基於這種方法纔有效。所以它是基於這種情況我會選擇或改變我的方法