1. 异常原因
在执行脚本时,有时候引用元素对象会抛出如下异常:
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
字面上的意思是,引用的元素已过时。原因是页面刷新了,此时当然找不到之前页面的元素,就算是后退回来的页面也是不一样的。
我们来看看下面这个例子:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
try:
driver.get("http://www.baidu.com/")
element1 = driver.find_element_by_id("kw")
print("element1: ", element1)
driver.refresh()
element2 = driver.find_element_by_id("kw")
print("element2: ", element2)
element1.send_keys("hwijew")
finally:
time.sleep(2)
driver.quit()
我们发现,仅仅是刷新了一下页面,两次的element id是不同的,这就说明这是两个不同的元素,如果用之前的element,自然会报错。
原因很明显,你用别人的身份证id去找现在的人,哪怕这两个人长的很像,他也会告诉你,对不起,你找错人啦。
2. 解决方案
遇到这种情况怎么办:
a. 不要提前去获取元素,刷新页面之后应该重新获取元素。需要获取一组元素的,先获取元素个数,然后在循环中获取相应位置的元素,在用的时候才去获取。 换言之,遇到页面有变化的情况,应该循环个数或定位方式,在循环中获取元素,不要去循环元素。
b. 有时我们无法避免,不确定什么时候元素就会被刷新。页面刷新后重新获取元素的思路不变,这时可以使用python的异常处理语句:try…except…,异常出现时重新执行,关键代码如下:
from selenium.common.exceptions import StaleElementReferenceException
attempts = 0
while attempts < 2:
try:
element = xxx
element.click()
break
except StaleElementReferenceException:
attempts += 1