selenium.common.exceptions.InvalidSelectorException 出现“span:contains('string')”
- 2025-02-08 08:52:00
- admin 原创
- 68
问题描述:
我正在 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 中它不起作用
解决方案 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#987
和Issue#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`
现在,一个有趣的事实是:contains pseudo-class
将适用于不原生支持 CSS 选择器(IE7、IE8 等)的浏览器,这会导致浏览器和选择器之间的不一致。
因此,更好的解决方案是采用<span>
标签的任何其他属性,如下所示:
element = "span[attribute_name=attribute_value]"
替代解决方案
您可以根据现行的DOM 树使用以下任一xpath:
使用
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:
css_selector
Selenium 不支持通过文本定位元素(尽管它可以在开发人员工具控制台中使用)。唯一的可能是xpath
element = "//span[contains(text(), 'Control panel')]"
my_driver.find_element_by_xpath(element)
编辑:@FlorentB 的评论:
css selector
控制台也不支持A ,但 JQuery 支持。$('...')
控制台中的 是 的简写,document.querySelector
当页面包含它时,通常会用 JQuery 覆盖它。