【Python】selenium利用find_element时解决【StaleElementReferenceExcepti ...

打印 上一主题 下一主题

主题 635|帖子 635|积分 1905

StaleElementReferenceException 是 Selenium WebDriver 中的一种异常,通常在元素与当前页面的状态差别步时抛出,比如页面已经刷新或导航到另一个页面,但是实验操纵的元素引用仍然是旧页面上的元素。
以下是一些解决 StaleElementReferenceException 的方法:
1. 利用显式等待 wait.until 直到元素可用:

StaleElementReferenceException 的题目是我们获取的元素过时了,无法获取到。如果利用显式等待的方法,可以定期检查元素的状态,直到满足某个条件。
  1. python
  2.     from selenium.webdriver.common.by import By
  3.     from selenium.webdriver.support.ui import WebDriverWait
  4.     from selenium.webdriver.support import expected_conditions as EC
  5.     try:
  6.             wait = WebDriverWait(driver, 10)
  7.             xpath=''#xpath路径
  8.                 element= wait.until(EC.presence_of_element_located((By.XPATH, xpath)))
  9.                 driver.execute_script("arguments[0].click();", element) #使用js点击
  10.                 #等于element.click(),只是比click更稳定点
  11.         )
  12.     except TimeoutException:
  13.         print("元素已过时")
复制代码
记着,处理 StaleElementReferenceException 的最佳实践,通常是利用 Selenium 的显式等待机制,它会自动等待直到元素可交互,从而制止元素过时的题目。
补充until_not的方法:
显性等待是不停等待某个元素的出现,假设我们想要等待直到一个元素不再可见(比方一些弹窗之类的功能过一段时间会消失),可以利用 until_not 这样写:
  1. from selenium.webdriver.support.ui import WebDriverWait
  2. from selenium.webdriver.support import expected_conditions as EC
  3. try:
  4.     # 等待直到元素不再可见,最多等待10秒
  5.     WebDriverWait(driver, 10).until_not(EC.visibility_of_element_located((By.ID, "myElement")))
  6. except TimeoutException:
  7.     print("元素在指定时间内仍然可见")
复制代码
  until_not的适用场景:
until_not 是处理必要等待某些条件消失的场景的一个强大工具
在这个例子中,visibility_of_element_located 是一个预期条件函数,它检查指定的元素是否可见。until_not 方法将等待直到这个条件返回 False,即元素不再可见。
  注意事项
  1. 1. 使用 until_not 时,确保传入的函数是正确的,并且它最终会返回 False,否则会无限期地等待下去。
  2. 2. until_not 通常与 expected_conditions 模块中的条件一起使用,但也可以将任何返回布尔值的函数传递给它。
  3. 3. 显式等待提供了一种更可靠的方式来处理动态网页内容,特别是当元素的出现或消失是异步操作时。
复制代码
2. try except 和 is_stale()的利用

如果以上方法不成,可以利用常规的try except捕捉错误的方法,直接快捷处理这类题目。
我们遇到StaleElementReferenceException题目的时候,大概会有登录元素有更新,可以利用读取的等待的方式,直到元素不再过时。我们在代码中捕捉这个错误,并根据必要进行错误处理,比如重试操纵、记录错误信息大概停止测试。
此外,如果我们想要检查一个元素是否过时,可以这样做:
  1. 1. 尝试执行一个操作,比如点击,如果元素过时,将会抛出 StaleElementReferenceException。
  2. 2. 捕获这个异常,并使用 is_stale() 方法来检查元素是否过时。
复制代码
  1.     from selenium.webdriver.support.ui import WebDriverWait
  2.     from selenium.webdriver.support import expected_conditions as EC
  3.         from selenium.common.exceptions import StaleElementReferenceException   
  4.                                           
  5.         try:
  6.             element = driver.find_element(By.XPATH, xpath)
  7.             #.click()  # 或者其他操作
  8.         except StaleElementReferenceException as e:
  9.             if e.is_stale():
  10.                 print("元素引用已过时")
  11.                 # 可以在这里添加重新获取元素的逻辑
  12.             else:
  13.                 print("发生其他类型的 StaleElementReferenceException")
  14.         except Exception as e:
  15.             print("发生异常:", e)
  16.     )
复制代码
在这个示例中,如果 element.click() 由于元素过时而抛出 StaleElementReferenceException,我们可以通过 e.is_stale() 来检查是否是因为元素过时导致的异常。
除了上面的方法,一些其他exception也通用的方法,比较推荐:
3. 更新页面:

如果页面已经更新,大概必要重新加载页面driver.refresh()或重新导航到页面以获取最新的元素引用。
4. 检查网络耽误:

如果网络耽误导致页面加载缓慢,大概会引起元素过时。确保网络毗连稳定。
5. 淘汰页面操纵:

淘汰在页面上实行的不必要操纵,以淘汰页面刷新或重新加载的大概性。
通过这些方法,可以有效地处理 StaleElementReferenceException 异常,并确保你的自动化测试脚本可以或许稳定运行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

花瓣小跑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表