首页 > 编程问答 >尝试使用 Selenium 选择 svg 时出现 NoSuchElementExists

尝试使用 Selenium 选择 svg 时出现 NoSuchElementExists

时间:2024-07-24 07:21:35浏览次数:8  
标签:python selenium-webdriver svg

我有很多文件要下载,所以我尝试使用 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

相关文章

  • Python使用Visual Studio打印功能不显示输出
    任务:检查一个整数是正数还是负数。检查整数是否能被2整除。当输入0时,我需要退出循环并报告每个计数和总和。print函数没有显示任何输出。这是我从defmain()开始使用的代码defmain():countpositive=0countnegative=0count_divisible_by_2=0sump......
  • Python 中的像素最小二乘法
    我有一个非线性前向模型,它计算每个像素参数w的灰度图像。我还可以使用scipys优化函数来反转模型。我目前遇到的唯一问题是图像的大小使得这个解决方案非常慢...比如7%的像素在40分钟内计算得很慢。我使用for循环遍历所有像素并按像素应用模型。我尝试过......
  • SQL 命令在手动运行时工作正常(SQL Developer),但在 Python 的 oracledb 模块中给出 ORA-
    我正在使用OracleSQL数据库,并且我想运行该命令ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DD';当我从SQLDeveloper应用程序手动运行它时,它工作正常。但是,当我使用oracledb模块从Python运行它时,出现以下错误:ErrorrunningSQLscript:ORA-00922:mi......
  • 在pip包中分发pythonnet dll类型信息
    我已经能够使用C#通过以下方式加载pythonnetdll:fromimportlib.resourcesimportpathimportsys#Assuming'my_package.lib'isthesub-packagecontainingtheDLLswithpath('pyrp.lib','')aslib_path:sys.path.append......
  • 尝试使用 pyinstaller 将 python 文件转换为可执行文件时出现 TypeError
    稍后的目的是通过命令行向GPT4all发送问题并将答案存储在文本文档中。我想将阻止代码转换为exe,但它产生了TypeError。这是到目前为止的代码:fromgpt4allimportGPT4Allmodel=GPT4All("Meta-Llama-3-8B-Instruct.Q4_0.gguf",device='cpu')#downloads/loads......
  • 使用 Python-PlexAPI 获取 plex 上所有好友的关注列表
    有关如何接收我的plex服务器上所有用户的监视列表的任何提示。我正在根据一些规则创建自动删除,其中一个规则是,如果电影位于用户观看列表中,则不应删除该电影。我遇到了麻烦,因为所有与观看列表相关的内容都在MyPlexAccount上。lexapi.myplex.MyPlexAccount具有我的用......
  • 如何在 Python 中查看与 Azure OpenAI 助手关联的所有上传文件?
    我正在使用Python对文档中的问题进行基准测试,并在jupyter笔记本中实例化了我的助手。我想确认助手是否有我上传的文件,但似乎找不到有关此功能将使用什么功能的文档。使用适用于AzureOpenAI的最新版本的PythonAPI。目前,无法使用AzureOpenAI的PythonAPI直接查看......
  • 如何在Python中计算小数?
    我正在创建一个计算器来用python计算企业的利润,但到目前为止我只能使用整数。这是我的代码示例:Gross=int(input("PleaseentertotalGrossRevenuefortheFiscalYear"))NetTaxes=int(Gross)*0.1所以我将会计年度的总收入乘以按“税率”计算,但我只能使用......
  • 如何使用 Python 打开 Google Firestore 上的特定数据库?
    我正在使用Firebase并使用以下代码从Firestore设置/检索文档:importfirebase_adminfromfirebase_adminimportcredentials,firestorecred=credentials.ApplicationDefault()firebase_admin.initialize_app(cred,options={"projectId":"huq-jimbo"})fires......
  • 如何使用 Python 和 Numpy 重现 Matlab 文件读取以解码 .dat 文件?
    我有一个Matlab脚本,可以读取编码的.dat文件,对其进行解码并保存。我试图使用numpy将其转换为Python。我发现对于同一个文件,我得到不同的输出结果(python数字没有意义)。该代码最初作为从串行端口读取的脚本的一部分运行,因此是数据的结构。我首先认为位移是问题所在,因为......