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了

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

posted @ 2018-06-19 10:11  Operater  阅读(12579)  评论(0编辑  收藏  举报