不允许使用硒化合物 class 名称
Selenium Compound class names not permitted
我有下面的代码,点击一个元素弹出一个屏幕并复制其中的文本
el1 = driver.find_element_by_id("keyDev-A")
el1.click()
el2 = driver.find_element_by_class_name("content")
print(el2.text)
但是,当我试图让 selenium
使用
单击该弹出窗口中的按钮时
el3 = driver.find_element(By.CLASS_NAME, "action-btn cancel alert-display")
el3.click()
它产生一条错误消息:
invalid selector: Compound class names not permitted
这是我想让 selenium
点击的 HTML。 Close
按钮。
<div class="nav">
<span class="action-btn confirm prompt-display">Confirm</span>
<span class="action-btn cancel prompt-display">Cancel</span>
<span class="action-btn cancel alert-display">Close</span>
</div>
我应该如何编写 el3
才能单击 关闭 按钮?
导致不再支持复合 class 名称的正确信息。你可以做的是尝试使用 css 选择器。在您的情况下,以下代码行应该可以帮助您获得所需的元素:
el3 = driver.find_element_by_css_selector(".action-btn.cancel.alert-display")
它在 class 属性中找到具有所有三个 classes(action-btn、cancel 和 alert-display)的元素。请注意,classes 的顺序在这里无关紧要,任何 classes 都可能出现在 class 属性中的任何位置。只要该元素具有所有三个 class ,它就会被选中。
如果你想固定 classes 的顺序,你可以使用下面的 xpath :
el3 = driver.find_element_by_xpath("//*[@class='action-btn cancel alert-display']")
我迟到了这个问题。但我还找到了一个变通方法,当您不熟悉 Xpath 时,使用 tag_name 和 get_attribute('class') 将复合 类 视为字符串。它需要更多行代码,但它很简单,适合像我这样的初学者。
elements = driver.find_elements_by_tag_name('Tag Name Here')
for element in elments:
className = watchingTable.get_attribute('class')
print(className)
if className == 'Your Needed Classname':
#Do your things
此处答案不正确:
如果您检查 by_class_name 中的异常:
你可以看到它在后台使用 css
by_class_name 只是添加 '.'在提供的定位器前面,因此 'a' 将作为 '.a' 传递,a.b 将作为 '.a.b'
传递
所以你可以对多个 类 使用 class_name ,只需要将 space 替换为 '.'
所以“a b c”应该被传递为“a.b.c”
例如:
工作示例:
from selenium import webdriver
import time
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("
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"))
这个错误信息...
invalid selector: Compound class names not permitted
...意味着 using are not valid while using .
可以从 Selenium v2.40.0 changelist 中确认此更改的痕迹,其中更改日志提到有关为化合物 class 名称用法添加正确的错误代码:
- Implemented proper error code for the case of invalid css selector empty class name, and compound class name in atoms.
解决方案
作为替代方案,您可以使用以下任一方法 :
使用CSS_SELECTOR
:
driver.find_element(By.CSS_SELECTOR, "span.action-btn.cancel.alert-display").click()
使用XPATH
:
driver.find_element(By.XPATH, "//span[@class='action-btn cancel alert-display']").click()
参考资料
您可以在以下位置找到一些相关的详细讨论:
我有下面的代码,点击一个元素弹出一个屏幕并复制其中的文本
el1 = driver.find_element_by_id("keyDev-A")
el1.click()
el2 = driver.find_element_by_class_name("content")
print(el2.text)
但是,当我试图让 selenium
使用
el3 = driver.find_element(By.CLASS_NAME, "action-btn cancel alert-display")
el3.click()
它产生一条错误消息:
invalid selector: Compound class names not permitted
这是我想让 selenium
点击的 HTML。 Close
按钮。
<div class="nav">
<span class="action-btn confirm prompt-display">Confirm</span>
<span class="action-btn cancel prompt-display">Cancel</span>
<span class="action-btn cancel alert-display">Close</span>
</div>
我应该如何编写 el3
才能单击 关闭 按钮?
el3 = driver.find_element_by_css_selector(".action-btn.cancel.alert-display")
它在 class 属性中找到具有所有三个 classes(action-btn、cancel 和 alert-display)的元素。请注意,classes 的顺序在这里无关紧要,任何 classes 都可能出现在 class 属性中的任何位置。只要该元素具有所有三个 class ,它就会被选中。 如果你想固定 classes 的顺序,你可以使用下面的 xpath :
el3 = driver.find_element_by_xpath("//*[@class='action-btn cancel alert-display']")
我迟到了这个问题。但我还找到了一个变通方法,当您不熟悉 Xpath 时,使用 tag_name 和 get_attribute('class') 将复合 类 视为字符串。它需要更多行代码,但它很简单,适合像我这样的初学者。
elements = driver.find_elements_by_tag_name('Tag Name Here')
for element in elments:
className = watchingTable.get_attribute('class')
print(className)
if className == 'Your Needed Classname':
#Do your things
此处答案不正确:
如果您检查 by_class_name 中的异常:
你可以看到它在后台使用 css
by_class_name 只是添加 '.'在提供的定位器前面,因此 'a' 将作为 '.a' 传递,a.b 将作为 '.a.b'
传递所以你可以对多个 类 使用 class_name ,只需要将 space 替换为 '.'
所以“a b c”应该被传递为“a.b.c”
例如:
工作示例:
from selenium import webdriver
import time
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("
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"))
这个错误信息...
invalid selector: Compound class names not permitted
...意味着
可以从 Selenium v2.40.0 changelist 中确认此更改的痕迹,其中更改日志提到有关为化合物 class 名称用法添加正确的错误代码:
- Implemented proper error code for the case of invalid css selector empty class name, and compound class name in atoms.
解决方案
作为替代方案,您可以使用以下任一方法
使用
CSS_SELECTOR
:driver.find_element(By.CSS_SELECTOR, "span.action-btn.cancel.alert-display").click()
使用
XPATH
:driver.find_element(By.XPATH, "//span[@class='action-btn cancel alert-display']").click()
参考资料
您可以在以下位置找到一些相关的详细讨论: