selenium之坑(StaleElementReferenceException: Message: Element not found in the cache...)


 

有時候循環點擊一列鏈接,只能點到第一個,第二個就失敗了

原因是第二個已經是新頁面,當然找不到之前頁面的元素。就算是后退回來的,頁面也是不一樣的

頁面長的一樣不一定是同一張頁面,就像兩個人長的一樣不一定是同一個人,他們的身份證號不同,頁面,甚至頁面上的元素都是有自己的身份證號(id)的

 

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')

print(driver.find_element_by_id('kw'))  # kw before refresh

driver.refresh()  # refresh

print(driver.find_element_by_id('kw'))  # kw after refresh

driver.quit()
"""
<selenium.webdriver.remote.webelement.WebElement (session="eaad4403c91da0736e9f3218a4d2ea7d", element="0.9658163881659727-1")>
<selenium.webdriver.remote.webelement.WebElement (session="eaad4403c91da0736e9f3218a4d2ea7d", element="0.7123759980029825-1")>
"""

我們發現,僅僅是刷新了一下頁面,兩次的element id是不同的,這就說明這是兩個不同的元素,如果用以下的方式來定位,自然會因為找不到而報錯

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://www.baidu.com')

kw = driver.find_element_by_id('kw')  # 先定位並獲得kw元素
kw.click()

driver.refresh()  # refresh

kw.click()  # 刷新后,仍用原來的kw元素操作,這時會報錯

driver.quit()
"""

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
(Session info: chrome=66.0.3359.181)
(Driver info: chromedriver=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform=Windows NT 6.1.7601 SP1 x86_64)


"""

原因很明顯,你用別人的身份證id去找現在的人,哪怕這兩個人長的很像,他也會告訴你,對不起,你找錯人啦

refresh,無論你是主動刷新還是頁面自動刷新

back,已經跳轉到了其他頁面,然后你用driver.back()跳回來,這也是一張新的頁面了

跳轉到了新的頁面,但這張新頁面上有一些元素跟之前頁面是長的一樣的,這也是一張新的頁面了。比如:一排分頁按鈕,你點擊下一頁跳轉到了第二頁,想要還用原來的元素操作到下一頁,那也是不可能的了

除此之外可能還有其他的原因,總之看到類型差不多,但是對頁面有了操作,就應該想想這種可能性

遇到這種情況怎么辦:

很簡單:

刷新頁面之后重新獲取元素就行,不要提前獲取一組元素,然后去循環操作每一個元素,這種情況還是獲取元素的個數,然后在循環中獲取相應位置的元素,在用的時候才去獲取,這樣你就獲取到最新的id了

遇到頁面有變化的情況,不要去循環元素,去循環個數或定位方式,在循環中獲取元素


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM