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
解决方案
核心是通过判断下一页按钮的可交互状态终止循环,而非依赖超时异常,彻底避免无限等待和低效的固定超时。
实现思路
- 确认最后一页时下一页按钮的状态:通常会变为
disabled(不可点击)或直接隐藏,需先验证页面实际结构; - 用
while True循环替代原有限循环,每次优先检查下一页按钮是否可用; - 移除冗余等待逻辑,用更高效的页面加载判断方式。
优化后代码
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
相关产品推荐
相关产品推荐

