如何用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
错误原因
contains(text(), 'xxx')仅匹配当前节点的直接文本节点,目标文本位于<a>的子节点<label>中,无法被直接匹配。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
相关产品推荐
相关产品推荐

