You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中Selenium循环遇元素未找到时如何实现重试?

解决Selenium循环中元素未找到后的重试问题

基础重试实现

你的代码已经捕获了NoSuchElementException,只需在异常块中添加短暂等待后,让循环回到开头重新执行即可。continue关键字可以直接让程序跳回while True的起始位置,实现重试逻辑:

from selenium.common.exceptions import NoSuchElementException
import time
from selenium.webdriver.common.by import By

while True:
    try:
        # 点击下一页箭头
        driver.find_element(by=By.XPATH, value='/html/body/div[1]/div[1]/header/div/nav/button[3]/span').click()
        time.sleep(0.3)
        # 点击显示答案按钮
        driver.find_element(by=By.XPATH, value='/html/body/div[2]/div[3]/div[3]/div[3]/div[2]/div[5]/button[3]').click()
        time.sleep(0.3)
        # 点击橙色幻灯片箭头
        driver.find_element(by=By.XPATH, value='/html/body/div[1]/div[3]/div/button').click()
        time.sleep(0.3)
    except NoSuchElementException:
        # 元素未找到时,等待1秒后重试循环
        time.sleep(1)
        continue

优化方案:用显式等待替代固定sleep

固定时长的time.sleep不够可靠,页面加载延迟容易导致误判。改用Selenium的显式等待,等待元素可点击后再操作,能大幅减少不必要的异常,同时保留重试逻辑:

from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 初始化等待对象,最多等待10秒
wait = WebDriverWait(driver, 10)

while True:
    try:
        # 等待下一页箭头可点击并点击
        wait.until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[1]/div[1]/header/div/nav/button[3]/span'))).click()
        # 等待显示答案按钮可点击并点击
        wait.until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div[3]/div[3]/div[3]/div[2]/div[5]/button[3]'))).click()
        # 等待橙色幻灯片箭头可点击并点击
        wait.until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[1]/div[3]/div/button'))).click()
    except (NoSuchElementException, TimeoutException):
        time.sleep(1)
        # 可选:添加任务结束判断,避免无限循环
        try:
            # 替换为任务完成时出现的元素XPATH,比如"任务完成"提示
            driver.find_element(by=By.XPATH, value='//*[contains(text(), "任务完成")]')
            break  # 任务结束,退出循环
        except NoSuchElementException:
            continue  # 未结束则继续重试

额外建议

  • 替换绝对XPATH:你当前使用的绝对路径极易受页面结构变化影响,建议改用相对定位,比如根据元素文本、class属性定位,示例://button[contains(text(), '显示答案')]。
  • 设置重试上限:如果担心程序无限循环,可添加重试次数计数器,达到上限后自动退出。

内容的提问来源于stack exchange,提问作者greensun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:45:36