python - 如何使用 Selenium 和 Python 单击 svg 标记中的下拉按钮
问题描述
我有一个网站,我想下载一个 excel 文件。 https://www.rivm.nl/media/smap/eenzaamheid.html
我希望能够单击下载按钮,然后单击下载 xls。要单击第一个按钮,我尝试了以下操作:
WebDriverWait(driver, 10).until(EC.visibility_by_element_located(By.XPATH('//path[@d="M 11.6 5 L 11.6 17 M 7.4 12.6 L 11.6 17 L 15.799999999999999 12.6 M 3 19 L 3 21 L 21 21 L 21 19"]'))).click()
和
WebDriverWait(driver, 10).until(EC.visibility_by_element_located(By.XPATH('//path[@stroke-width="1.8"]'))).click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(By.XPATH('//g[@aria-label="View export menu"]'))).click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(By.XPATH('//g[@aria-label="Chart export menu"]'))).click()
对于最后两个我得到“'str' object is not callable”错误,前两个选项根本不起作用。
我似乎无法点击按钮。我真的找不到按钮的“id”或唯一的类/名称(打印按钮具有相同的类值),这会使这变得容易得多。
我想我也无法单击“XLS 下载”,因为我在这里也找不到 ID。
那么,我将如何单击第一个按钮,然后单击“XLS 下载”?
解决方案
所需的元素是一个svg元素,因此单击该元素而不是visibility_of_element_located()
您必须诱导WebDriverWait并且element_to_be_clickable()
您可以使用以下任一Locator Strategies:
使用
CSS_SELECTOR
:driver.get("https://www.rivm.nl/media/smap/eenzaamheid.html") WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.highcharts-container svg g[aria-label='View export menu'] rect"))).click()
使用
XPATH
:driver.get("https://www.rivm.nl/media/smap/eenzaamheid.html") WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='highcharts-container ']//*[name()='svg']//*[name()='g' and @aria-label='View export menu']//*[name()='rect']"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
浏览器快照:
参考
您可以在以下位置找到一些有关与 SVG 元素交互的相关讨论:
推荐阅读
- firebase-authentication - 尝试导入错误:“signInUserWithEmailAndPassword”未从“firebase/auth”导出
- java - java线程不一致
- php - Laravel 块返回少量数据 - Laravel
- python - 通过 os.system 调用奇异 exec 命令后执行 os.system python 命令
- php - 用于 HTTP POST 参数名称格式的 PHP 内置函数或库
- segmentation-fault - 为什么我在这两行收到 SEGV 错误?这些行可能有什么问题?
- javascript - SQL 过滤器 - 保护反对者注入
- node.js - 如何在用户与 socket.io 中的聊天室断开连接时显示消息
- azure - 如何在 Azure Pipeline 中调试 Playwright e2e 测试?
- .net - 将文件夹(包括子目录)中的所有文件添加为嵌入式资源?