Selenium使用DataProvider时首次获取数据为null的问题求助
排查Selenium DataProvider返回第一组null数据的问题
我一眼就看出问题出在你的DataProvider里数组初始化和循环索引不匹配上,导致数组的第一行(索引0)完全没有被赋值,所以TestNG拿到的第一组数据就是null,null。下面给你详细分析和修正方案:
问题根源拆解
- 你通过
excelfile.RowCount(1)拿到的是Excel表的总行数(包含表头行),比如如果你的表有1行表头+2行数据,rows的值就是3。 - 你创建了长度为
rows的二维数组Object[][] credentials = new Object[rows][colm];,也就是3行的数组,但循环从i=1(对应Excel的第二行,实际数据行)开始赋值,这就导致数组的第0行(索引0)始终是空的,没有任何数据填充。 - TestNG会按照数组的顺序读取测试数据,第一组自然就是未赋值的
null,null。
修正方案
我们需要调整数组的长度(只保留实际数据的行数),同时把Excel行索引和数组索引对应起来:
步骤1:计算实际数据行数
总行数减去表头的1行,得到真正需要的测试数据行数:
int dataRows = rows - 1; // 减去表头行
步骤2:用实际数据行数初始化数组
Object[][] credentials = new Object[dataRows][colm];
步骤3:调整循环的数组索引
循环时,Excel的行从1开始(数据行),对应数组的索引从0开始,所以用i-1作为数组的行索引:
for(int i = 1; i < rows; i++) { for(int j = 0; j<colm; j++) { // 用i-1对应数组的起始索引0 credentials[i-1][j] = excelfile.getdata("LoginPage", i, j); System.out.println("Fetched data from excel sheet is -- "+credentials[i-1][j]); } }
修正后的完整DataProvider方法
@DataProvider public Object[][] TestData() throws IOException { excelfile = new ReadingExcelfile(System.getProperty("user.dir")+"\\src\\main\\java\\testData\\LinkedIn.xlsx"); int rows = excelfile.RowCount(1); int colm = excelfile.TotalColm("LoginPage", 0); // 计算实际数据行数,初始化对应长度的数组 int dataRows = rows - 1; Object[][] credentials = new Object[dataRows][colm]; for(int i = 1; i < rows; i++) { for(int j = 0; j<colm; j++) { // 数组索引从0开始,对应Excel的第i行(i从1开始) credentials[i-1][j] = excelfile.getdata("LoginPage", i, j); System.out.println("Fetched data from excel sheet is -- "+credentials[i-1][j]); } } return credentials; }
额外验证点
- 确认
ReadingExcelfile.RowCount(1)方法返回的是Sheet的总行数(包含表头),如果这个方法本身已经返回的是数据行数(排除表头),那你需要调整dataRows的计算逻辑。 - 可以在循环前打印
rows和dataRows的值,确认数据行数是否正确。
内容的提问来源于stack exchange,提问作者Sujanian
相关产品推荐
相关产品推荐

