尝试使用 Selenium 从 Excel 文件读取数据时出现 NullPointerException
NullPointerException when trying to read data from Excel file using Selenium
我正在使用 Maven 创建一个 Selenium 项目,其中我试图从 Excel 文件 (xlsx) 中读取 'username' 和 'password'。
这是代码-
public class NewTest {
WebDriver driver;
@BeforeTest
public void setup() {
System.setProperty("webdriver.gecko.driver",Util.FIREFOX_PATH);
driver = new FirefoxDriver();
driver.navigate().to(Util.BASE_URL);
}
public void readExcel(String filePath, String fileName, String sheetName) throws IOException, InterruptedException {
File file = new File(filePath+"\"+fileName);
FileInputStream fs = new FileInputStream(file);
Workbook workBook = null;
String fileExtensionName = fileName.substring(fileName.indexOf("."));
if (fileExtensionName.equals(".xlsx")) {
workBook = new XSSFWorkbook(fs);
}
if (fileExtensionName.equals(".xls")) {
workBook = new HSSFWorkbook(fs);
}
Sheet sheet = workBook.getSheet(sheetName);
int rowCount = sheet.getLastRowNum();
for (int i = 0; i <= rowCount; i++) {
Row row = sheet.getRow(i);
for (int j = 0; j < row.getLastCellNum(); j++) {
driver.findElement(By.xpath("//input[@type='text']")).sendKeys(sheet.getRow(i).getCell(j).getStringCellValue());
driver.findElement(By.xpath("//input[@type='password']")).sendKeys(sheet.getRow(i).getCell(j+1).getStringCellValue());
driver.findElement(By.xpath("//input[@type='submit']")).click();
Thread.sleep(5000);
String actualTitle = driver.getTitle();
String expectedTitle = "Home Page";
SoftAssert sassert = new SoftAssert();
sassert.assertEquals(actualTitle, expectedTitle);
sassert.assertAll();
break;
}
}
}
@Test
public static void callingFunction() throws IOException, InterruptedException {
NewTest newTest = new NewTest();
String filePath = "C:\Users\Sitesh\Desktop";
newTest.readExcel(filePath, "Book2.xlsx", "Sheet1");
}
}
我收到以下错误 -
FAILED: callingFunction
java.lang.NullPointerException
at Guru99_Bank.Guru99_Bank.NewTest.readExcel(NewTest.java:59)
at Guru99_Bank.Guru99_Bank.NewTest.callingFunction(NewTest.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:132)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:599)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:174)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:822)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:147)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(Unknown Source)
at org.testng.TestRunner.privateRun(TestRunner.java:764)
at org.testng.TestRunner.run(TestRunner.java:585)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
at org.testng.SuiteRunner.run(SuiteRunner.java:286)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1218)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.runSuites(TestNG.java:1069)
at org.testng.TestNG.run(TestNG.java:1037)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
Excel 文件的屏幕截图-
我得到的错误是在这一行:
driver.findElement(By.xpath("//input[@type='text']")).sendKeys(sheet.getRow(i).getCell(j) .getStringCellValue());
由于您得到 NullPointerException,您使用的是方法链,最好将其拆分成更小的对象并了解哪个对象实际上为 null 以找到原因。如果没有这些信息,论坛中的人可能无法提供帮助
driver.findElement(By.xpath("//input[@type='text']")).sendKeys(sheet.getRow(i).getCell(j).getStringCellValue());
类似
Element e = driver.findElement(By.xpath("//input[@type='text']")); Row row = sheet.getRow(i); Cell c = row.getCell(j); String val = c.getStringCellValue();
此处的元素、行或单元格可能为空。
问题 - 空指针异常
您正在尝试访问不可用的单元格
sheet.getRow(i).getCell(j+1)
这是试图从当前单元格移至下一个单元格,但该单元格不存在
Excelreader如何工作?
首先获取第一行,然后依次逐一解析所有单元格。如果没有可用的单元格,它将转到下一行。
如果您尝试在同一个循环中访问“两个单元格”(sheet.getRow(i).getCell(j+1)),只有当您在这些单元格中有数据时,它才会起作用,否则会得到 NP 异常,因为那里什么都没有。
这张图片可能会让你明白
解法:
//rows
for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
Row row = sheet.getRow(i);
//cells
for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
// gettingrow cell
Cell cell = row.getCell(j);
driver.findElement(By.xpath("//input[@type='text']")).sendKeys(cell.getStringCellValue());
driver.findElement(By.xpath("//input[@type='password']")).sendKeys(cell.getStringCellValue());
driver.findElement(By.xpath("//input[@type='submit']")).click();
Thread.sleep(5000);
String actualTitle = driver.getTitle();
String expectedTitle = "Home Page";
SoftAssert sassert = new SoftAssert();
sassert.assertEquals(actualTitle, expectedTitle);
sassert.assertAll();
}
}
也 - 使用 getPhysicalNumberOfRows() - 它 return 只有 rows/cells 有数据。
稍后更新 NP 异常
您需要将网络驱动程序添加为 excel 方法的参数。 webdriver获取实例但是当readExcel方法使用的是null,所以需要传递初始化对象
将方法改为
public void readExcel(String filePath, String fileName, String sheetName, WebDriver driver)
以及对
的调用
newTest.readExcel(filePath, "Book2.xlsx", "Sheet1", driver);
它会起作用。
我正在使用 Maven 创建一个 Selenium 项目,其中我试图从 Excel 文件 (xlsx) 中读取 'username' 和 'password'。
这是代码-
public class NewTest {
WebDriver driver;
@BeforeTest
public void setup() {
System.setProperty("webdriver.gecko.driver",Util.FIREFOX_PATH);
driver = new FirefoxDriver();
driver.navigate().to(Util.BASE_URL);
}
public void readExcel(String filePath, String fileName, String sheetName) throws IOException, InterruptedException {
File file = new File(filePath+"\"+fileName);
FileInputStream fs = new FileInputStream(file);
Workbook workBook = null;
String fileExtensionName = fileName.substring(fileName.indexOf("."));
if (fileExtensionName.equals(".xlsx")) {
workBook = new XSSFWorkbook(fs);
}
if (fileExtensionName.equals(".xls")) {
workBook = new HSSFWorkbook(fs);
}
Sheet sheet = workBook.getSheet(sheetName);
int rowCount = sheet.getLastRowNum();
for (int i = 0; i <= rowCount; i++) {
Row row = sheet.getRow(i);
for (int j = 0; j < row.getLastCellNum(); j++) {
driver.findElement(By.xpath("//input[@type='text']")).sendKeys(sheet.getRow(i).getCell(j).getStringCellValue());
driver.findElement(By.xpath("//input[@type='password']")).sendKeys(sheet.getRow(i).getCell(j+1).getStringCellValue());
driver.findElement(By.xpath("//input[@type='submit']")).click();
Thread.sleep(5000);
String actualTitle = driver.getTitle();
String expectedTitle = "Home Page";
SoftAssert sassert = new SoftAssert();
sassert.assertEquals(actualTitle, expectedTitle);
sassert.assertAll();
break;
}
}
}
@Test
public static void callingFunction() throws IOException, InterruptedException {
NewTest newTest = new NewTest();
String filePath = "C:\Users\Sitesh\Desktop";
newTest.readExcel(filePath, "Book2.xlsx", "Sheet1");
}
}
我收到以下错误 -
FAILED: callingFunction
java.lang.NullPointerException
at Guru99_Bank.Guru99_Bank.NewTest.readExcel(NewTest.java:59)
at Guru99_Bank.Guru99_Bank.NewTest.callingFunction(NewTest.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:132)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:599)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:174)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:822)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:147)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(Unknown Source)
at org.testng.TestRunner.privateRun(TestRunner.java:764)
at org.testng.TestRunner.run(TestRunner.java:585)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
at org.testng.SuiteRunner.run(SuiteRunner.java:286)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1218)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1140)
at org.testng.TestNG.runSuites(TestNG.java:1069)
at org.testng.TestNG.run(TestNG.java:1037)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
Excel 文件的屏幕截图-
我得到的错误是在这一行:
driver.findElement(By.xpath("//input[@type='text']")).sendKeys(sheet.getRow(i).getCell(j) .getStringCellValue());
由于您得到 NullPointerException,您使用的是方法链,最好将其拆分成更小的对象并了解哪个对象实际上为 null 以找到原因。如果没有这些信息,论坛中的人可能无法提供帮助
driver.findElement(By.xpath("//input[@type='text']")).sendKeys(sheet.getRow(i).getCell(j).getStringCellValue());
类似
Element e = driver.findElement(By.xpath("//input[@type='text']")); Row row = sheet.getRow(i); Cell c = row.getCell(j); String val = c.getStringCellValue();
此处的元素、行或单元格可能为空。
问题 - 空指针异常
您正在尝试访问不可用的单元格
sheet.getRow(i).getCell(j+1)
这是试图从当前单元格移至下一个单元格,但该单元格不存在
Excelreader如何工作?
首先获取第一行,然后依次逐一解析所有单元格。如果没有可用的单元格,它将转到下一行。
如果您尝试在同一个循环中访问“两个单元格”(sheet.getRow(i).getCell(j+1)),只有当您在这些单元格中有数据时,它才会起作用,否则会得到 NP 异常,因为那里什么都没有。
这张图片可能会让你明白
解法:
//rows
for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
Row row = sheet.getRow(i);
//cells
for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
// gettingrow cell
Cell cell = row.getCell(j);
driver.findElement(By.xpath("//input[@type='text']")).sendKeys(cell.getStringCellValue());
driver.findElement(By.xpath("//input[@type='password']")).sendKeys(cell.getStringCellValue());
driver.findElement(By.xpath("//input[@type='submit']")).click();
Thread.sleep(5000);
String actualTitle = driver.getTitle();
String expectedTitle = "Home Page";
SoftAssert sassert = new SoftAssert();
sassert.assertEquals(actualTitle, expectedTitle);
sassert.assertAll();
}
}
也 - 使用 getPhysicalNumberOfRows() - 它 return 只有 rows/cells 有数据。
稍后更新 NP 异常
您需要将网络驱动程序添加为 excel 方法的参数。 webdriver获取实例但是当readExcel方法使用的是null,所以需要传递初始化对象
将方法改为
public void readExcel(String filePath, String fileName, String sheetName, WebDriver driver)
以及对
的调用newTest.readExcel(filePath, "Book2.xlsx", "Sheet1", driver);
它会起作用。