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

Selenium爬取Etherscan页面点击下一页触发ElementClickInterceptedException咨询

问题原因

你遇到的ElementClickInterceptedException报错,核心原因是点击下一页按钮时,页面上id为overlay的遮罩层(通常是加载动画、弹窗背景类元素)还未消失,完全遮挡了目标分页按钮,导致Selenium的原生点击操作无法触发。
此外原代码还存在3处逻辑问题会放大报错概率:

  • 每轮分页循环都重复执行iframe切换操作,反复切换上下文容易触发加载异常
  • 外层分页循环和内层表格行遍历都用i作为变量名,会出现变量覆盖,导致分页逻辑异常
  • 点击下一页后立即切回主文档,会中断iframe内的分页加载流程
解决方案

按以下规则修改代码即可解决问题:

  1. 操作下一页按钮前,新增等待逻辑,直到overlay遮罩层不可见再执行后续操作
  2. 进入页面后仅切换一次iframe,所有表格读取、分页操作都在iframe上下文内完成,分页全部结束后再切回主文档
  3. 用JS执行点击替代Selenium原生点击,就算元素被临时遮挡也能正常触发点击
  4. 修正循环变量重名问题,避免逻辑错乱
修复后代码
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

driver.get("https://etherscan.io/token/0xB8c77482e45F1F44dE1745F52C74426C631bDD52#balances")
wait = WebDriverWait(driver,30)

# 只切换一次iframe
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,"tokeholdersiframe")))

for page in range(1,20):
    time.sleep(3)
    # 等待遮罩层消失
    wait.until(EC.invisibility_of_element_located((By.ID, "overlay")))
    # 读取表格内容
    simpleTable = wait.until(EC.presence_of_element_located((By.XPATH,"/html/body/div[2]/div[3]/table")))
    rows = simpleTable.find_elements(By.TAG_NAME,"tr")
    # 内层循环不用i,避免变量覆盖
    for row_idx in range(1,len(rows)):
        cols = rows[row_idx].find_elements(By.TAG_NAME,"td")
        for g in cols:
            print(g.text)
    # 找到下一页按钮
    next_btn = wait.until(EC.element_to_be_clickable((By.XPATH,"//div[@class='d-inline-block']//a[@aria-label='Next']")))
    # 用JS点击,规避遮挡问题
    driver.execute_script("arguments[0].click();", next_btn)

# 所有分页操作完成后再切回主文档
driver.switch_to.default_content()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:36:06