You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Selenium将网页表格转为Map列表用于API测试?

解决表格数据转List<Map<String,String>>的重复问题

问题根源

  1. 复用同一Map实例:如果循环中始终使用同一个Map对象,每次put操作会覆盖旧数据,且List中所有元素都指向这个Map,最终所有Map内容完全一致。
  2. 数据索引计算错误:dataTable是所有单元格的扁平列表,每行包含与表头数量相同的元素,需要根据行号计算当前行单元格的起始索引。

修正后的代码实现

// 获取表头和表体元素
List<WebElement> headers = driver.findElements(By.xpath("//*[@id=\"table1\"]/thead/tr/th"));
List<WebElement> dataTable = driver.findElements(By.xpath("//*[@id=\"table1\"]/tbody/tr/td"));

// 初始化结果列表
List<Map<String, String>> listOfMaps = new ArrayList<>();
int columnsCount = headers.size();
int totalRows = dataTable.size() / columnsCount; // 计算总行数:24/6=4

// 遍历每一行数据
for (int rowNum = 0; rowNum < totalRows; rowNum++) {
    // 每行创建新的Map实例,避免数据覆盖
    Map<String, String> rowData = new HashMap<>();
    // 遍历当前行的每一列
    for (int colNum = 0; colNum < columnsCount; colNum++) {
        // 计算当前单元格在扁平列表中的索引
        int cellIndex = rowNum * columnsCount + colNum;
        // 关联表头与单元格数据
        rowData.put(headers.get(colNum).getText(), dataTable.get(cellIndex).getText());
    }
    // 将当前行的Map加入结果列表
    listOfMaps.add(rowData);
}

// 验证输出
for (Map<String, String> rowMap : listOfMaps) {
    System.out.println(rowMap);
}

关键修改说明

  • 每行新建Map:确保每个行数据对应独立的Map对象,彻底避免数据覆盖问题。
  • 正确计算单元格索引:通过行号×列数+列号的方式,精准定位当前行的每个单元格,保证数据对应关系正确。

转JSON用于API POST测试

如果需要将结果转为JSON格式,可以使用Jackson或Gson库,以下是Jackson的示例:

// 需引入Jackson Databind依赖
ObjectMapper objectMapper = new ObjectMapper();
String requestJson = objectMapper.writeValueAsString(listOfMaps);
// requestJson即为可直接用于POST请求的JSON数组

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:18:19