Selenium遍历div中w-72类元素逐个点击无响应问题排查
Selenium无法点击rarity.tools项目div问题修复方案
问题根因
- 无加载等待逻辑:
driver.get()执行完成仅代表页面基础框架加载完毕,rarity.tools的项目列表是前端JS异步拉取渲染的,代码执行到元素查找步骤时,项目DOM还未生成,find_elements拿到的是空列表,直接触发IndexError跳出循环,全程无有效点击操作,也不会抛出显性报错。 - 点击目标错误:class为
w-72的div只是外层卡片容器,本身没有绑定跳转点击事件,真正触发页面跳转的是其内部的<a>标签,点击外层div无法触发跳转。 - 遍历逻辑缺陷:从详情页执行
driver.back()返回首页后,页面DOM会完全重绘,之前获取的元素引用全部失效;且页面采用滚动加载机制,未滚动到视口范围内的项目不会渲染到DOM树中,单纯靠index递增的逻辑既无法覆盖全量项目,还会出现元素不在可视区、元素失效导致的点击失败问题。 - 缺少交互前置判断:点击前未校验元素是否可点击、是否被遮挡,直接执行点击操作很容易被顶部导航、浮层遮挡导致点击无响应。
修复方案
- 替换定位规则:不再直接定位
w-72的div,通过XPath定位卡片内部的跳转a标签,精准匹配可交互的跳转元素。 - 增加显式等待:所有元素操作前加显式等待,等元素完全加载、可交互后再执行操作,避免异步渲染导致的元素查找失败。
- 优化遍历逻辑:先通过滚动操作加载完全量项目,提取所有项目的详情页地址去重后,直接通过
driver.get()访问详情页,替代模拟点击操作,从根源上避免点击失效、DOM重绘导致的元素引用问题。 - 增加滚动逻辑:如果需要保留模拟点击的逻辑,点击前先将元素滚动到可视区域中央,避免元素不在视口导致的点击失败。
修复后可运行代码
from selenium import webdriver 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 = webdriver.Chrome(executable_path="C:\\chromedriver.exe") driver.maximize_window() wait = WebDriverWait(driver, 15) visited_projects = set() # 打开首页 driver.get("https://rarity.tools/") # 滚动加载全量项目 last_scroll_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) new_scroll_height = driver.execute_script("return document.body.scrollHeight") # 滚动高度不再变化说明所有项目加载完成 if new_scroll_height == last_scroll_height: break last_scroll_height = new_scroll_height # 提取所有项目详情页链接 project_a_tags = wait.until(EC.presence_of_all_elements_located( (By.XPATH, "//div[contains(@class,'w-72')]/a") )) project_urls = [] for a in project_a_tags: href = a.get_attribute("href") if href and href not in project_urls: project_urls.append(href) # 遍历采集详情 for url in project_urls: if url in visited_projects: continue visited_projects.add(url) # 直接访问详情页,稳定性远高于模拟点击 driver.get(url) # 等待详情页核心元素加载完成 wait.until(EC.presence_of_element_located((By.TAG_NAME, "h1"))) # 在此处编写详情采集逻辑 # project_title = driver.find_element(By.TAG_NAME, "h1").text # print(project_title) time.sleep(1) driver.quit()
若访问过程中触发Cloudflare人机验证,手动完成一次验证后脚本即可正常运行,也可根据需求接入对应验证绕过逻辑。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

