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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:58:10