Selenium/Python 无法在 CSS_SELECTOR 中使用 `:contains()`

Selenium/Python Unable to use `:contains()` in CSS_SELECTOR

当我尝试在Selenium的By.CSS_SELECTOR中使用:contains时,比如

presence = EC.presence_of_element_located((By.CSS_SELECTOR, ".btn:contains('Continue Shopping')"))

presence = EC.presence_of_element_located((By.CSS_SELECTOR, ".btn\:contains('Continue Shopping')"))

presence = EC.presence_of_element_located((By.CSS_SELECTOR, ".btn\:contains('Continue Shopping')"))

Python 程序崩溃并出现错误

Exception: Message: invalid selector: An invalid or illegal selector was specified
  (Session info: chrome=95.0.4638.54)

是否可以在 Selenium 中使用 :contains? CSS 选择器

$('.btn:contains("Continue Shopping")')

在 Chrome 的 JS 控制台中工作正常。

使用 Chrome 95.0.4638.54,Chrome驱动程序 95.0.4638.54,Python 3.10 on Ubuntu 20.04.

select 或 :contains('text') 是一个 jQuery selector, not a valid CSS selector,就像 Selenium 所期望的那样。我假设它通过 Chrome 的 DevTools 控制台在页面上运行的原因是因为页面上定义了 jQuery。

不幸的是,我不相信您可以使用 CSS select 或 (link).

通过其文本直接 select 一个元素

据我所知,您有两个选择:

  1. 改变你的select或class或基于ID(最简单)
  2. 创建一个 Selenium 实用程序以 运行 使用此 jQuery 的 JS 脚本 select 或者;例如execute_script("jQuery(" + id + ":contains('" + text + "')", id, text)

如 Aspok 所述,您的 CSS 定位器不是有效的 CSS 定位器。
要根据文本定位元素,您可以使用 XPath 定位器,例如:

//*[contains(@class,'btn') and(contains(text(),'Continue Shopping'))]

如果 btn 是该元素的唯一 class 名称属性,您的 XPath 可以是

//*[@class='btn' and(contains(text(),'Continue Shopping'))]

正如@aspok 所解释的,它不是一个有效的 css 选择器。

如果您想要相同的 XPath,并且 .btn 是 class 并且有 text/partial text

Continue Shopping 

您可以试试下面的 XPath :

//*[contains(text(),'Continue Shopping')]

//*[contains(text(), 'Continue Shopping') and contains(@class, 'btn')]

如果我们在 HTML DOM 中有 unique 条目,请检查 dev tools(Google chrome)。

你应该检查的 xpath :

//*[contains(text(), 'Continue Shopping') and contains(@class, 'btn')]

检查步骤:

Press F12 in Chrome -> 转到 element 部分 -> 执行 CTRL + F -> 然后粘贴 xpath 并查看是否需要 element正在 突出显示 1/1 匹配节点。

此外,请注意,如果您找到多个 匹配节点 .

//* 可以替换为 tag name