能否结合多个contains()函数与XPath轴编写OrangeHRM的XPath?
关于XPath中结合contains()与轴的疑问
我出于好奇,尝试为OrangeHRM网站的请假门户编写XPath,想要同时使用2个contains()函数与XPath轴,写出了如下XPath:
//*[contains(@class,'oxd-main-menu-item active') and (contains(@class,'oxd-main-menu-item-wrapper')/child::a) ]
其中:
contains(@class,'oxd-main-menu-item active'):目标点击链接contains(@class,'oxd-main-menu-item-wrapper')/child::a:尝试通过XPath轴访问链接的父元素
我知道如下这种多contains()的写法是可行的:
//div[contains(@class, 'measure-tab') and contains(., 'someText')]
但我的问题是:能否将XPath轴与其中一个contains()函数结合使用?
当然可以结合,但你写的XPath逻辑有问题。
你要明确:contains()是用来判断节点的属性或文本是否包含指定内容,而XPath轴是用来定位节点的上下文关系。正确的做法是先通过轴找到目标节点的关联节点,再在contains()里判断该节点的属性/文本。
比如你要找的是父元素包含oxd-main-menu-item-wrapper类的、自身包含oxd-main-menu-item active类的<a>标签,正确的写法应该是:
//a[contains(@class,'oxd-main-menu-item active') and contains(parent::*/@class,'oxd-main-menu-item-wrapper')]
或者更严谨一点,指定父节点的类型(比如div):
//a[contains(@class,'oxd-main-menu-item active') and contains(parent::div/@class,'oxd-main-menu-item-wrapper')]
简单说,你之前的写法错在把轴的路径直接放在contains()外面了,应该把轴定位到的节点的属性作为contains()的第一个参数,这样才是把轴和contains()结合起来的正确姿势。
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

