Selenium python find_element_by_class_name()从v 2.2到2.21停止工作 - 不能使用'Compound Class Name'

时间:2012-05-18 19:54:35

标签: python selenium webdriver

我正在使用Selenium的python库从Firefox中的html页面中抓取数据。

我必须从Selenium 2.0更新到2.21,因为服务器已经更新了Firefox。

在v 2.21中,对find_element_by_class_name("grid-cell-inner grid-col-name")的调用失败了:

selenium.common.exceptions.WebDriverException: Message: u'Compound class names not permitted'

我尝试访问的元素的类名是grid-cell-inner grid-col-name

find_element_by_class_name()的调用在v 2.2中工作,因此逻辑正确,并且以前找到的数据没问题。第2.21节中有些变化。

所有Selenium示例都提供了类名为foo等的简单示例,而没有我需要访问的名称类型。

为什么Selenium停止支持查找名为grid-cell inner grid-col-name的类,以及它们的解决方案是什么?

有人可以帮我找到带有“复合”类名的元素吗?

感谢。

5 个答案:

答案 0 :(得分:15)

WebDriver的问题在于它仍然在发展。很多。我个人不知道一个版本支持在一个命令中搜索多个类,所以它一定是一个相当古老的版本:)。

CSS selector搜索应该有效:

find_element_by_css_selector(".grid-cell-inner.grid-col-name");

我不建议将XPath用于此特定事情,因为以下两个表达式是不同的:

//*[class='grid-cell-inner grid-col-name']

//*[class='grid-col-name grid-cell-inner']

答案 1 :(得分:7)

您需要使用“.nameA.nameB.nameC”格式的CssSelector,您可以拥有任意数量的CssSelector,只需添加“。”

或者,您可以匹配整个属性(您也可以使用xpath执行此操作):“ [class ='exact class name here']” XPath - “// [@ class ='确切的类名在这里']”

有很多方法可以开头,结尾,包含(在CSS和xpath中),这有助于动态生成。

答案 2 :(得分:0)

Selenium在很长一段时间内都没有支持复合类名称。

毋庸置疑,请尝试通过XPath或CSS选择器或类名" grid-cell-inner"然后过滤以查看哪些元素具有" grid-cell-inner grid-col-name"的类。

答案 3 :(得分:0)

也尝试:

elements = bot.execute_script("""return document.getElementsByClassName('grid-cell-inner grid-col-name')""")

答案 4 :(得分:0)

这个错误信息...

selenium.common.exceptions.WebDriverException: Message: u'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, ".grid-cell-inner.grid-col-name")
    
  • 使用 XPATH

    driver.find_element(By.XPATH, "//*[@class='grid-cell-inner grid-col-name']")
    

参考文献

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