如何使用 Selenium 和 Python 定位具有多个类名的元素

Posted

技术标签:

【中文标题】如何使用 Selenium 和 Python 定位具有多个类名的元素【英文标题】:How to locate an element with multiple classnames using Selenium and Python 【发布时间】:2020-06-17 10:17:32 【问题描述】:

我正在尝试单击类名等于"clean right" 的以下元素:

<li class="clean right"></li>

如何使用driver.find_element_by_class_name()找到它

【问题讨论】:

必须是'clean.right' 你有没有尝试过,做过什么研究? 这能回答你的问题吗? Selenium Compound class names not permitted 【参考方案1】:

您不能通过find_element_by_class_name() 传递多个类名作为参数,这样做您将面临如下错误:

invalid selector: Compound class names not permitted

有多种方法可以解决此用例,您可以使用以下任一Locator Strategies:

如果元素仅通过classname 唯一标识clean,您可以使用:

driver.find_element_by_class_name("clean")

如果元素仅通过classname 唯一标识right,您可以使用:

driver.find_element_by_class_name("right")

如果classnamescleanright都是强制标识元素,您可以使用css-selectors,如下所示:

driver.find_element_by_css_selector("li.clean.right")

您也可以使用xpath,如下所示:

driver.find_element_by_xpath("//li[@class='clean right']")

tl;博士

Invalid selector: Compound class names not permitted error using Selenium


参考

Find div element by multiple class names?

【讨论】:

【参考方案2】:

前面的答案部分不正确。请查看源代码:

https://github.com/SeleniumHQ/selenium/blob/9160de55af9cc230f758f4ce6a2af8d1570f0614/py/selenium/webdriver/remote/webdriver.py

你可以对多个类使用class_name,只需要用'.'替换空格

使用带空格的类的示例:

from selenium import webdriver
from time import sleep

options = webdriver.ChromeOptions()
#options.headless = True
options.add_argument("--window-size=1920,1080")
options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_argument(
    "user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/87.0.4280.88 Safari/537.36")
browser = webdriver.Chrome(options=options)
browser.get("https://www.instagram.com")
sleep(5)
#browser.refresh()
elem=browser.find_element_by_class_name('RP4i1.UVauz')
print(elem.get_attribute("outerHTML"))
browser.get_screenshot_as_file(f"screenshot.png")

输出:

<img class="RP4i1  UVauz" src="/static/images/homepage/screenshot1.jpg/d6bf0c928b5a.jpg" >

如果您从 by_class_name 中检查异常:

您可以看到它在后台使用 css_class 定位器(您可以看到它在前面自动添加 .)

另一个工作示例:

from selenium import webdriver

import time

from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://***.com/questions/65579491/find-element-by-class-name-in-selenium-giving-error/65579606?noredirect=1#comment115946541_65579606")
time.sleep(5)
elem = driver.find_element_by_class_name('overflow-x-auto.ml-auto.-secondary.grid.ai-center.list-reset.h100')

print(elem.get_attribute("outerHTML"))

【讨论】:

我不得不否决这个答案,因为这个答案在概念上是错误的。你完全搞乱了定位器的概念。 @DebanjanB 你能解释一下为什么吗? @DebanjanB 你认为答案在哪个级别是错误的? 答案也提供了一个工作示例 by_class_name 只是添加了 '.'在提供的定位器前面,因此“a”将作为 .a 传递,a.b 将作为“.a.b”传递

以上是关于如何使用 Selenium 和 Python 定位具有多个类名的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Selenium WebDriver 和 Python 定位用户名和密码元素

如何使用 selenium (Python) 定位 Instagram 关注按钮

python selenium+ie 如何定位js生成的元素?

Python + Selenium网页元素定位id 定位

如何在使用 Selenium Python 之前定位伪元素 ::before

Selenium2+Python3.6实战:定位下拉菜单出错,如何解决?用select或xpath定位。