当我尝试在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)
在硒中使用:contains
可能吗?CSS选择器
$('.btn:contains("Continue Shopping")')
在Chrome的JS控制台中运行良好。
在Ubuntu 20.04上使用Chrome 95.0.4638.54、ChromeDriver 95.0.4638.5 4、Python 3.10。
:contains('text')
是一个jQuery选择器,而不是Selenium所期望的有效CSS选择器。我假设它通过Chrome的DevTools控制台在页面上工作的原因是因为页面上定义了jQuery
不幸的是,我不相信您可以使用CSS选择器(链接(通过其文本直接选择元素。
据我所见,你有两个选择:
- 将选择器更改为基于类或ID(最简单(
- 创建一个Selenium实用程序来运行使用这个jQuery选择器的JS脚本;例如
execute_script("jQuery(" + id + ":contains('" + text + "')", id, text)
如Aspok所述,您的CSS定位器不是有效的CSS定位器
要根据文本定位元素,可以使用XPath定位器,例如:
//*[contains(@class,'btn') and(contains(text(),'Continue Shopping'))]
如果btn
是该元素的唯一类名属性,那么XPath可以是
//*[@class='btn' and(contains(text(),'Continue Shopping'))]
正如@aspok所解释的,它不是一个有效的css选择器。
如果您希望具有相同的XPath,并且.btn
是类并且具有文本/部分文本
Continue Shopping
您可以尝试以下XPath:
//*[contains(text(),'Continue Shopping')]
或
//*[contains(text(), 'Continue Shopping') and contains(@class, 'btn')]
如果我们在HTML DOM
中是否有唯一条目,请检查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
。