如何使用 Selenium 单击此项目?

How do I click on this item using Selenium?

我正在尝试使用 selenium 自动下载报告。要到达报告所在的页面,我必须单击带有此代码的图像

<div class="leaflet-marker-icon single-icon-container running hover asset leaflet-zoom-hide leaflet-clickable" tabindex="0" style="margin-left: -22px; margin-top: -41px; width: 44px; height: 44px; opacity: 1; transform: translate3d(525px, 238px, 0px); z-index: 238;"><div class="icon-value" lid="219058"></div></div>

我试过

wtg = driver.find_elements_by_class_name(
    "leaflet-marker-icon single-icon-container running hover asset leaflet-zoom-hide leaflet-clickable")
wtg.click()

但是没有任何反应。 有 7 个元素具有相同的 class,一个独特的“id”看起来像 lid="219058",但我不知道如何 select。

记住driver.find_elements_by_class_name() returns一个list

使用此 get/find 方法时,您必须这样做:

driver.find_elements_by_class_name('class')[0] #If you want the first of the page

在你的情况下,你需要使用 css_selector 因为你有多个 classes,就像@Prophet 所建议的那样。 您也可以仅使用 class 之一,而只需使用 class_name 选择器。

在你的情况下,如果你需要页面的第一个元素 class,你必须添加 [0].

leaflet-marker-icon single-icon-container running hover asset leaflet-zoom-hide leaflet-clickable 包含多个 class 名称,而 driver.find_element_by_class_name 方法旨在获取单个 class 名称。
我无法为该元素提供正确的定位器,因为您没有共享页面 link,但是如果您希望根据这些 class 名称组合定位该元素,您可以使用 CSS 选择器或 XPath 如下:

wtg = driver.find_element_by_css_selector(".leaflet-marker-icon.single-icon-container.running.hover.asset.leaflet-zoom-hide.leaflet-clickable")
wtg.click()

wtg = driver.find_element_by_xpath("//*[@class='leaflet-marker-icon single-icon-container running hover asset leaflet-zoom-hide leaflet-clickable']")
wtg.click()

您还应该使用 driver.find_element_by_class_name,而不是 driver.find_elements_by_class_name,因为 driver.find_elements_by_class_name 会给您一个网络元素列表,而不是可以直接点击的单个网络元素。
或者,您可以使用 FLAK-ZOSO

所描述的已接收 Web 元素列表中的第一个索引

一般来说,构建网络抓取工具的最佳做法是始终使用 xpath,因为 xpath 可以更灵活地应用所有过滤器(id、class 等)(尽管在某些情况下, selenium 的性能可能会降低)。

我建议你查看这篇关于如何为各种需求编写 xpath 的文章:https://www.softwaretestinghelp.com/xpath-writing-cheat-sheet-tutorial-examples/

对于您的特定用例,我会使用:

driver.find_element_by_xpath('//div[@lid="219058"]')

这实际上会点击内部 div(请注意盖子实际上是如何位于嵌套 div 内)。如果你想点击外面的 div 你可以使用:

driver.find_element_by_xpath('//div[@lid="219058"]/parent::div')

我再次建议您学习 Xpath 语法并始终使用它,它比其他 selenium 选择器更容易操作,而且如果您选择实现 C 编译的 html 解析器,它也更快作为 lxml 来解析元素。