有時候循環點擊一列連接,只能點到第一個,第二個就失敗了web
緣由是第二個已是新頁面,固然找不到以前頁面的元素。就算是後退回來的,頁面也是不同的chrome
頁面長的同樣不必定是同一張頁面,就像兩我的長的同樣不必定是同一我的,他們的身份證號不一樣,頁面,甚至頁面上的元素都是有本身的身份證號(id)的session
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是不一樣的,這就說明這是兩個不一樣的元素,若是用如下的方式來定位,天然會由於找不到而報錯ui
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)spa
"""
緣由很明顯,你用別人的身份證id去找如今的人,哪怕這兩我的長的很像,他也會告訴你,對不起,你找錯人啦3d
refresh,不管你是主動刷新仍是頁面自動刷新code
back,已經跳轉到了其餘頁面,而後你用driver.back()跳回來,這也是一張新的頁面了orm
跳轉到了新的頁面,但這張新頁面上有一些元素跟以前頁面是長的同樣的,這也是一張新的頁面了。好比:一排分頁按鈕,你點擊下一頁跳轉到了第二頁,想要還用原來的元素操做到下一頁,那也是不可能的了blog
除此以外可能還有其餘的緣由,總之看到類型差很少,可是對頁面有了操做,就應該想一想這種可能性element
遇到這種狀況怎麼辦:
很簡單:
刷新頁面以後從新獲取元素就行,不要提早獲取一組元素,而後去循環操做每個元素,這種狀況仍是獲取元素的個數,而後在循環中獲取相應位置的元素,在用的時候纔去獲取,這樣你就獲取到最新的id了
遇到頁面有變化的狀況,不要去循環元素,去循環個數或定位方式,在循環中獲取元素