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

使用Python Selenium操作Chart JS按钮失败求助

问题描述

我尝试在网页https://icomarks.com/ico/online上点击Chart JS图表中的“All”按钮,先后使用XPath、完整XPath以及JS路径尝试点击,但均未成功。以下是我的尝试代码:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url='https://icomarks.com/ico/online'

driver = webdriver.Chrome()
driver.get(url)

# xpath
button = WebDriverWait(driver, 3).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="highcharts-34i2crn-1324"]/svg/g[23]/g[1]/g[7]')))
button.click()

# full xpath
button = WebDriverWait(driver, 3).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[4]/div/div[1]/div[2]/div/div[2]/svg/g[23]/g[1]/g[7]')))
button.click()

# JS path
element=driver.execute_script('return document.querySelector("#highcharts-7gub67p-1324 > svg > g.highcharts-range-selector-group > g.highcharts-range-selector-buttons > g.highcharts-no-tooltip.highcharts-button.highcharts-button-pressed")')
driver.execute_script("arguments[0].click();", element)

问题分析

你的定位方式失效的核心原因:

  • Highcharts生成的元素ID(如highcharts-34i2crn-1324)是动态随机生成的,每次页面加载都会变化
  • 直接依赖g元素的索引(如g[23])不可靠,索引会随图表配置、窗口尺寸变化而改变

解决方案

方案1:通过按钮文本定位(稳定可靠)

利用SVG中“All”文本元素,定位其可点击的父级g容器:

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 import webdriver

url='https://icomarks.com/ico/online'

driver = webdriver.Chrome()
driver.get(url)

# 等待元素加载并点击
all_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable(
        (By.XPATH, '//g[contains(@class, "highcharts-button")]//text[contains(text(), "All")]/parent::*/parent::g')
    )
)
all_button.click()

方案2:通过Highcharts固定类名定位

利用Highcharts范围选择器的固定类名组合定位:

all_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable(
        (By.CSS_SELECTOR, 'g.highcharts-range-selector-buttons g.highcharts-button')
    )
)
all_button.click()

若“All”默认是选中状态,可追加类名过滤:g.highcharts-button-pressed

方案3:调用Highcharts API直接触发(最稳定)

跳过DOM定位,直接通过Highcharts内置API触发按钮点击:

driver.execute_script("""
    // 获取页面第一个Highcharts图表实例(多图表需调整索引)
    const chart = Highcharts.charts[0];
    // 触发最后一个范围选择按钮(即"All")
    chart.rangeSelector.clickButton(chart.rangeSelector.buttons.length - 1);
""")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:05:17