有时候循环点击一列连接,只能点到第一个,第二个就失败了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了
遇到页面有变化的状况,不要去循环元素,去循环个数或定位方式,在循环中获取元素