我正在使用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中它无法正常工作
答案 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')"
<强>
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 :
$('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覆盖。