为何该XPath在Chrome可用却在Selenium中触发InvalidSelectorException?
问题原因及解决方案
核心问题:你的XPath表达式使用了无参数的
string()函数,不符合XPath 1.0标准语法。Chrome控制台的XPath引擎对这种写法有容错处理,但Selenium严格遵循XPath 1.0规范,因此抛出InvalidSelectorException异常。错误点解析:
原表达式里的normalize-space(string())中,string()未指定参数。标准XPath 1.0要求string()必须接收一个节点作为参数才能返回其字符串值,Chrome允许省略参数默认取当前节点,但Selenium不支持这种非标准写法。修正后的XPath:
将所有string()改为string(.),明确指定当前节点作为参数://*[contains(normalize-space(string(.)), 'textOne')][not(.//*[contains(normalize-space(string(.)), 'textOne')])][contains(normalize-space(string(.)), 'textTwo')][not(.//*[contains(normalize-space(string(.)), 'textTwo')])]优化建议:
若目标是匹配元素自身的可见文本(不含子元素文本),可简化为使用text()函数,写法更简洁且符合标准://*[contains(normalize-space(text()), 'textOne') and contains(normalize-space(text()), 'textTwo') and not(.//*[contains(normalize-space(text()), 'textOne') or contains(normalize-space(text()), 'textTwo')])]这个表达式和你原逻辑一致,确保元素自身文本同时包含
textOne和textTwo,且子元素不包含这两个文本。
内容的提问来源于stack exchange,提问作者Steve Goodman
相关产品推荐
相关产品推荐

