我有很多文件要下载,所以我尝试使用 python 和 Selenium 使其自动化。 (访问网站的 API 不是一个选项;如果可以的话我会这样做。)
我无法让脚本找到的唯一元素是实际的下载按钮。 (无论使用哪种方法来识别它,我都会收到“NoSuchElementExists”错误。)
这是带有两个按钮的父元素。 第二个是我想要选择的。
<div class="Transactions_csvButtonsContainer__dhv_J">
<svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
<rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
<path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
</svg>
<svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line>
</svg>
</div>
我已在 Firefox 和 Chrome 中进入 F12 开发人员模式,并复制了该元素的 XPATH 和 CSS 选择器查询,并将它们粘贴到以下代码中:
download_button = driver.find_element(by=By.XPATH, value=
"//*[@id='__next']/div/div[3]/div[1]/a[1]/div/div[1]/div[2]/svg[2]")
download_button = driver.find_element(by=By.CSS_SELECTOR, value=
"div.Transactions_bubblesAndCSVContainer__RxEX5: nth - child(1) > div:nth - child(2) > svg: nth - child(2)")
I'我对这两种方法都不感兴趣,因为它们非常脆弱。 父元素 (div) 不可交互。 我怎样才能让这个脚本识别下载按钮?
在使用 Selenium 选择 SVG 元素时遇到问题,这是因为尝试通过 XPATH 或 CSS 选择器定位的元素实际上是 SVG 元素 内部 的路径和形状,而不是元素本身。
以下是如何使用 Selenium 选择和与 SVG 元素交互的方法:
1. 通过父级定位 SVG 元素并使用
.find_element_by_tag_name()
:
- 首先,使用 XPATH 或 CSS 选择器定位到包含 SVG 元素的父 div。
-
然后,使用
find_element_by_tag_name()
方法选择第二个 SVG 元素。
# 定位到父 div
parent_div = driver.find_element(By.CSS_SELECTOR, "div.Transactions_csvButtonsContainer__dhv_J")
# 选择第二个 SVG 元素
download_button = parent_div.find_elements(By.TAG_NAME, "svg")[1]
# 点击下载按钮
download_button.click()
2. 使用更具体的 XPATH 来定位 SVG 元素:
- 可以创建一个更具体的 XPATH,直接指向第二个 SVG 元素,而无需依赖于子元素。
download_button = driver.find_element(By.XPATH, "(//div[@class='Transactions_csvButtonsContainer__dhv_J']//svg)[2]")
# 点击下载按钮
download_button.click()
解释:
-
//div[@class='...']//svg
选择该类名下的所有 div 元素内的所有 SVG 元素。 -
(...)[2]
选择结果列表中的第二个 SVG 元素。
重要提示:
- 确保提供正确的类名和 XPATH。
- 如果页面结构发生变化,可能需要更新选择器。
- 在执行操作(例如点击)之前,考虑添加显式等待,以确保元素已加载并可交互。
希望这些解决方案可以帮助成功选择并与 SVG 下载按钮交互!
标签:python,selenium-webdriver,svg From: 78785879