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

Python Selenium脚本到达最后一页后无限等待,如何使其继续执行?

问题

我正在某足球投注网站上实现点击下一页直至最后一页的脚本,目前翻页操作能成功执行,但到达最后一页后脚本会进入无限等待状态。我不想用15秒显式等待超时的方式(速度太慢,不是最优解),求最佳实现方案。

原代码

i = 1
while i < 6:
    try:
        time.sleep(2)
        #time.sleep(random, 3)
        WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR,  ".name:nth-child(1)")))
        WebDriverWait(driver, 100).until(lambda driver: driver.execute_script('return document.readyState') == 'complete')
        element = WebDriverWait(driver, 20).until(lambda driver: driver.find_element(By.CSS_SELECTOR, ".name:nth-child(1) , bf-coupon-table:nth-child(1) tr:nth-child(1) .matched-amount-value"))
        scroll = driver.find_element(By.CSS_SELECTOR, ".coupon-page-navigation__label--next")
        driver.execute_script("arguments[0].scrollIntoView();", scroll)
        link = driver.find_element_by_css_selector('[href^=http://somelink.com/]')
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "bf-coupon-page-navigation > ul > li:nth-child(4) > a")))
        NextStory = WebDriverWait(driver, 15).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'bf-coupon-page-navigation > ul > li:nth-child(4) > a')))
        link = driver.find_element_by_css_selector('bf-coupon-page-navigation > ul > li:nth-child(4) > a')
        NextStory.click()
    except:
        i = 6
解决方案

核心是通过判断下一页按钮的可交互状态终止循环,而非依赖超时异常,彻底避免无限等待和低效的固定超时。

实现思路

  1. 确认最后一页时下一页按钮的状态:通常会变为disabled(不可点击)或直接隐藏,需先验证页面实际结构;
  2. 用while True循环替代原有限循环,每次优先检查下一页按钮是否可用;
  3. 移除冗余等待逻辑,用更高效的页面加载判断方式。

优化后代码

from selenium.common.exceptions import NoSuchElementException, ElementNotInteractableException, TimeoutException

while True:
    try:
        # 等待页面DOM加载完成
        WebDriverWait(driver, 10).until(lambda d: d.execute_script('return document.readyState') == 'complete')
        # 等待当前页核心元素加载完成
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".name:nth-child(1)")))
        
        # 定位并等待下一页按钮可点击
        next_btn = WebDriverWait(driver, 5).until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, "bf-coupon-page-navigation > ul > li:nth-child(4) > a"))
        )
        # 滚动到按钮位置(避免被遮挡)
        driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", next_btn)
        next_btn.click()
        
        # 等待当前页元素失效(确认页面已刷新),替代固定sleep
        current_page_element = driver.find_element(By.CSS_SELECTOR, ".name:nth-child(1)")
        WebDriverWait(driver, 10).until(EC.staleness_of(current_page_element))
        
    except (NoSuchElementException, ElementNotInteractableException, TimeoutException):
        # 捕获下一页按钮不存在/不可点击/超时异常,终止循环
        break

关键优化点

  • 移除冗余等待:原代码重复等待同一元素,合并为必要的单次等待;
  • 状态判断替代超时:直接检查下一页按钮的可点击状态,到最后一页立即终止,无无效等待;
  • 替换固定sleep:用staleness_of等待页面刷新完成,比固定休眠更灵活高效;
  • 精准异常捕获:只捕获与翻页相关的异常,避免其他错误被掩盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:40:32