无法从List <Functions.Function1 <Object,String >>强制转换为List <String>使用Selenium和stream()从Java的WebElement列表创建列表

时间:2019-08-16 07:50:31

标签: java selenium stream java-stream webdriverwait

我正在尝试读取HTML表,并使用selenium将所有值放入2d列表中。我正在使用streamable在另一个map()方法内创建一个列表。但是在嵌套的Cannot cast from List<Functions.Function1<Object,String>> to List<String>方法行中出现collect错误

HTML:

+--------+-------+
| 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>

Java代码:

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列表?

1 个答案:

答案 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());
    
  

参考:您可以在以下几个相关的讨论中找到

: