0

0

Selenium 自动化点击动态加载表格中可点击 td 元素的完整解决方案

碧海醫心

碧海醫心

发布时间:2026-02-07 09:58:04

|

426人浏览过

|

来源于php中文网

原创

Selenium 自动化点击动态加载表格中可点击 td 元素的完整解决方案

本文详解如何在 selenium 中可靠点击伦敦证券交易所动态渲染页面中带 `.clickable.td-with-link` 类的 `

` 元素,涵盖 cookie 弹窗处理、动态内容等待、元素可见性与可点击性校验及多级页面跳转实践。

在自动化抓取伦敦证券交易所(LSE)Price Explorer 页面(如 Bonds 分类页)时,直接调用 click() 失败是常见问题。根本原因并非代码逻辑错误,而是页面存在三层阻断机制:① 首次访问强制弹出 Cookie 同意横幅;② 表格数据通过 Angular 动态异步加载,

初始为空或含 class="disabled" 占位符;③ 可点击 实际包裹在 内,直接对 调用 click() 常因事件委托失效或遮挡而失败。

以下为经过实测验证的稳健解决方案,采用显式等待 + 精准定位 + 安全交互策略:

✅ 步骤一:显式等待并接受 Cookie 弹窗

Cookie 横幅会阻塞后续所有元素交互。需先定位并点击「Accept All Cookies」按钮(XPath 稳定性较高,但建议配合 WebDriverWait 防止过早查找):

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
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--start-maximized")
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 15)  # 延长超时至15秒,适应慢速网络

url = "https://www.php.cn/link/12b71d68d0493e7ac7c5e0558c0a498e"
driver.get(url)

# 等待并点击 Cookie 接受按钮(关键前置步骤)
try:
    accept_btn = wait.until(
        EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Accept All Cookies')]"))
    )
    accept_btn.click()
    print("✅ Cookie banner accepted.")
except Exception as e:
    print("⚠️  Cookie banner not found or not clickable — proceeding anyway.")
注意:避免使用绝对 XPath(如 /html/body/div/div[2]/...),因其极易因页面结构微调而失效。优先选择含语义文本(如 "Accept All Cookies")的相对 XPath 或 CSS 选择器。

✅ 步骤二:等待动态表格真实数据加载完成

目标表格 #price-explorer-results-wrapper 加载后,其

小K直播姬
小K直播姬

全球首款AI视频动捕虚拟直播产品

下载
内部仍可能处于 class="disabled" 状态(即占位符)。需等待首个可点击的公司名称 出现且可见
# 等待表格主体(tbody)内出现至少一个有效的 instrument-name span
first_company_span = wait.until(
    EC.visibility_of_element_located((
        By.CSS_SELECTOR, 
        "table#price-explorer-results-wrapper tbody tr.slide-panel td.instrument-name.gtm-trackable.td-with-link span.ellipsed"
    ))
)
print(f"✅ Found first company: {first_company_span.text.strip()}")

✅ 步骤三:安全点击公司名称并跳转详情页

直接对

调用 click() 易失败,应定位内部 并确保其可点击、无遮挡。推荐使用 ActionChains 模拟真实用户操作(滚动+点击),并捕获新窗口句柄:
from selenium.webdriver.common.action_chains import ActionChains

# 获取所有公司名称 span 元素(非 td!)
company_spans = driver.find_elements(
    By.CSS_SELECTOR, 
    "table#price-explorer-results-wrapper tbody tr.slide-panel td.instrument-name.gtm-trackable.td-with-link span.ellipsed"
)

for i, span in enumerate(company_spans[:3]):  # 示例:仅处理前3家公司
    try:
        # 滚动到元素顶部,消除遮挡
        driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", span)
        wait.until(EC.element_to_be_clickable(span))

        # 使用 ActionChains 点击(比 span.click() 更鲁棒)
        ActionChains(driver).move_to_element(span).click().perform()

        # 等待新窗口打开并切换
        wait.until(lambda d: len(d.window_handles) > 1)
        driver.switch_to.window(driver.window_handles[-1])

        # 此处可开始解析公司详情页(如 https://www.londonstockexchange.com/stock/957X/3i-group-plc/company-page)
        print(f"✅ Navigated to detail page for: {span.text.strip()}")

        # 【示例】提取 Instrument ID(位于详情页右上角)
        try:
            instrument_id = wait.until(
                EC.presence_of_element_located((By.CSS_SELECTOR, "div.instrument-id span"))
            ).text.strip()
            print(f"   Instrument ID: {instrument_id}")
        except:
            print("   ❌ Could not extract Instrument ID")

        # 关闭当前详情页,返回主窗口
        driver.close()
        driver.switch_to.window(driver.window_handles[0])

    except Exception as e:
        print(f"❌ Failed to click company #{i+1} ({span.text.strip()}): {str(e)}")
        continue

⚠️ 关键注意事项总结

  • 绝不依赖 time.sleep():它不可靠且拖慢执行。全程使用 WebDriverWait 配合 expected_conditions(如 element_to_be_clickable, visibility_of_element_located)。
  • 定位目标要精准:.clickable.instrument-name... 是 的 class,但实际可点击区域是其子 。对 点击常因 Angular 事件绑定机制失败。
  • 处理动态禁用状态:若
    存在,说明数据尚未就绪,需等待其消失或被真实内容替换(可通过 EC.invisibility_of_element_located 显式等待)。
  • 管理多窗口:每次点击链接都会打开新标签页,务必及时 switch_to.window() 并 close(),避免句柄泄漏。
  • 反爬友好提示:添加 --disable-blink-features=AutomationControlled 和 user-agent 模拟真实浏览器(生产环境建议)。
  • 通过以上结构化流程,即可稳定实现从 LSE 动态表格中逐个点击公司名称、跳转详情页并提取结构化数据的全链路自动化。核心在于:尊重前端渲染生命周期,以用户视角设计交互,用显式等待替代猜测式延时。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6439

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

418

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

95

2025.08.19

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

534

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.12.06

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

44

2025.12.13

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

60

2026.02.06

快手网页版入口与电脑端使用指南 快手官方短视频观看入口
快手网页版入口与电脑端使用指南 快手官方短视频观看入口

本专题汇总了快手网页版的最新入口地址和电脑版使用方法,详细提供快手官网直接访问链接、网页端操作教程,以及如何无需下载安装直接观看短视频的方式,帮助用户轻松浏览和观看快手短视频内容。

15

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.2万人学习

CSS教程
CSS教程

共754课时 | 28.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号