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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:27:24