基于数据驱动的Selenium出现NumberFormatException异常:输入字符串为"3.0"
解决Selenium Excel数据驱动中的NumberFormatException("3.0"输入字符串问题)
嘿,这个问题我太熟了!咱们先搞清楚为啥会报错:你的代码里处理数字类型单元格时,用String.valueOf(cell.getNumericCellValue())把数字转成字符串——如果Excel里的单元格是整数(比如值为3),getNumericCellValue()会返回一个double类型的3.0,转成字符串就变成了"3.0"。后续你要是把这个字符串转成整数类型,自然就会抛出NumberFormatException了。
下面给你两个靠谱的解决方案,优先推荐第二个,更省心:
方案1:用Apache POI的DataFormatter类(推荐)
DataFormatter是POI专门用来按Excel显示格式获取单元格值的工具,不管是整数、小数还是日期,它都能返回和Excel界面显示一致的字符串,完全不用自己判断单元格类型,代码也更简洁。
修改后的代码如下:
public String[][] getDataFromSheet(String excelfilename, String sheetName) { String datasets[][] = null; try { XSSFSheet sheet = workbook.getSheet(sheetName); int totalRow = sheet.getLastRowNum() + 1; int totalCol = sheet.getRow(0).getLastCellNum(); datasets = new String[totalRow - 1][totalCol]; // 初始化DataFormatter DataFormatter formatter = new DataFormatter(); for (int i = 1; i < totalRow; i++) { XSSFRow rows = sheet.getRow(i); for (int j = 0; j < totalCol; j++) { XSSFCell cell = rows.getCell(j); // 直接用formatter获取单元格的显示文本 datasets[i - 1][j] = formatter.formatCellValue(cell); } } return datasets; } catch (Exception e) { e.printStackTrace(); // 建议打印异常,方便排查问题 return datasets; } }
方案2:手动处理数字类型的小数部分
如果你不想引入新的工具类,也可以在处理数字单元格时,判断这个double值是否是整数,如果是就转成整数再转字符串,否则保留小数:
修改后的数字处理逻辑部分:
else if (cell.getCellTypeEnum() == CellType.NUMERIC) { double numericValue = cell.getNumericCellValue(); String cellText; // 判断是否是整数 if (numericValue == Math.floor(numericValue)) { cellText = String.valueOf((long) numericValue); } else { cellText = String.valueOf(numericValue); } datasets[i - 1][j] = cellText; }
这样处理后,Excel里的整数3就会被转成字符串"3",而不是"3.0",后续转整数就不会报错了。
另外提个小建议:catch块里最好打印一下异常信息(比如e.printStackTrace()),不然出问题了很难排查原因哦~
内容的提问来源于stack exchange,提问作者Dipak
相关产品推荐
相关产品推荐

