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

 

有时候循环点击一列连接,只能点到第一个,第二个就失败了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了

遇到页面有变化的状况,不要去循环元素,去循环个数或定位方式,在循环中获取元素

相关文章
相关标签/搜索