You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否结合多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:10:02