highcharts 使用Python Selenium与Chart JS交互

omvjsjqw  于 2023-05-17  发布在  Highcharts
关注(0)|答案(2)|浏览(165)

我试图按下网页https://icomarks.com/ico/online上的这个图表JS上的按钮。我尝试了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)
kt06eoxx

kt06eoxx1#

与常规HTML元素相比,Selenium中的SVG元素需要一种不同的方法来定位它们,因为它们是使用XML而不是HTML构建的。为了找到SVG元素,我们可以使用name()xpath函数
对于svg中的元素,你可以像下面这样构建一个xpath,然后点击它们。下面所有可以使用的按钮

button=driver.find_element(By.XPATH,
                     '//div[@class="companyGraph"]//div[@class="highcharts-container "]//*[name()="g" and '
                     '@class="highcharts-range-selector-group"]//*[name()="text" and text()="All"]')

完整的代码,你可以通过改变文本值来改变下面的点击选项

from selenium import webdriver
from selenium.webdriver.common.by import By

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

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

valueToClick = "3m"
button = driver.find_element(By.XPATH,
                             '//div[@class="companyGraph"]//div[@class="highcharts-container "]//*[name()="g" and '
                             f'@class="highcharts-range-selector-group"]//*[name()="text" and text()="{valueToClick}"]')
button.click()
rxztt3cl

rxztt3cl2#

Highcharts为容器创建了一个动态id,所以使用类似highcharts-34i2crn-1324的东西不会帮助找到合适的元素。
但是,您可以使用全局变量Highcharts访问按钮和其他图表属性。例如:

Highcharts.charts[1].rangeSelector.buttons[5].element.dispatchEvent(new Event('click'));

相关问题