11

我正在使用 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 中有效,因此逻辑是正确的,并且以前可以找到数据。v 2.21 中发生了一些变化。

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

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

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

4

5 回答 5

15

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

但是,通过CSS 选择器搜索应该可以:

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']

于 2012-05-20T11:02:03.980 回答
7

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

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

如果类是动态生成的,有一些方法可以开始结束包含(在 CSS 和 xpath 中)。

于 2012-08-27T10:57:51.300 回答
0

我想 Selenium 很长一段时间都不支持复合类名。

不用说,尝试通过 XPath 或 CSS 选择器或通过“grid-cell-inner”的类名,然后过滤以查看哪些元素具有“grid-cell-inner grid-col-name”类。

于 2012-05-18T23:33:12.240 回答
0

也试试:

elements = bot.execute_script("""return document.getElementsByClassName('grid-cell-inner grid-col-name')""")
于 2014-10-05T19:01:21.013 回答
0

此错误消息...

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

...意味着使用复合类名称的定位器策略在使用Selenium时不再有效。

从Selenium v​​2.40.0 更改列表中可以观察到此更改的痕迹,其中提到了为复合类名称使用添加正确的错误代码:

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

解决方案

作为替代方案,您可以使用以下任一定位器策略

  • 使用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']")
    

参考

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

于 2021-01-30T09:17:59.487 回答