如何点击highcharts中的SVG元素以使用Selenium下载文件

k5hmc34c  于 2022-11-10  发布在  Highcharts
关注(0)|答案(2)|浏览(176)

我的第一个问题与此相关。同时,我发现了一个效率较低的解决方案。我仍然希望自动下载这些文件。
我希望我的脚本点击下载图标,点击下载XLS图标,下面的页面。绿色箭头是我想点击的地方。
highchart的id在每次页面加载时都会改变。我试着用代码示例来修复它:

def unityengine_data():
    driver.get("https://steamdb.info/tech/Engine/Unity/")
    wait
    WebDriverWait(driver,30).until(EC.visibility_of_element_located((By.XPATH, "div[contains(@id,'highcharts-')]//*[local-name() = 'svg']/*[name()='g'][6]/*[name()='g']/*[name()='image']"))).click
    WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, "div[contains(@id,'highcharts-')]//**[local-name() = 'div']/*[name()='ul'][6]/*[name()='li'][2]"))).click
    os.rename("downloaded file path", "new file path")
    return "Unity Engine apps data successfully downloaded"

网站图像

第一次单击后的网站

我希望你能帮忙。

2izufjch

2izufjch1#

您只是在此行缺少//

WebDriverWait(driver,30).until(EC.visibility_of_element_located((By.XPATH, "div[contains(@id,'highcharts-')]//*[local-name() = 'svg']/*[name()='g'][6]/*[name()='g']/*[name()='image']"))).click

此外,理想情况下,应该创建WebDriverWait对象一次,然后在需要时重用它。
看下面的代码,我也改进了一个定位器。

代码:

driver.maximize_window()

wait = WebDriverWait(driver, 30)

driver.get("https://steamdb.info/tech/Engine/Unity/")
wait.until(EC.visibility_of_element_located((By.XPATH, "//div[contains(@id,'highcharts-')]//*[local-name() = 'svg']/*[name()='g'][6]/*[name()='g']/*[name()='image']"))).click()
wait.until(EC.visibility_of_element_located((By.XPATH, "//li[text()='Download XLS']"))).click()

进口:

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

vlurs2pr2#

你几乎做到了。你只需要三个小的调整和一个优化如下:

  • 您需要添加前导//以获得有效的xpath。
  • click是一个方法,因此您需要***click()***
  • *highchart图像 * 的xpath可以稍微优化一下。
  • 文本为***Download XLS***的元素在 * local-name * 空间内,因此不需要[local-name() = 'div']

您的有效代码块将是:

driver.get("https://steamdb.info/tech/Engine/Unity/")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@id,'highcharts-')]//*[local-name() = 'svg']//*[name()='g']//*[name()='image']"))).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//ul[@class='highcharts-menu']//li[text()='Download XLS']"))).click()

浏览器快照;

参考

您可以在以下位置找到相关的详细讨论:

相关问题