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

如何用XPath/CSS选择器获取同class多元素ID?解决查找异常

问题背景

尝试通过以下代码获取指定<a>元素的ID时,抛出no elements found exception异常:

System.out.println(driver.findElement(By.xpath("//a[@class='activity'][contains(.,'First Testing')]")).getAttribute("id");)
System.out.println(driver.findElement(By.xpath("//a[@class='activity'][contains(text(), 'Second Testing')]")).getAttribute("id"));

对应的HTML结构中,<a>元素的目标文本First Testing/Second Testing嵌套在子节点<label>内,<strong>标签内容不固定,仅<label>内的文本和<a>的class属性固定,期望输出:

id_106
id_109

错误原因

  1. contains(text(), 'xxx')仅匹配当前节点的直接文本节点,目标文本位于<a>的子节点<label>中,无法被直接匹配。
  2. contains(., 'xxx')虽会匹配节点的所有后代文本,但HTML中的换行、空格等空白字符可能导致匹配不稳定,再加上第一行代码存在语法错误(getAttribute("id");)多了一个分号),最终引发异常。

正确解决方案

方案1:使用XPath精准定位

直接定位包含目标文本的<label>,再向上查找其父级<a>元素,或者通过<a>的后代关系筛选:

// 方式1:先找<label>再取父级<a>的ID
System.out.println(driver.findElement(By.xpath("//label[contains(text(), 'First Testing')]/parent::a")).getAttribute("id"));
System.out.println(driver.findElement(By.xpath("//label[contains(text(), 'Second Testing')]/parent::a")).getAttribute("id"));

// 方式2:通过<a>的后代<label>筛选,确保<a>的class为activity
System.out.println(driver.findElement(By.xpath("//a[@class='activity' and .//label[contains(text(), 'First Testing')]]")).getAttribute("id"));
System.out.println(driver.findElement(By.xpath("//a[@class='activity' and .//label[contains(text(), 'Second Testing')]]")).getAttribute("id"));

方案2:使用CSS选择器定位

如果浏览器支持:has()伪类(Chrome 101+及以上版本),可以直接通过后代关系筛选:

// 匹配包含指定文本<label>的<a.activity>
System.out.println(driver.findElement(By.cssSelector("a.activity:has(label:contains('First Testing'))")).getAttribute("id"));
System.out.println(driver.findElement(By.cssSelector("a.activity:has(label:contains('Second Testing'))")).getAttribute("id"));

若浏览器不支持:has(),可以先定位<label>再向上查找父级<a>:

System.out.println(driver.findElement(By.cssSelector("label:contains('First Testing')")).findElement(By.xpath("./parent::a")).getAttribute("id"));
System.out.println(driver.findElement(By.cssSelector("label:contains('Second Testing')")).findElement(By.xpath("./parent::a")).getAttribute("id"));

内容的提问来源于stack exchange,提问作者nayansFosgit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:25:16