Selenium爬取Etherscan页面点击下一页触发ElementClickInterceptedException咨询
问题原因
你遇到的ElementClickInterceptedException报错,核心原因是点击下一页按钮时,页面上id为overlay的遮罩层(通常是加载动画、弹窗背景类元素)还未消失,完全遮挡了目标分页按钮,导致Selenium的原生点击操作无法触发。
此外原代码还存在3处逻辑问题会放大报错概率:
- 每轮分页循环都重复执行iframe切换操作,反复切换上下文容易触发加载异常
- 外层分页循环和内层表格行遍历都用
i作为变量名,会出现变量覆盖,导致分页逻辑异常 - 点击下一页后立即切回主文档,会中断iframe内的分页加载流程
解决方案
按以下规则修改代码即可解决问题:
- 操作下一页按钮前,新增等待逻辑,直到
overlay遮罩层不可见再执行后续操作 - 进入页面后仅切换一次iframe,所有表格读取、分页操作都在iframe上下文内完成,分页全部结束后再切回主文档
- 用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 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
相关产品推荐
相关产品推荐

