selenium之坑:點擊后頁面刷新重新獲取刷新前的頁面(StaleElementReferenceException:Message:Element not found in the cache...)


 

循環點擊一列鏈接,但只能點到第一個,第二個失敗,這是為什么,因為第二個已經是新頁面,當然找不到之前頁面的元素,雖然元素沒變,甚至是后退回來,頁面都沒有變,為什么是新頁面,頁面長的一樣不代表是同一張頁面,就像兩個人長得一樣不一定是同一個人,他們身份證號不同,頁面,頁面上的元素都是有自己的身份證號的

 

#coding:utf8

from selenium import webdriver

driver=webdriver.Chome()

driver.get(url)

print(driver.find_element_by_id('kw'))

driver.refresh()

print(driver.find_element_by_id('kw'))

driver.quit()

結果:

<selenium.webdriver.remote.webelement.WebElement (session="d726e8fdfbc05f9bea26e33d09a2a67f", element="0.6155236891000833-1")>
<selenium.webdriver.remote.webelement.WebElement (session="d726e8fdfbc05f9bea26e33d09a2a67f", element="0.3351209127484813-1")>

 

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

#coding:utf8

from selenium import webdriver

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

kw=driver.find_element_by_id('kw')
kw.click()

driver.refresh()

kw.click()
driver.quit()

結果:

Traceback (most recent call last):
File "D:/py3code/xxx/last_week/test.py", line 16, in <module>
kw.click()
File "D:\py3.6\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click
self._execute(Command.CLICK_ELEMENT)
File "D:\py3.6\lib\site-packages\selenium\webdriver\remote\webelement.py", line 628, in _execute
return self._parent.execute(command, params)
File "D:\py3.6\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 312, in execute
self.error_handler.check_response(response)
File "D:\py3.6\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
(Session info: chrome=68.0.3440.106)
(Driver info: chromedriver=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform=Windows NT 6.1.7601 SP1 x86_64)

 

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

當然,不僅僅這一種情況,如果你執行以下的操作,都有可能找錯人:

refresh,不論你是主動刷新還是自動刷新

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

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

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

遇到這種情況該腫么辦?

很簡單:

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

總之一句話,遇到頁面有變化的情況,不要去循環元素,去循環個數或者定位方式,再循環中獲取元素

解決方法示例:

錯誤寫法:

all_a=driver.find_elements_by_class('class_name')
for a in all_a:
    a.click()

這樣就容易點擊了第一個a之后,頁面出現刷新的情況,再想點第二個就會報這個錯

可以改成:

 

counts_a=len(driver.find_elements_by_class('class_name'))
for i in range(counts_a): driver.find_elements_by_xpath('//a[@class="class_name"][i+1]').click()

 

可能會更好一些,當然,也有其他的寫法,大概意思就是需要在刷新后重新去定位一次,再用重新定位到的元素去操作


免責聲明!

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



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