Selenium Java中提取DOM内以starx-开头的ID到数组的方法求助
解决方案:提取以"starx-"开头的元素ID到列表
你已经走对了第一步——用CSS选择器[id^='starx-']定位所有目标元素,这个选择器完全适配你动态DOM的场景,不用管前缀后的内容是什么,非常高效。问题出在你没有正确提取每个元素的ID值,而是直接操作了WebElement对象本身,我来帮你修正:
基础循环实现(兼容所有Java版本)
先创建一个字符串列表来存储ID,然后遍历每个WebElement,调用getAttribute("id")获取实际ID并添加到列表中:
import java.util.ArrayList; import java.util.List; import org.openqa.selenium.WebElement; import org.openqa.selenium.By; // 1. 定位所有符合条件的元素 List<WebElement> allStarXElements = driver.findElements(By.cssSelector("[id^='starx-']")); // 2. 创建空列表存储ID List<String> starXIds = new ArrayList<>(); // 3. 遍历元素提取ID for (WebElement element : allStarXElements) { String elementId = element.getAttribute("id"); starXIds.add(elementId); // 打印ID(注意这里打印的是提取到的字符串,不是WebElement对象) System.out.println(elementId); } // 现在starXIds就是你需要的所有ID的集合了
简化版(Java 8+ 流操作)
如果你用的是Java 8或更高版本,可以用流操作让代码更简洁:
import java.util.List; import java.util.stream.Collectors; import org.openqa.selenium.WebElement; import org.openqa.selenium.By; List<String> starXIds = driver.findElements(By.cssSelector("[id^='starx-']")) .stream() .map(element -> element.getAttribute("id")) .collect(Collectors.toList()); // 批量打印所有ID starXIds.forEach(System.out::println);
为什么你之前的代码没生效?
- 你尝试直接在
findElements()后调用getAttribute():findElements()返回的是List<WebElement>,而getAttribute()是单个WebElement的方法,不能直接在列表上调用,所以会报类型不匹配。 - 循环里你打印的是
starx(WebElement对象):WebElement的默认toString()方法会输出类似[ChromeDriver: ...]的对象信息,你需要打印的是starx.getAttribute("id")才能得到实际ID字符串。
这个方案完全适配你动态DOM的场景,不管下拉选项怎么变,只要ID以starx-开头,就能被正确提取到列表里。
内容的提问来源于stack exchange,提问作者Munchy




