不允许使用Selenium Compound类名

时间:2016-06-12 07:01:19

标签: python selenium

我有下面的代码点击一个元素来弹出一个屏幕并复制其中的文字

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来点击关闭按钮?

4 个答案:

答案 0 :(得分:39)

Leon's comment可以获得不再支持复合类名称的正确信息。你可以做的是尝试使用css选择器。在您的情况下,以下代码行应该可以帮助您获得所需的元素:

el3 = driver.find_element_by_css_selector(".action-btn.cancel.alert-display")

它在类属性中找到包含所有三个类(action-btn,cancel和alert-display)的元素。请注意,类的顺序在这里无关紧要,任何类都可以出现在class属性的任何位置。只要元素具有所有三个类,它就会被选中。 如果要修复类的顺序,可以使用以下xpath:

el3 = driver.find_element_by_xpath("//*[@class='action-btn cancel alert-display']") 

答案 1 :(得分:2)

我迟到了这个问题。但是,当您不熟悉Xpath时,我还发现了使用tag_name和get_attribute(&#39; class&#39;)将复合类视为String的方法。它需要更多的代码,但它很直接,适合像我这样的初学者。

import matplotlib
matplotlib.style.use('ggplot')

...
graph_df = df['Gender'].value_counts().rename('df').to_frame()\
               .join(signed['Gender'].value_counts().rename('signed').to_frame())

graph_df.plot(kind='bar',figsize=(8, 4))

答案 2 :(得分:0)

这里的答案不正确:

如果从 by_class_name 中检查异常:

enter image description here

你可以看到它在后台使用了 css

by_class_name 只是添加了 '.'在提供的定位器前面,因此 'a' 将作为 '.a' 传递,而 a.b 将作为 '.a.b' 传递

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

所以“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("https://stackoverflow.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"))

答案 3 :(得分:0)

这个错误信息...

invalid selector: Compound class names not permitted

...暗示使用 locator strategiesCompound class names 在使用 Selenium 时无效。

可以从 Selenium v2.40.0 changelist 中确认此更改的痕迹,其中更改日志提到为复合类名称使用添加正确的错误代码:

<块引用>
  • 针对无效的 css 选择器空类名和原子中的复合类名的情况实施了正确的错误代码。

解决方案

作为替代,您可以使用以下任一 Locator Strategies

  • 使用 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()
    

参考文献

您可以在以下位置找到一些相关的详细讨论: