如何用Java Stream结合多findElements条件提取Selenium WebElement文本
错误原因
Stream.filter()方法要求传入的断言函数必须返回boolean类型,你在内层filter中直接调用findElements(),该方法返回值为List<WebElement>,不符合filter的入参要求,所以触发类型转换错误。- 你的逻辑结构错误:不应该将
map、collect操作嵌套在filter的Lambda内部,filter只负责做条件判断,元素转换、结果收集应该放在外层Stream流程中。
正确实现代码
拆分写法(对应你原来的两段代码结构)
// 第一段代码保持不变,正常获取行元素列表 List<WebElement> list1 = getsomeRowstList().stream() .map(TableRow::getWebElement) .collect(Collectors.toList()); // 第二段修改后的代码 List<String> list2 = list1.stream() // 先把每个行元素下的指定列元素全部展开成扁平流 .flatMap(a -> a.findElements(By.cssSelector("locator-for-specific-column-with-parameter")).stream()) // 筛选列元素中存在匹配row-index-locator的子元素的项,用!isEmpty()把List转成boolean判断 .filter(m -> !m.findElements(By.cssSelector("row-index-locator")).isEmpty()) // 提取符合条件元素的文本 .map(WebElement::getText) // 收集结果 .collect(Collectors.toList());
合并写法(不用拆分list1,直接流式完成全部操作)
List<String> list2 = getsomeRowstList().stream() .map(TableRow::getWebElement) .flatMap(a -> a.findElements(By.cssSelector("locator-for-specific-column-with-parameter")).stream()) .filter(m -> !m.findElements(By.cssSelector("row-index-locator")).isEmpty()) .map(WebElement::getText) .collect(Collectors.toList());
可选优化
如果row-index-locator是列元素自身的属性而非子元素定位符,你可以把filter条件替换为m -> m.getAttribute("对应属性名") != null,不需要额外查找子元素,执行性能会更好。
内容的提问来源于stack exchange,提问作者jacob1989
相关产品推荐
相关产品推荐

