Selenium(Python)部分:not(...) CSS选择器失效问题
解决Selenium中
p:not(.ignore p)选择器无效的问题 嘿,我碰到过类似的旧版本Selenium兼容问题,咱们来一步步理清楚:
首先得明确:你想选中不在.ignore类元素内部的<p>标签对吧?但p:not(.ignore p)这个写法其实是CSS4的语法,而你用的Selenium 3.11.0是比较老的版本(搭配的ChromeDriver对应的Chrome版本大概率也不支持CSS4的复杂:not()选择器),这就是为什么浏览器里能生效,但Selenium里不行的原因——现代浏览器已经支持CSS4的:not()接受复杂选择器,而旧版本的Selenium引擎还不买账。
给你两个可行的解决方案:
方案1:用XPath替代(最稳妥,旧版本Selenium支持很好)
XPath在这种嵌套元素过滤上比旧版CSS选择器灵活太多,直接写:
# 选中所有没有.ignore类祖先元素的p标签 target_elements = driver.find_elements_by_xpath("//p[not(ancestor::*[@class='ignore'])]")
这个写法不管嵌套多少层,都能准确排除.ignore内部的p,完全适配你的测试页面。
方案2:调整CSS选择器写法(适配旧版Selenium)
如果一定要用CSS,把选择器改成旧版引擎能识别的语法:
# 选中直接在非.ignore元素下的p标签(适合你的测试页面结构) target_elements = driver.find_elements_by_css_selector(":not(.ignore) > p") # 如果有多层嵌套的p,试试这个(部分旧版ChromeDriver可能支持) target_elements = driver.find_elements_by_css_selector("p:not(.ignore *)")
额外建议:
Python 2.7和Selenium 3.11.0都已经停止维护很久了,要是项目允许的话,升级到Python 3.x + 最新版Selenium,不仅能解决这类语法兼容问题,还能获得更好的稳定性和新特性支持。
内容的提问来源于stack exchange,提问作者maiamcc
相关产品推荐
相关产品推荐

