我正在使用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
的类,以及它们的解决方案是什么?
有人可以帮我找到带有“复合”类名的元素吗?
感谢。
答案 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 strategies 的 Compound class names 在使用 Selenium 时不再有效。
可以从 Selenium v2.40.0 changelist 中观察到此更改的痕迹,其中提到为复合类名称使用添加正确的错误代码:
<块引用>作为替代,您可以使用以下任一 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']")
您可以在以下位置找到一些相关的详细讨论: