【问题标题】:selenium.common.exceptions.InvalidSelectorException with "span:contains('string')"selenium.common.exceptions.InvalidSelectorException with "span:contains('string')"
【发布时间】:2018-06-01 16:30:25
【问题描述】:

我正在 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 中它不起作用

【问题讨论】:

  • 您是否使用任何浏览器检查过您的 css 选择器。我想,包含在 css 中不起作用
  • 分享你的 HTML 代码——我会帮你试试 CSS 选择器。

标签: python css selenium exception css-selectors


【解决方案1】:

错误说明了一切:

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).

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

现在,一个有趣的事实是 :contains 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 覆盖。

【讨论】:

    【解决方案2】:

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

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

    编辑:@FlorentB 的评论:

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

    【讨论】:

    • 如果 css 选择器是 css=a.actionicon:contains('Create access policy'),你能帮我解决多个条件吗?什么是 xpath
    • @Nitesh "//a[@class='actionicon'][contains(text(), 'Create access policy')]"
    • @Guy,控制台也不支持 CSS 选择器,但 JQuery 支持。来自控制台的$('...')document.querySelector 的简写,当页面有它时,它通常被JQuery 覆盖。
    猜你喜欢
    • 2023-01-28
    • 2018-12-02
    • 1970-01-01
    • 2013-03-02
    • 2022-12-02
    • 2022-12-27
    • 1970-01-01
    • 2021-05-29
    相关资源
    最近更新 更多