如何用Selenium将网页表格转为Map列表用于API测试?
解决表格数据转List<Map<String,String>>的重复问题
问题根源
- 复用同一Map实例:如果循环中始终使用同一个Map对象,每次
put操作会覆盖旧数据,且List中所有元素都指向这个Map,最终所有Map内容完全一致。 - 数据索引计算错误:
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
相关产品推荐
相关产品推荐

