我正在尝试读取HTML表,并使用selenium将所有值放入2d列表中。我正在使用streamable在另一个map()
方法内创建一个列表。但是在嵌套的Cannot cast from List<Functions.Function1<Object,String>> to List<String>
方法行中出现collect
错误
+--------+-------+
| r1 v1 | r1 v2 |
+--------+-------+
| r2 v1 | r2 v2 |
+--------+-------+
<html>
<body>
<table>
<tbody>
<tr>
<td>
<div>
<span>r1 v1</span>
</div>
</td>
<td>
<div>
<span>r1 v2</span>
</div>
</td>
</tr>
<tr>
<td>
<div>
<span>r2 v1</span>
</div>
</td>
<td>
<div>
<span>r2 v2</span>
</div>
</td>
</tr>
</tbody>
</table>
</body>
</html>
public List getTableData() {
return webElement
.findElements(By.xpath(".//table/tbody/tr"))
.stream()
.map(row -> {
return row
.findElements(By.xpath(".//td/div/span"))
.stream()
.map(cell -> {
return cell
.getAttribute("innerText");
})
.collect(Collectors.toList()); // : Cannot cast from List<Functions.Function1<Object,String>> to List<String>
})
.collect(Collectors.toList());
}
为什么我会收到此错误?如何使用java streamable在此表之外创建2d列表?
答案 0 :(得分:1)
要使用Java8的stream()
和map()
用 innerText 创建 List ,您可以使用以下解决方案:
cssSelector :
List<String> myTexts = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("table>tbody tr td span"))).stream().map(element->element.getAttribute("innerHTML")).collect(Collectors.toList());
xpath :
List<String> myTexts = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//table/tbody//tr//td//span"))).stream().map(element->element.getAttribute("innerHTML")).collect(Collectors.toList());
参考:您可以在以下几个相关的讨论中找到
: