You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Selenium WebDriver无法写入Excel问题排查求助

问题排查与解决方案

我仔细梳理了你的测试脚本和Excel工具类代码,找到了几个导致数据无法写入Excel的核心问题,下面逐一说明并给出修复方案:

1. 未处理工作表/行不存在的场景

你的writeStringData方法直接调用wb.getSheet(sheetName)sheet1.getRow(row),如果目标工作表(比如Results)不存在,或者指定行还未创建,这两个方法都会返回null,后续调用createCell时会触发空指针异常。但由于代码没有显式捕获这类异常(或被上层静默处理),导致写入操作悄悄失败,却没有报错提示。

修复ExcelConfig中的writeStringData方法

import org.apache.poi.ss.usermodel.IndexedColors; // 需要新增这个导入

public void writeStringData(String sheetName, int row, int column, String data) {
    // 检查工作表是否存在,不存在则创建
    sheet1 = wb.getSheet(sheetName);
    if (sheet1 == null) {
        sheet1 = wb.createSheet(sheetName);
    }
    // 检查行是否存在,不存在则创建
    Row valueRow = sheet1.getRow(row);
    if (valueRow == null) {
        valueRow = sheet1.createRow(row);
    }
    // 创建或获取目标单元格
    Cell valueCell = valueRow.createCell(column);
    // 为失败状态设置红色字体样式
    if (data.equals("FAILED")) {
        CellStyle style = wb.createCellStyle();
        Font font = wb.createFont();
        font.setColor(IndexedColors.RED.getIndex()); // 替换为XSSF兼容的颜色设置
        style.setFont(font);
        valueCell.setCellStyle(style);
    }
    // 设置单元格内容
    valueCell.setCellValue(data);
}

2. createFile调用时机不合理

你在循环内部每次写入数据后都调用excel.createFile,虽然不会直接导致写入失败,但会重复将内存中的Workbook写入文件,既影响效率,也可能在循环中途出错时导致数据不完整。更合理的做法是在所有写入操作完成后,统一调用一次createFile,确保所有结果一次性写入Excel。

同时我注意到你原来固定写入第1行,这样循环中每次都会覆盖之前的数据,我帮你改成了对应循环的row值,让每条测试数据的结果对应写入Results工作表的对应行:

修改测试用例中的代码

public void specMortHome() throws NoAlertPresentException, InterruptedException, IOException {
    // ... 原有初始化代码保持不变 ...
    int row = 1;
    while (excel.getData("PDFRollUp", row, 0) != "") {
        // ... 原有Web操作代码保持不变 ...
        String erc = specMortLoanDetails.getERC();
        String ltv = specMortLoanDetails.getLTV();
        
        // 移除循环内的createFile调用
        // excel.createFile("src/test/resources/TestData.xlsx");
        
        // 改为写入对应row的行,避免覆盖
        excel.writeStringData("Results", row, 1, erc);
        excel.writeStringData("Results", row, 2, ltv);
        
        // ... 原有登出代码保持不变 ...
        row++;
    }
    // 所有循环完成后,统一写入文件
    excel.createFile("src/test/resources/TestData.xlsx");
    driver.quit();
}

3. 潜在的文件加载异常风险

你的ExcelConfig构造函数仅捕获异常并打印模糊提示,但没有处理wbnull的情况,如果文件加载失败,后续所有Excel操作都会静默出错。建议优化构造函数,明确抛出异常便于排查:

优化ExcelConfig构造函数

public ExcelConfig(String Excelpath) throws IOException {
    File src = new File(Excelpath);
    try (FileInputStream fis = new FileInputStream(src)) {
        wb = new XSSFWorkbook(fis);
    } catch (FileNotFoundException e) {
        throw new IOException("Excel文件未找到:" + Excelpath, e);
    } catch (IOException e) {
        throw new IOException("加载Excel文件失败,请检查文件格式是否正确", e);
    }
}

测试验证

修复完成后,你可以:

  1. 确保TestData.xlsxResults工作表不存在(或存在但对应行为空)
  2. 运行测试用例,查看Results工作表是否成功写入每条测试数据对应的ercltv

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

火山引擎 最新活动