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
相关产品推荐
相关产品推荐

