selenium.common.exceptions.InvalidSelectorException with" span:contains(' string')"

时间:2017-12-19 09:18:13

标签: python css selenium exception css-selectors

我正在使用firefox中的selenium python。我试图通过css选择器

找到元素
element = "span:contains('Control panel')"
my_driver.find_element_by_css_selector(element)

我收到以下错误

 raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: Given css selector expression "span:contains('Control panel')" is invalid: InvalidSelectorError: 'span:contains('Control panel')' is not a valid selector: "span:contains('Control panel')"

在selenium IDE中,我成功地能够通过此字段找到元素,但在Python中它无法正常工作

2 个答案:

答案 0 :(得分:4)

错误说明了一切:

selenium.common.exceptions.InvalidSelectorException: Message: Given css selector expression "span:contains('Control panel')" is invalid: InvalidSelectorError: 'span:contains('Control panel')' is not a valid selector: "span:contains('Control panel')"

根据Issue#987Issue#1547

  

<强> The :contains pseudo-class isn't in the CSS Spec and is not supported by either Firefox or Chrome (even outside WebDriver).

伪类特定于Sizzle Selector Engine所依赖的 Selenium 1.0 。但是,我们决定 WebDriver 不支持Sizzle使用的 CSS selectors 样式Selenium 1.0

现在,一个有趣的事实是:包含 pseudo-class 适用于本身不支持CSS选择器的浏览器(IE7,IE8等)什么导致 浏览器和选择器之间的不一致。

因此,更好的解决方案是使用<span>标记的任何其他属性,如下所示:

element = "span[attribute_name=attribute_value]"

替代解决方案

您可以按照现行DOM Tree使用以下任一 xpaths

  • 使用 text()

    element = my_driver.find_element_by_xpath("//span[text()='Control panel']")
    
  • 使用 contains()

    element = my_driver.find_element_by_xpath("//span[contains(.,'Control panel')]")
    
  • 使用 normalize-space()

    element = my_driver.find_element_by_xpath("//span[normalize-space()='Control panel']")
    

使用jQuery

您还可以按如下方式使用 jQuery

$('span:contains("Control panel")')

琐事:

来自@FlorentB的宝贵意见。

  

控制台也不支持CSS选择器,但JQuery支持它。来自控制台的$('...')document.querySelector的简写,当页面显示时,JQuery通常会覆盖client_keystore

答案 1 :(得分:3)

Selenium不支持使用css_selector逐个文本定位(尽管它可以在开发人员工具控制台中使用)。唯一的可能性是xpath

element = "//span[contains(text(), 'Control panel')]"
my_driver.find_element_by_xpath(element)

编辑:@FlorentB的评论:

  

控制台也不支持css selector,但JQuery支持它。来自控制台的$('...')document.querySelector的简写,当页面包含JQuery时,它通常会被JQuery覆盖。