0

0

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

霞舞

霞舞

发布时间:2026-02-07 15:38:27

|

630人浏览过

|

来源于php中文网

原创

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

本文详解如何在 selenium 自动化中正确处理伦敦证券交易所(lse)等动态网站中延迟渲染、cookie 阻挡及元素不可点击问题,通过显式等待、滚动定位、cookie 接受与 xpath 精准定位,稳定触发 `td.clickable` 元素跳转。

在使用 Selenium 自动化访问 LSE Price Explorer 时,脚本失败的根本原因并非元素选择器错误,而是三重阻断机制叠加

  1. Cookie 弹窗拦截:页面首次加载后,遮罩层会阻塞所有交互,必须先接受 Cookie;
  2. 动态渲染延迟:表格数据由 Angular 异步加载,presence_of_element_located 仅确认 DOM 存在,不保证内容已填充或可交互;
  3. Angular 属性变更:如
    表明组件处于未就绪状态,此时 td.clickable 虽存在但被禁用。

    以下是经过验证的健壮解决方案(适配最新 Chrome + Selenium 4+):

    闪电说
    闪电说

    AI语音输入法

    下载

    ✅ 正确步骤与优化代码

    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
    import time
    
    # 启动配置(无头模式可选,调试建议关闭)
    options = Options()
    # options.add_argument("--headless")  # 调试时注释此行
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")
    
    driver = webdriver.Chrome(options=options)
    wait = WebDriverWait(driver, 15)  # 延长超时至15秒应对慢网
    
    try:
        driver.get("https://www.php.cn/link/12b71d68d0493e7ac7c5e0558c0a498e")
    
        # Step 1: 显式等待并点击 Cookie 接受按钮(关键!)
        cookie_btn = wait.until(
            EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Accept') or contains(., 'AGREE')]"))
        )
        cookie_btn.click()
        time.sleep(1)  # 短暂缓冲,确保弹窗完全消失
    
        # Step 2: 等待表格主体加载完成(等待 tbody 中至少一个 tr 渲染)
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "table#price-explorer-results-wrapper tbody tr")))
    
        # Step 3: 定位所有可点击公司名 td(推荐:基于 span 文本更稳定)
        company_tds = wait.until(
            EC.presence_of_all_elements_located((
                By.CSS_SELECTOR, "td.clickable.instrument-name.gtm-trackable.td-with-link span.ellipsed"
            ))
        )
    
        # Step 4: 逐个点击(避免 stale element,每次重新查找)
        for i in range(min(3, len(company_tds))):  # 示例:只点前3个,防超时
            # 重新获取最新元素列表(防止 stale)
            fresh_tds = driver.find_elements(By.CSS_SELECTOR, 
                "td.clickable.instrument-name.gtm-trackable.td-with-link span.ellipsed")
            if i >= len(fresh_tds):
                break
    
            elem = fresh_tds[i]
            # 滚动到视口并确保可点击
            driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", elem)
            wait.until(EC.element_to_be_clickable((By.XPATH, f"(//span[@class='ellipsed'])[{i+1}]")))
    
            # 使用 JavaScript 点击(绕过遮挡或 disabled 状态)
            driver.execute_script("arguments[0].click();", elem)
    
            # 等待新页面加载(公司详情页)
            wait.until(EC.url_contains("/stock/"))
            print(f"✅ 已跳转至:{driver.current_url}")
    
            # 【可选】返回上一页继续循环
            driver.back()
            wait.until(EC.url_contains("price-explorer"))
    
    finally:
        driver.quit()

    ⚠️ 关键注意事项

    • 勿依赖固定 XPath:答案中 /html/body/.../tr[1]/td[2]/span 易因页面结构更新而失效,应优先使用 CSS_SELECTOR + 类名组合,辅以 text() 或 contains() 定位;
    • *避免 `find_elementsby**:该方法在 Selenium 4+ 中已废弃,统一使用driver.find_elements(By.XXX, "...")`;
    • 慎用 time.sleep():仅在极少数异步状态同步场景下作为兜底(如 Cookie 点击后),主流程务必使用 WebDriverWait;
    • 处理多窗口:若需在新标签页操作,记得切换句柄:
      original_handle = driver.current_window_handle
      driver.switch_to.window(driver.window_handles[-1])
      # ...操作详情页...
      driver.close()
      driver.switch_to.window(original_handle)
    • 反爬提示:LSE 对高频请求敏感,生产环境建议添加 time.sleep(2–5) 及 User-Agent 轮换。

    ✅ 总结

    成功点击动态 td.clickable 的核心在于:先解封(Cookie)、再等待(真实数据就绪)、后定位(稳定选择器)、最后安全点击(JS 执行)。抛弃“找到即点”的直觉,拥抱显式等待与状态感知,才能让自动化脚本在现代 SPA 网站中稳定运行。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

898

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

766

2023.11.06

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不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

355

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的相关内容,可以阅读本专题下面的文章。

536

2024.01.03

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

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

17

2025.12.06

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

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

精品课程

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

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.2万人学习

CSS教程
CSS教程

共754课时 | 28.5万人学习

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

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