Selenium防踩坑 - StaleElementReferenceException 解决方案

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

在这里插入图片描述


在这里插入图片描述

  • 35
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值