Selenium 在python中按类名查找元素
Posted
技术标签:
【中文标题】Selenium 在python中按类名查找元素【英文标题】:Selenium Finding elements by class name in python 【发布时间】:2015-07-12 04:43:24 【问题描述】:如何过滤具有相同类的元素?
<html>
<body>
<p class="content">Link1.</p>
</body>
</html>
<html>
<body>
<p class="content">Link2.</p>
</body>
</html>
【问题讨论】:
您已经尝试过什么(代码)了吗?由于您是新手,请阅读我们的Tour page,尤其是How do I ask a good question?。 另外你的html代码格式不好。你没有关闭 标签。 你要对选中的元素做什么?您希望使用什么标准?你已经尝试过什么? 【参考方案1】:您可以尝试使用find_elements_by_class_name 获取带有class = "content"
的所有元素的列表:
a = driver.find_elements_by_class_name("content")
然后您可以点击您要查找的链接。
【讨论】:
返回类的所有元素还是返回第一个找到的元素? 如果立即重新分配a
,为什么还要将其初始化为空列表?
@keerthankumar 这个返回列表中的所有元素。要获得第一个使用find_element_by_class_name
python代码行末尾不需要分号。
现在选择类名后如何点击? .click()
属性不起作用!【参考方案2】:
根据 HTML:
<html>
<body>
<p class="content">Link1.</p>
</body>
<html>
<html>
<body>
<p class="content">Link2.</p>
</body>
<html>
两(2) 个<p>
元素具有相同的类content
。
所以要过滤具有相同类的元素,即content
并创建一个列表,您可以使用以下任一Locator Strategies:
使用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
参考文献
您可以在以下位置找到一些相关讨论:
How to identify an element through classname even though there are multiple elements with the same classnames using Selenium and Python Unable to locate element using className in Selenium and Java What are properties of find_element_by_class_name in selenium python? How to locate the last web element using classname attribute through Selenium and Python【讨论】:
类名和 css 选择器都不起作用,不知道为什么,但是 xpath 起作用了,非常感谢【参考方案3】:By.CLASS_NAME 尚未提及:
from selenium.webdriver.common.by import By
driver.find_element(By.CLASS_NAME, "content")
This is the list of attributes 可以在 By: 中用作定位器
CLASS_NAME
CSS_SELECTOR
ID
LINK_TEXT
NAME
PARTIAL_LINK_TEXT
TAG_NAME
XPATH
【讨论】:
【参考方案4】:最简单的方法是使用find_element_by_class_name('class_name')
【讨论】:
【参考方案5】:使用nth-child,例如:http://www.w3schools.com/cs-s-ref/sel_nth-child.asp
driver.find_element(By.CSS_SELECTOR, 'p.content:nth-child(1)')
或http://www.w3schools.com/cs-s-ref/sel_firstchild.asp
driver.find_element(By.CSS_SELECTOR, 'p.content:first-child')
【讨论】:
以上是关于Selenium 在python中按类名查找元素的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Java在Selenium WebDriver中按类名选择下拉值[重复]
Selenium / Python - 带有空格的类名无法本地元素