Java Selenium自动化脚本出现NullPointerException问题排查求助
排查并解决Java Selenium脚本中的NullPointerException
首先,咱们先锁定问题:你的异常抛出在SearchCity.tc(SearchCity.java:56),结合代码细节来看,大概率是以下几个场景导致的空指针,我一个个给你分析并给出可落地的修复方案:
1. Excel操作中的空指针(最可能的触发原因)
看你tc方法里的这段代码:
XSSFRow row = sheet.getRow(1); XSSFCell cell = row.getCell(2); cell.setCellValue(strText);
还有后续的row2.getCell(3)操作,这里存在两个空指针风险:
sheet.getRow(1)可能返回null:Excel的行索引从0开始,getRow(1)对应第2行,如果这一行不存在或为空行,row就会是null,直接调用row.getCell(2)必然触发空指针。- 就算行存在,
row.getCell(2)也可能返回null:如果第3列(列索引从0开始)从未被创建过单元格,默认就是null,直接调用cell.setCellValue()也会报错。
修复代码:
操作行和单元格前先做非空判断,不存在的话主动创建:
// 处理第一个单元格(列索引2) XSSFRow row = sheet.getRow(1); if (row == null) { row = sheet.createRow(1); // 行不存在则创建 } XSSFCell cell = row.getCell(2); if (cell == null) { cell = row.createCell(2); // 单元格不存在则创建 } cell.setCellValue(strText); // 同理处理第二个单元格(列索引3) XSSFRow row2 = sheet.getRow(1); if (row2 == null) { row2 = sheet.createRow(1); } XSSFCell cell2 = row2.getCell(3); if (cell2 == null) { cell2 = row2.createCell(3); } cell2.setCellValue(strText1);
另外你的readExcelData方法也藏着空指针隐患:
list.add(rowIterator.next().getCell(colNo).getStringCellValue());
如果某一行的目标列没有单元格,getCell(colNo)返回null,调用getStringCellValue()就会触发异常。这里也要补判断,还得兼容单元格类型(比如数字类型直接转字符串会报错):
Row currentRow = rowIterator.next(); Cell cell = currentRow.getCell(colNo); if (cell != null) { cell.setCellType(CellType.STRING); // 统一转为字符串类型 list.add(cell.getStringCellValue()); } else { list.add(""); // 空单元格用空字符串占位,避免空指针 }
2. 页面元素查找的潜在问题
你直接用driver.findElement(By.id("google_dt")).getText(),虽然findElement找不到元素会抛出NoSuchElementException,但如果页面加载慢(比如路由计算耗时超过你设置的Thread.sleep(8000)),元素还没渲染出来,也可能间接引发问题。
优化方案:
用显式等待代替固定时长的Thread.sleep,确保元素加载完成后再操作:
// 等待google_dt元素出现,超时时间10秒 WebElement googleDt = new WebDriverWait(driver, 10) .until(ExpectedConditions.presenceOfElementLocated(By.id("google_dt"))); String strText = googleDt.getText(); // 同理处理mmi_dt_2元素 WebElement mmiDt2 = new WebDriverWait(driver, 10) .until(ExpectedConditions.presenceOfElementLocated(By.id("mmi_dt_2"))); String strText1 = mmiDt2.getText();
这种方式比固定等待更灵活,能自适应页面加载速度。
3. 其他可优化的细节
- Excel文件重复打开关闭:你循环里每次都重新打开Excel,效率低还容易因为文件被占用报错。建议把Excel的打开/关闭移到循环外:
// 循环前打开Excel FileInputStream fis = new FileInputStream(new File("D:\\Screenshots\\Book1.xlsx")); XSSFWorkbook workbook = new XSSFWorkbook(fis); XSSFSheet sheet = workbook.getSheetAt(0); fis.close(); // 打开后即可关闭输入流 for(int i=0; i<data0.size(); i++) { // ... 页面操作代码 ... // 直接用上面的sheet、workbook做写入操作 } // 循环结束后统一写入并关闭 FileOutputStream fos = new FileOutputStream(new File("D:\\Screenshots\\Book1.xlsx")); workbook.write(fos); fos.close(); workbook.close();
- 截图文件无扩展名:截图保存代码加上
.png后缀,避免文件无法直接打开:
FileUtils.copyFile(screenshot, new File("D:\\Screenshots\\Screen" +i + ".png"));
先把Excel操作的非空判断加上,这应该是触发第56行空指针的核心原因,再逐步优化其他部分即可。
内容的提问来源于stack exchange,提问作者shivam
相关产品推荐
相关产品推荐

