Selenium python find_element_by_class_name()已从v2.2到2.21停止工作--无法使用';复合类名';

Selenium python find_element_by_class_name()已从v2.2到2.21停止工作--无法使用';复合类名';,python,selenium,selenium-webdriver,webdriver,class-names,Python,Selenium,Selenium Webdriver,Webdriver,Class Names,我正在使用Selenium的python库从Firefox中的html页面中获取数据 我不得不从Selenium 2.0升级到2.21,因为服务器已经更新了Firefox 在v2.21中,通过类名称(“网格单元内部网格列名称”)调用查找元素时失败,原因是: selenium.common.exceptions.WebDriverException: Message: u'Compound class names not permitted' 我试图访问的元素的类名是grid cell-inne

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

我不得不从Selenium 2.0升级到2.21,因为服务器已经更新了Firefox

在v2.21中,通过类名称(“网格单元内部网格列名称”)调用
查找元素时失败,原因是:

selenium.common.exceptions.WebDriverException: Message: u'Compound class names not permitted'
我试图访问的元素的类名是
grid cell-inner-grid col-name

通过_class_name()
调用
find_element_在v2.2中起作用,因此逻辑正确,用于查找的数据正常。第2.21节发生了一些变化

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

为什么Selenium停止支持查找名为
网格单元内部网格col name
的类,以及它们的解决方案是什么


有人能帮我找到具有“复合”类名的元素吗?

我想Selenium很久没有支持复合类名了


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

WebDriver的问题是它仍然在发展。很多我个人不知道有哪个版本支持在一个命令中通过多个类进行搜索,所以它一定是一个相当旧的版本:)

但是,在以下情况下,由a进行搜索应该是可行的:

find_element_by_css_selector(".grid-cell-inner.grid-col-name");
我不建议将其用于此特定对象,因为以下两个表达式是不同的:

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


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

您需要使用格式为“.nameA.nameB.nameC”的CSS选择器。您可以拥有任意数量的单元格,只需添加“.”

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

有一些方法可以执行开始或以结束或也包含的操作(在CSS和xpath中),如果类是动态生成的,这会有所帮助

也可以尝试:

elements = bot.execute_script("""return document.getElementsByClassName('grid-cell-inner grid-col-name')""")
此错误消息

selenium.common.exceptions.WebDriverException: Message: u'Compound class names not permitted'
…意味着使用在使用时不再有效

从中可以看到此更改的痕迹,其中提到为复合类名使用添加正确的错误代码:

  • 对于无效的css选择器空类名和原子中的复合类名,实现了正确的错误代码

解决方案 作为替代方案,您可以使用以下任一选项:

  • 使用
    CSS\u选择器

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

工具书类 您可以在以下内容中找到一些相关的详细讨论:


它不是按多个类进行搜索;html中的类名(我无法控制)中有空格。如果这是一个“复合类名”,那么为什么不再支持它呢?我们所有的逻辑现在都被破坏了。事实上,不是。它是两个独立的类,
网格单元内部
网格列名称
,我对此持100%的肯定态度。我不知道Selenium不支持按许多类名搜索的原因,但我想这就是CSS选择器的用途。如果成功的话,它一定是某个alpha或beta版本,因为我在任何变更日志中都找不到这方面的任何提及。使用CSS选择器解决方案就可以了。A说:要指定多个类,请用空格分隔类名,例如。这允许您为一个HTML元素组合多个CSS类。是。使用find_element_by_css_selector()并按照所述指定类名可以正常工作。我只需要修改几行代码就可以支持这一点,现在我可以找到元素了。非常感谢你!这不应该是“/*[@class='exact class name here']”吗?重点放在*上,那么*应该存在还是不存在?