【python自动化报错】StaleElementReferenceException

news/2025/2/8 15:44:23 标签: 自动化, deepseek, python

        这两天在尝试自己编写增删改查的自动化测试脚本,发现执行到查看的时候会报错:StaleElementReferenceException,查了一下说可能是因为页面刷新导致历史定位失效,需要重新定位元素才能进行操作。解决的方法大概就是三种,第一就是增加显式等待;第二就是使用try-except 捕获异常并重试;第三种方式就是 使用 JavaScript 点击元素。鉴于我的编程基础非常薄弱,所以就直接找AI帮忙优化了一下代码,不得不说deepseek真的太强了,下面请看示例:

原代码:

# 查看日报
iframe3 = driver.find_element(By.XPATH, "//*[@id='content-main']/iframe[2]")  # 定位到 iframe3
driver.switch_to.frame(iframe3)  # 切换到 iframe3
find_daily = driver.find_element(By.XPATH, '//*[@id="datagrid-row-r1-2-0"]/td[8]/div/a[1]')
find_daily.click()  
driver.switch_to.parent_frame()  # 退出iframe,返回上一层
time.sleep(5)
driver.find_element(By.XPATH, "/html/body/div[2]/table/tbody/tr[2]/td[2]/div/table/tbody/tr[3]/td/div/input").click()

1. 增加显示等待优化后的代码

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 定位到 iframe3
iframe3 = driver.find_element(By.XPATH, "//*[@id='content-main']/iframe[2]")
driver.switch_to.frame(iframe3)

# 点击查看日报
find_daily = driver.find_element(By.XPATH, '//*[@id="datagrid-row-r1-2-0"]/td[8]/div/a[1]')
find_daily.click()

# 等待页面刷新完成
WebDriverWait(driver, 10).until(EC.staleness_of(find_daily))

# 重新定位元素
find_daily = driver.find_element(By.XPATH, '//*[@id="datagrid-row-r1-2-0"]/td[8]/div/a[1]')
find_daily.click()

# 退出 iframe,返回上一层
driver.switch_to.parent_frame()

# 等待一段时间
time.sleep(5)

# 点击其他元素
driver.find_element(By.XPATH, "/html/body/div[2]/table/tbody/tr[2]/td[2]/div/table/tbody/tr[3]/td/div/input").click()

2. 使用 try-except 捕获异常并重试优化后的代码

from selenium.common.exceptions import StaleElementReferenceException

# 定位到 iframe3
iframe3 = driver.find_element(By.XPATH, "//*[@id='content-main']/iframe[2]")
driver.switch_to.frame(iframe3)

# 尝试点击查看日报
try:
    find_daily = driver.find_element(By.XPATH, '//*[@id="datagrid-row-r1-2-0"]/td[8]/div/a[1]')
    find_daily.click()
except StaleElementReferenceException:
    # 如果元素失效,重新定位并点击
    find_daily = driver.find_element(By.XPATH, '//*[@id="datagrid-row-r1-2-0"]/td[8]/div/a[1]')
    find_daily.click()

# 退出 iframe,返回上一层
driver.switch_to.parent_frame()

# 等待一段时间
time.sleep(5)

# 点击其他元素
driver.find_element(By.XPATH, "/html/body/div[2]/table/tbody/tr[2]/td[2]/div/table/tbody/tr[3]/td/div/input").click()

3. 使用 JavaScript 点击元素优化后的代码

# 定位到 iframe3
iframe3 = driver.find_element(By.XPATH, "//*[@id='content-main']/iframe[2]")
driver.switch_to.frame(iframe3)

# 使用 JavaScript 点击查看日报
find_daily = driver.find_element(By.XPATH, '//*[@id="datagrid-row-r1-2-0"]/td[8]/div/a[1]')
driver.execute_script("arguments[0].click();", find_daily)

# 退出 iframe,返回上一层
driver.switch_to.parent_frame()

# 等待一段时间
time.sleep(5)

# 点击其他元素
driver.find_element(By.XPATH, "/html/body/div[2]/table/tbody/tr[2]/td[2]/div/table/tbody/tr[3]/td/div/input").click()


http://www.niftyadmin.cn/n/5845044.html

相关文章

kafka服务端之控制器

文章目录 概述控制器的选举与故障恢复控制器的选举故障恢复 优雅关闭分区leader的选举 概述 在Kafka集群中会有一个或多个broker,其中有一个broker会被选举为控制器(Kafka Controler),它负责管理整个集群中所有分区和副本的状态。…

DeepSeek与人工智能的结合:探索搜索技术的未来

云边有个稻草人-CSDN博客 目录 引言 一、DeepSeek的技术背景 1.1 传统搜索引擎的局限性 1.2 深度学习在搜索中的优势 二、DeepSeek与人工智能的结合 2.1 自然语言处理(NLP) 示例代码:基于BERT的语义搜索 2.2 多模态搜索 示例代码&…

深入学习设计模式

创建型模式 单例模式 确保一个类只有一个实例,并提供全局访问点。 实现方式:懒汉式、饿汉式、双重校验锁等。 使用场景:配置管理器、线程池等。 工厂模式 通过工厂类创建对象,隐藏对象的创建细节。 简单工厂模式、工厂方法模式、抽…

RabbitMQ:windows最新版本4.0.5安装方案

前言 正在尝试学习RabbitMQ,因此考虑在windows上装一个最新版本来实验 关于安装,主要需要注意:先装与目标RabbitMQ版本对应的Erlang版本 这是官方给的对应版本兼容图: 我们需要安装4.0.5版本的RabbitMQ,则需要选择26.2…

android studio无痛入门

在Android Studio中创建和管理项目主要涉及以下几个步骤: 1. 创建新项目 打开Android Studio,点击“Start a new Android Studio project”或者“File” > “New” > “New Project”。 选择一个模板,例如“Empty Activity”&#xff0…

Redis Copilot:基于Redis为AI打造的副驾工具

我们最近发布了Redis Copilot,以帮助开发者更快地使用Redis构建应用。我们的使命是使应用程序快速运行,并简化构建过程。为此,Redis Copilot作为您的AI助手,能够让您更迅速地完成与Redis相关的任务。您今天就可以在Redis Insight中…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(四)

#作者:闫乾苓 系列前几篇: 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》:link 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)》: lin…

Java基础学习笔记-static关键字

>一个类可以创建n个对象。如果n个对象中的某些数据需要共用,就需要使用static关键字修 饰这些数据。 >Java中,一般情况调用类的成员都需要先创建类的对象,然后通过对象进行调用。使用static关键字可以实现通过类名加“.”直接调用类的…