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

Selenium实现循环翻页时无法点击下一页按钮的问题求助

问题描述

开发Selenium Web自动化脚本实现分页操作逻辑时,需要循环点击页面上显示为(>)的下一页按钮,直到抵达最后一页停止。参考过同类翻页场景的实现方案,但始终无法定位代码问题,翻页逻辑无法按预期运行,原实现代码如下:

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

driver = webdriver.Chrome("C:/Users/krish/Desktop/chromedriver_win32/chromedriver.exe")

driver.get('https://www.cnbcindonesia.com/tag/pasar-modal')
wait = WebDriverWait(driver,30)


while True:
 try:
    element = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[@class = 'icon icon-angle-right']/i")))
    if (element != 0):
        element.click()
 except TimeoutException as ex:
        break
核心问题排查
  • 存在冗余导入:重复导入了两次WebDriverWait,其中一次设置了别名Wait但全程没用到,属于无效代码。
  • 元素定位目标错误:XPath最终定位到的是下一页按钮内部的<i>图标节点,不是绑定了点击事件的<a>标签本身,点击内部图标很容易出现点击无效、被其他元素拦截的问题。
  • 无意义的判断逻辑:wait.until(EC.element_to_be_clickable())要么返回找到的可点击元素对象,要么直接抛出TimeoutException,永远不会返回0,if (element != 0)的判断完全多余。
  • 缺少翻页后的加载等待:点击下一页后没有等待新页面内容加载完成就直接进入下一轮循环,此时DOM还停留在旧页面状态,要么重复点击同一页的按钮,要么提前触发异常退出循环。
  • 最后一页判断逻辑效率低:该站点最后一页的下一页按钮会直接置灰加disabled类,不会从DOM中消失,原逻辑靠等30秒超时才退出,既浪费时间,还可能因为置灰元素状态判断异常导致提前退出。
修正后可运行代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException, ElementClickInterceptedException
import time

# 初始化驱动
driver = webdriver.Chrome("C:/Users/krish/Desktop/chromedriver_win32/chromedriver.exe")
driver.get('https://www.cnbcindonesia.com/tag/pasar-modal')
wait = WebDriverWait(driver, 10)
driver.maximize_window()

while True:
    try:
        # 定位可点击的下一页a标签,不定位内部i图标
        next_btn = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "a.icon.icon-angle-right")))
        
        # 检测到按钮为置灰禁用状态,说明已到最后一页,直接退出
        if "disabled" in next_btn.get_attribute("class"):
            print("已抵达最后一页,翻页结束")
            break
        
        # 滚动到按钮位置,避免被顶部固定导航栏遮挡
        driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", next_btn)
        time.sleep(0.5) # 等待滚动动画完成
        
        # 点击下一页
        next_btn.click()
        
        # 等待旧页面内容失效,确认新页面加载完成
        wait.until(EC.staleness_of(driver.find_element(By.CSS_SELECTOR, ".list-item")))
        
    except TimeoutException:
        # 超时找不到下一页按钮,退出循环
        break
    except ElementClickInterceptedException:
        # 元素被遮挡时用JS强制点击兜底
        driver.execute_script("arguments[0].click();", next_btn)
        wait.until(EC.staleness_of(driver.find_element(By.CSS_SELECTOR, ".list-item")))

# 操作完成后可调用driver.quit()关闭浏览器
# driver.quit()
关键修改说明
  • 调整元素定位规则:直接通过CSS选择器定位带icon icon-angle-right类的<a>按钮节点,不再定位内部的图标子元素,保证点击目标是绑定了跳转逻辑的正确元素。
  • 新增最后一页前置判断:每轮循环先检测下一页按钮的class是否包含disabled属性,如果包含说明已经到最后一页,直接退出循环,不需要等超时,执行效率更高。
  • 新增滚动防遮挡逻辑:点击前先把按钮滚动到页面中间位置,等待短暂时间让滚动动画完成,避免被页面顶部固定的导航栏遮挡导致点击失败。
  • 新增翻页完成校验:点击按钮后,等待旧页面的文章列表节点失效,确认新页面内容加载完成后再进入下一轮循环,避免出现重复点击同一页的问题。
  • 新增点击异常兜底:如果触发元素被遮挡的报错,直接用JS执行点击作为兜底方案,提升脚本在不同加载状态下的稳定性。
  • 清理冗余代码:删掉重复的导入语句和无意义的元素值判断,简化代码逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:36:20