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

Python+Selenium点击span下拉菜单选择ISO time失败求助

问题描述

我正尝试用Python+Selenium在TradingView的导出图表菜单里选择「ISO time」选项,但点击操作始终失败,而且Selenium的Select方法对这种基于<span>的自定义下拉菜单完全不适用。

相关HTML结构(ISO time选中状态):

<span id="time-format-select" role="button" class="container-WDZ0PRNh intent-default-WDZ0PRNh border-thin-WDZ0PRNh size-medium-WDZ0PRNh adjust-position-WDZ0PRNh first-row-WDZ0PRNh first-col-WDZ0PRNh button-tFul0OhX dropdown-NQ10filh" tabindex="0" data-role="listbox" aria-expanded="false" aria-haspopup="listbox" aria-labelledby="time-format-select">
    <span class="inner-slot-W53jtLjw inner-middle-slot-W53jtLjw">
        <span class="button-children-tFul0OhX">
            <span>ISO time</span>
        </span>
    </span>
<span class="inner-slot-W53jtLjw interactive-W53jtLjw">
    <span class="button-fy1qDthb">
        <span class="icon-fy1qDthb">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11 7" width="11" height="7" fill="none">
                <path stroke="currentColor" stroke-width="1.3" d="M.5 1.5l5 4 5-4"></path>
            </svg>
        </span>
    </span>
</span>
    <span class="highlight-WDZ0PRNh"></span>
</span>

我当前的代码片段:

from msedge.selenium_tools import Edge, EdgeOptions
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select , WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

options = EdgeOptions()
options.use_chromium = True
browser = Edge(executable_path=path_to_webdriver, options=options)
browser.get('the page I want to scrape')

#[...其他代码...]

# 点击下拉箭头展开菜单(这一步能成功)
Menu_Arrow_Down = '/html/body/div[8]/div/div/div[1]/div/div[2]/div/div[3]/span/span[2]'
open_menu = browser.find_element_by_xpath(Menu_Arrow_Down)
open_menu.click()
time.sleep(3)

# 尝试点击选择ISO time,但失败
Select_ISO_Time = '/html/body/div[8]/div/div/div[1]/div/div[2]/div/div[3]/span/span[1]/span/span'
ISO_option = browser.find_element_by_xpath(Select_ISO_Time)
ISO_option.click()

# 我用的都是绝对XPATH:
Timeformat_select_container = '/html/body/div[8]/div/div/div[1]/div/div[2]/div/div[3]/span'
Inner_slot = '/html/body/div[8]/div/div/div[1]/div/div[2]/div/div[3]/span/span[1]'
Button_children = '/html/body/div[8]/div/div[1]/div/div[2]/div/div[3]/span/span[1]/span'
ISO_time_span = '/html/body/div[8]/div/div/div[1]/div/div[2]/div/div[3]/span/span[1]/span/span'
问题根源
  1. 绝对XPATH不稳定:依赖页面DOM层级,一旦页面结构微调(比如弹窗、元素顺序变化)就会失效
  2. 等待逻辑不合理:用time.sleep()硬等,无法保证元素完全加载可点击
  3. 定位对象错误:你点击的是当前显示的文本容器,而非展开后的下拉选项;而且Select只支持原生<select>标签,对自定义下拉无效
解决方案

改用相对定位+显式等待,模拟真实用户操作逻辑:

from msedge.selenium_tools import Edge, EdgeOptions
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

options = EdgeOptions()
options.use_chromium = True
browser = Edge(executable_path=path_to_webdriver, options=options)
browser.get('https://www.tradingview.com/chart/BlxZCwOJ/?symbol=CBOT%3AZQJ2023')
wait = WebDriverWait(browser, 10)  # 10秒超时等待

# 1. 点击右上角更多菜单箭头
more_menu = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[aria-label="More"]')))
more_menu.click()

# 2. 点击「导出图表」选项
export_chart = wait.until(EC.element_to_be_clickable((By.XPATH, '//span[text()="导出图表"]')))
export_chart.click()

# 3. 点击时间格式下拉容器(而非单独箭头,更稳定)
time_format_dropdown = wait.until(EC.element_to_be_clickable((By.ID, 'time-format-select')))
time_format_dropdown.click()

# 4. 等待下拉选项列表加载,点击「ISO time」
iso_time_option = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[@role="listbox"]//span[text()="ISO time"]')))
iso_time_option.click()
关键优化点
  • 用WebDriverWait显式等待元素可点击,替代time.sleep(),适配页面加载速度
  • 用元素属性(如id、文本内容)做相对定位,不受DOM层级变化影响
  • 展开下拉后,选项会被渲染到带role="listbox"的容器中,直接定位该容器内的「ISO time」文本
  • 点击整个下拉容器而非单独箭头,和用户实际操作逻辑一致,避免定位偏差

内容的提问来源于stack exchange,提问作者Liscivia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:24:56