这两天在尝试自己编写增删改查的自动化测试脚本,发现执行到查看的时候会报错: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()