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 一个元素
据我所知,您有两个选择:
- 改变你的select或class或基于ID(最简单)
- 创建一个 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
当我尝试在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 一个元素据我所知,您有两个选择:
- 改变你的select或class或基于ID(最简单)
- 创建一个 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