在 Python 中使用 Selenium 通过类名查找元素
- 2025-03-05 09:14:00
- admin 原创
- 38
问题描述:
如何过滤具有相同类别的元素?
<html>
<body>
<p class="content">Link1.</p>
</body>
</html>
<html>
<body>
<p class="content">Link2.</p>
</body>
</html>
解决方案 1:
class = "content"
您可以尝试使用find_elements_by_class_name获取所有元素的列表:
a = driver.find_elements_by_class_name("content")
然后您可以单击您正在寻找的链接。
解决方案 2:
By.CLASS_NAME尚未提及:
from selenium.webdriver.common.by import By
driver.find_element(By.CLASS_NAME, "content")
这是可用作定位器的属性列表:
CLASS_NAME
CSS_SELECTOR
ID
LINK_TEXT
NAME
PARTIAL_LINK_TEXT
TAG_NAME
XPATH
解决方案 3:
根据 HTML:
<html>
<body>
<p class="content">Link1.</p>
</body>
<html>
<html>
<body>
<p class="content">Link2.</p>
</body>
<html>
两 (2) 个<p>
元素属于同一类content
。
因此,要过滤具有相同类的元素content
并创建列表,您可以使用以下任一定位器策略:
使用
class_name
:
elements = driver.find_elements_by_class_name("content")
使用
css_selector
:
elements = driver.find_elements_by_css_selector(".content")
使用
xpath
:
elements = driver.find_elements_by_xpath("//*[@class='content']")
理想情况下,要单击元素,您需要诱导WebDriverWait,visibility_of_all_elements_located()
并且您可以使用以下任一定位器策略:
使用
CLASS_NAME
:
elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, "content")))
使用
CSS_SELECTOR
:
elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".content")))
使用
XPATH
:
elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//*[@class='content']")))
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
参考
您可以在以下位置找到几个相关的讨论:
如何使用 Selenium 和 Python 通过类名识别元素,即使有多个具有相同类名的元素
无法在 Selenium 和 Java 中使用 className 定位元素
selenium python 中 find_element_by_class_name 的属性是什么?
如何通过 Selenium 和 Python 使用 classname 属性定位最后一个 Web 元素
解决方案 4:
使用 nth-child,例如:http://www.w3schools.com/cssref/sel_nth-child.asp
driver.find_element(By.CSS_SELECTOR, 'p.content:nth-child(1)')
或http://www.w3schools.com/cssref/sel_firstchild.asp
driver.find_element(By.CSS_SELECTOR, 'p.content:first-child')
解决方案 5:
最简单的方法是使用find_element_by_class_name('class_name')
解决方案 6:
第一个答案已被弃用,其他答案仅返回一个结果。这是正确答案:
driver.find_elements(By.CLASS_NAME, "content")
解决方案 7:
问题与“元素”复数有关,大多数与元素有关。要等待元素然后迭代每个元素:
selectableEls = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, "content")))
for el in selectableEls:
print(el)
解决方案 8:
在 Python 中,Selenium 提供了一种名为 find_elements_by_class_name 的方法来查找具有相同类名的元素。此方法返回与提供的类名匹配的所有元素的列表。
假设你试图查找所有段落(
) 类为“content”。具体操作如下:
从 selenium 导入 webdriver
初始化驱动程序
driver = webdriver.Firefox() # 用你选择的浏览器驱动程序替换
导航到您的网页
driver.get('https://www.softwaretestingsapiens.com/finding-elements-by-class-name-with-selenium-in-python/')
按类名查找元素
元素 = 驱动程序.find_elements_by_class_name('内容')
对于元素中的 el:打印(el.text)
此脚本将打印每个
带有“content”类的标签。在您的例子中,它应该打印“Link1。”和“Link2。”。
请记住,Selenium需要特定的驱动程序才能与所选浏览器交互。Firefox 需要 geckodriver,需要先安装该驱动程序才能运行上述脚本。
另外,请记住,即使只有一个匹配项,find_elements_by_class_name 也会返回一个列表。如果您确定只有一个感兴趣的元素,请使用 find_element_by_class_name(请注意“element”中没有“s”)直接获取 WebElement。
最后,建议在脚本中添加一些错误处理来处理未找到元素的情况。这将使您的代码更加健壮且更易于调试。
祝你编码愉快!