如何找到第二次出现的.find\u element\u by \u class\u name?

2024-04-24 22:06:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我试过了

browser.find_element_by_class_name('("my_class")[1]')
browser.find_element_by_class_name('("my_class")[position()=1]')
browser.find_element_by_class_name("my_class")[1]

Tags: namebrowserbymypositionelementfindclass
1条回答
网友
1楼 · 发布于 2024-04-24 22:06:57

“简单”的答案

获得所需内容的简单方法是使用已经在使用的locator方法的复数形式find_elements_by_class_name()。复数形式返回一个列表,而不是第一个匹配项,因此在您的例子中,您可以使用

find_elements_by_class_name("my_class")[1]

find_elements_*方法返回一个列表,末尾的[1]指定只返回集合中的第二个项(索引从0开始)。在


我会用什么

我通常不使用*_by_class_name(),因为我很少只寻找一个类。我通常至少还指定标记名,例如div.my_class。另一个选项,也是我通常使用的,是CSS选择器。CSS选择器应该优先于XPath,因为它具有更好的性能、更好的支持等。*

一个例子

^{pr2}$

如果您有上面的HTML并且想要“class1”的第二个实例,那么应该使用

driver.find_elements_by_css_selector("div.class1")[1]

CSS选择器相对于XPath的另一个优点是CSS选择器在元素的多个类名中查找类名,XPath只能执行文本搜索,这可能导致错误或缺少匹配。上面的CSS选择器将返回总共4个元素:“123”、“12”、“13”、“1”。索引[1]只返回第二个实例“12”。在

如果您使用了DebanjanB建议的XPath

//*[@class='my_class'][position()=2]

不会有任何回报。因为只有一个“类”是字符串。它忽略了所有其他元素,这些元素包含但不只是“我的类”。您可以改进它来找到它们,但是它仍然有XPath和CSS选择器的所有缺点,它要长得多,等等。。。在

有关查找元素方法的详细信息,请参阅Selenium-python docs。在

*如果您需要更多关于原因的详细信息,已经有很多文章在讨论这个问题,或者浏览一下Selenium Conference YT channel上的视频,并观看Simon Stewart或其他Selenium撰稿人的主题演讲。在


别忘了

  1. 如果页面加载缓慢,则可能需要使用等待。在
  2. 在一些延迟加载页面上,您需要滚动页面以获取要加载的其他元素。在

相关问题 更多 >