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

Python Selenium无法点击分页下一页按钮的解决方法

问题背景
  • 基于Python环境下的Selenium实现HTML表格用户信息采集,目前第一页数据可正常获取,无法完成下一页按钮的点击跳转
  • 待点击的下一页按钮HTML源码如下:
<a tabindex="0" aria-label="Next page"> Next <span class="show-for-sr">page</span></a> 
  • 手动点击浏览器内该Next按钮可正常跳转分页,Selenium执行点击操作时抛出ElementClickInterceptedException异常,提示坐标(734, 1344)位置元素不可点击,完整异常堆栈如下:
Traceback (most recent call last):
  File "/Users/gavmross/Desktop/cnct/user_data/webscrape/active_users.py", line 182, in <module>
    main()
  File "/Users/gavmross/Desktop/cnct/user_data/webscrape/active_users.py", line 20, in main
    open_site()
  File "/Users/gavmross/Desktop/cnct/user_data/webscrape/active_users.py", line 160, in open_site
    click_next()
  File "/Users/gavmross/Desktop/cnct/user_data/webscrape/active_users.py", line 136, in click_next
    element = WebDriverWait(driver, 20).until(
  File "/Users/gavmross/opt/anaconda3/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 89, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/Users/gavmross/opt/anaconda3/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 773, in _execute
    return self._parent.execute(command, params)
  File "/Users/gavmross/opt/anaconda3/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 430, in execute
    self.error_handler.check_response(response)
  File "/Users/gavmross/opt/anaconda3/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element is not clickable at point (734, 1344)
  (Session info: chrome=102.0.5005.61)
Stacktrace:
0   chromedriver                        0x000000010276bd19 chromedriver + 5197081
1   chromedriver                        0x00000001026f9b23 chromedriver + 4729635
2   chromedriver                        0x00000001022d72b8 chromedriver + 393912
3   chromedriver                        0x0000000102313a52 chromedriver + 641618
4   chromedriver                        0x00000001023115d3 chromedriver + 632275
5   chromedriver                        0x000000010230ec14 chromedriver + 621588
6   chromedriver                        0x000000010230d885 chromedriver + 616581
7   chromedriver                        0x0000000102301689 chromedriver + 566921
8   chromedriver                        0x0000000102329802 chromedriver + 731138
9   chromedriver                        0x0000000102300f45 chromedriver + 565061
10  chromedriver                        0x000000010232990e chromedriver + 731406
11  chromedriver                        0x000000010233c2a1 chromedriver + 807585
12  chromedriver                        0x00000001023296f3 chromedriver + 730867
13  chromedriver                        0x00000001022ffa49 chromedriver + 559689
14  chromedriver                        0x0000000102300a75 chromedriver + 563829
15  chromedriver                        0x000000010273dbdd chromedriver + 5008349
16  chromedriver                        0x0000000102742b64 chromedriver + 5028708
17  chromedriver                        0x0000000102747bcf chromedriver + 5049295
18  chromedriver                        0x00000001027437ca chromedriver + 5031882
19  chromedriver                        0x000000010271d59f chromedriver + 4875679
20  chromedriver                        0x000000010275d388 chromedriver + 5137288
21  chromedriver                        0x000000010275d50f chromedriver + 5137679
22  chromedriver                        0x0000000102773085 chromedriver + 5226629
23  libsystem_pthread.dylib             0x00007fff203388fc _pthread_start + 224
24  libsystem_pthread.dylib             0x00007fff20334443 thread_start + 15
  • 当前使用的定位及点击代码如下:
element = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, '//*[@id="queryList"]/pagination-template/ul/li[10]/a'))
        )
element.click()
故障原因

ElementClickInterceptedException的触发逻辑是Selenium模拟用户点击时,目标坐标点被其他元素遮挡,默认点击动作落到了遮挡层上而非目标按钮。常见遮挡来源包括固定头尾导航栏、cookie授权弹窗、页面加载遮罩、悬浮广告,另外目标元素不在当前视口范围内时也会触发同类报错。
原有代码的XPath通过li标签序号定位,分页页码数量变化时极易出现定位偏差,稳定性不足。

可落地修复方案

优先按以下顺序调整代码,适配绝大多数分页点击拦截场景:

  1. 替换定位逻辑,放弃序号定位,改用按钮自带的aria-label唯一属性定位,稳定性更高
  2. 点击前先将目标按钮滚动到视口中间位置,避免元素在视口外被遮挡
  3. 优先用JS触发点击,绕过Selenium默认的坐标点击拦截检测
    可直接替换原有点击逻辑的代码如下:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 定位下一页按钮
next_btn = WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.XPATH, '//a[@aria-label="Next page"]'))
)
# 滚动到元素居中位置,避开固定头尾栏遮挡
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", next_btn)
# 等待元素进入可点击状态
next_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, '//a[@aria-label="Next page"]'))
)
# JS强制点击
driver.execute_script("arguments[0].click();", next_btn)

如果上述方案仍存在偶发失败,可根据页面实际情况叠加以下处理逻辑:

  • 点击前先等待页面加载遮罩、弹窗类元素消失,例如等待加载蒙层不可见:
# 替换为你页面实际的加载遮罩定位符
WebDriverWait(driver, 20).until(
    EC.invisibility_of_element_located((By.CLASS_NAME, 'loading-mask'))
)
  • 若存在固定弹窗、cookie提示栏,先执行关闭操作再进行分页点击
  • 可替换为ActionChains模拟真实鼠标移动点击,适配部分前端事件监听场景:
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).move_to_element(next_btn).click().perform()

注意:尽量避免使用time.sleep()硬等待,优先使用Selenium显式等待判断元素状态,减少页面加载速度波动带来的偶发失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 19:03:31