2024-04-24 22:06:57 发布
网友
我试过了
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]
获得所需内容的简单方法是使用已经在使用的locator方法的复数形式find_elements_by_class_name()。复数形式返回一个列表,而不是第一个匹配项,因此在您的例子中,您可以使用
find_elements_by_class_name()
find_elements_by_class_name("my_class")[1]
find_elements_*方法返回一个列表,末尾的[1]指定只返回集合中的第二个项(索引从0开始)。在
find_elements_*
[1]
我通常不使用*_by_class_name(),因为我很少只寻找一个类。我通常至少还指定标记名,例如div.my_class。另一个选项,也是我通常使用的,是CSS选择器。CSS选择器应该优先于XPath,因为它具有更好的性能、更好的支持等。*
*_by_class_name()
div.my_class
一个例子
如果您有上面的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撰稿人的主题演讲。在
“简单”的答案
获得所需内容的简单方法是使用已经在使用的locator方法的复数形式
find_elements_by_class_name()
。复数形式返回一个列表,而不是第一个匹配项,因此在您的例子中,您可以使用find_elements_*
方法返回一个列表,末尾的[1]
指定只返回集合中的第二个项(索引从0开始)。在我会用什么
我通常不使用
*_by_class_name()
,因为我很少只寻找一个类。我通常至少还指定标记名,例如div.my_class
。另一个选项,也是我通常使用的,是CSS选择器。CSS选择器应该优先于XPath,因为它具有更好的性能、更好的支持等。*一个例子
^{pr2}$如果您有上面的HTML并且想要“class1”的第二个实例,那么应该使用
CSS选择器相对于XPath的另一个优点是CSS选择器在元素的多个类名中查找类名,XPath只能执行文本搜索,这可能导致错误或缺少匹配。上面的CSS选择器将返回总共4个元素:“123”、“12”、“13”、“1”。索引
[1]
只返回第二个实例“12”。在如果您使用了DebanjanB建议的XPath
不会有任何回报。因为只有一个“类”是字符串。它忽略了所有其他元素,这些元素包含但不只是“我的类”。您可以改进它来找到它们,但是它仍然有XPath和CSS选择器的所有缺点,它要长得多,等等。。。在
有关查找元素方法的详细信息,请参阅Selenium-python docs。在
*如果您需要更多关于原因的详细信息,已经有很多文章在讨论这个问题,或者浏览一下Selenium Conference YT channel上的视频,并观看Simon Stewart或其他Selenium撰稿人的主题演讲。在
别忘了
相关问题 更多 >
编程相关推荐