【问题标题】:Selenium Python: find_element_by_css_selector() using :contains()Selenium Python:find_element_by_css_selector() 使用 :contains()
【发布时间】:2013-08-31 17:32:14
【问题描述】:

在 Python 上的 Selenium 中,我正在尝试使用

选择一个元素
driver = webdriver.Firefox()
driver.find_element_by_css_selector("td:contains('hello world')")

这给了我错误:

>>>> selenium.common.exceptions.WebDriverException: Message: u'An invalid or illegal string was specified' 

我可以通过这种方式使用许多不同的 CSS 选择器来选择元素,但使用 :contains() 似乎总是会引发错误。注意:当我尝试使用时,我得到了同样的错误:

driver.find_element_by_xpath("//td[contains(text(),'hello world')]")

请指教。谢谢!

编辑:已解决!

问题解决了!非常感谢你的帮助!我犯了两个重大错误: 1.)我认为 :contains() 是一个公认的 css3 选择器(结果它不是当前规范的一部分,这就是为什么我不能这样选择) 2.) xpath 选择器会很好,只是我使用的解析器假定 xpath 中永远不会有任何空格,所以它用空格分割参数。因此,当我传入 xpath 选择器时

//td[contains(text(),'hello world']

解析器在 'hello' 之后的空格处被截断,所以 xpath 选择器看起来像

//td[contains(text(),'hello

这显然会引发错误。所以我需要调整我的解析以正确读取我的 xpath 选择器。

再次感谢您快速、有用的回答!

【问题讨论】:

  • 请向我们展示html内容..
  • CSS Selectors 没有任何名称为contains ..
  • cssselect 支持 :contains() 伪选择器,但它指的是已删除的早期 CSS3 草案 (pythonhosted.org/cssselect/#supported-selectors)。我不知道有其他项目支持这个伪选择器
  • @pault。那是 jQery 之一 - api.jquery.com/contains-selector 。 Selenium 不支持那个 jQuery ..
  • @Babai,jQuery 拥有的contains 选择器实际上来自 Sizzle,而不是 jQuery。

标签: python xpath selenium css-selectors


【解决方案1】:

find_element_by_xpath_selector替换为find_element_by_xpath(没有find_element_by_xpath_selector方法):

driver = webdriver.Firefox()
...
driver = driver.find_element_by_xpath(u"//td[contains(text(), 'hello')]")

完整示例

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('http://python.org')
link = driver.find_element_by_xpath(u'//a[contains(text(), "Download")]')
link.click()

【讨论】:

  • 好收获!不过,我并没有在我的实际代码中犯过那个特别的错误(只是在我的 Stack Overflow 问题中)。我相应地更新了问题。仍然是同样的错误。
  • @JeremyMoritz,请使用您正在处理的网址显示您的实际代码。
  • @falsetru 这是什么br.find_element_by_xpath(u"//td[contains(text(), 'hello')]")br 是什么?
  • @Babai,这是我的错误,我已修复。 br 来自我的尖峰解决方案。感谢您的评论。
  • @falsetru 这是我在使用 xpath 方法时遇到的错误:selenium.common.exceptions.InvalidSelectorException: Message: u'The given selector //h3[contains(text(), is无效或不生成 WebElement。发生以下错误:\nInvalidSelectorError: 无法使用 xpath 表达式 //h3[contains(text() 定位元素,因为以下错误:\n[Exception... “该表达式不是合法表达式。” 代码:“12” nsresult:“0x805b0033 (SyntaxError)”
【解决方案2】:

你做错了。您需要先创建一个驱动程序对象,如下所示:

driver = webdriver.Firefox()

然后导航到所需的网址,如下所示:

driver.get("http://www.python.org")

然后在那个driver 对象上需要调用所需的方法。没有包含 CSS Selectors。您可以通过以下方法find_element_by_xpath 继续:

elem = driver.find_element_by_xpath("//td[contains(text(), 'hello')]")

【讨论】:

    【解决方案3】:

    代替

    driver.find_element_by_css_selector("td:contains('hello world')")

    你也可以使用这个选项:

    driver.find_element_by_css_selector("td*='hello world'")

    注意:css_selector 中的 * 与 XPath 中的 contains 相同

    参考: https://saucelabs.com/resources/articles/selenium-tips-css-selectors

    【讨论】:

    • 感谢您关注此选择器!不幸的是,它不能按照您在此处声明的方式工作。如果您仔细阅读您引用的网页,您会发现*=(如^=$=)用于选择元素的属性,而不是这些元素的内部文本。
    • 感谢@JeremyMoritz 消除了困惑。是的,您是对的,适用于属性而不是文本。
    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2015-07-12
    • 2021-04-03
    • 2021-12-20
    • 2022-10-08
    • 2014-06-17
    • 1970-01-01
    相关资源
    最近更新 更多