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()

 

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

posted @ 2018-10-17 17:00  Operater  阅读(8828)  评论(0编辑  收藏  举报