2015-07-10 92 views
0

我是学习Selenium WebDriver和Java的一周新手。Selenium中的java.lang.NullPointerException TestNG

我试着创建一个测试脚本来运行TestNG。

我有2个java文件和低于1周的testng.xml:

[1] adminBase.java

package automation; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.CacheLookup; 
import org.openqa.selenium.support.FindBy; 

import jxl.Sheet; 
import jxl.Workbook; 
import jxl.read.biff.BiffException; 

public class adminBase { 
static WebDriver driver; 
public static String appURL = "https://00.0.00.00:0000/admin/"; 
public static String testData = "C:\src\TestData.xls"; 

//Declare fields on pageObject that are webElements 
@FindBy(id = "j_username") 
static WebElement username; 
@CacheLookup 

@FindBy(id = "j_password") 
static WebElement password; 
@CacheLookup 

@FindBy(id = "login") 
static WebElement loginBtn; 

@FindBy(xpath = ".//*[@id='LogoutForm']/li/span/a") 
static WebElement logoutBtn; 


//This method will take two arguments (Username and Password) 
public void loginInfo(String sUsername, String sPassword){ 
    username.sendKeys(sUsername); 
    password.sendKeys(sPassword); 
    loginBtn.click(); 
    } 

//To read Excel file 
public String[][] getExcelData(String fileName, String sheetName) { 
    String[][] arrayExcelData = null; 
    try { 
     FileInputStream fs = new FileInputStream(fileName); 
     Workbook wb = Workbook.getWorkbook(fs); 
     Sheet sh = wb.getSheet(sheetName); 

     int totalNoOfCols = sh.getColumns(); 
     int totalNoOfRows = sh.getRows(); 

     arrayExcelData = new String[totalNoOfRows-1][totalNoOfCols]; 
     for (int i=1; i<totalNoOfRows; i++){ 
      for (int j=0; j<totalNoOfCols; j++){ 
       arrayExcelData[i-1][j] = sh.getCell(j, i).getContents(); 
      } 
     } 
    } 
    catch (FileNotFoundException e){ 
     e.printStackTrace(); 
    } 
    catch (IOException e){ 
     e.printStackTrace(); 
    } 
    catch (BiffException e){ 
     e.printStackTrace(); 
    } 
    return arrayExcelData; 
} 
} 

并且还[2] adminLogin.java

package automation; 

import org.testng.annotations.Test; 
import org.testng.annotations.BeforeMethod; 

import java.util.concurrent.TimeUnit; 

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.testng.annotations.AfterMethod; 
import org.testng.annotations.DataProvider; 

public class adminLogin { 
WebDriver driver; 
adminBase adminbase; 
String testData; 

@BeforeMethod 
public void beforeTest() throws Exception { 
    driver = new FirefoxDriver(); 
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
    //adminbase = PageFactory.initElements(driver, adminBase.class); 
} 

@DataProvider(name="loginInfo") 
public Object[][] getData() throws Exception { 
    Object[][] user = adminbase.getExcelData(testData, "adminLogin"); 
    return user; 
} 

@Test(dataProvider="loginInfo") 
public void test(String appURL, String sUsername, String sPassword) 
throws Exception { 
    driver.get(appURL); 
    adminbase.loginInfo(sUsername, sPassword); 
} 

@AfterMethod 
public void afterTest() throws InterruptedException{ 
    Thread.sleep(3000); 
    driver.quit(); 
} 
} 

[ 3] testng.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="Suite"> 
    <test name="Test"> 
    <classes> 
    <class name = "automation.adminLogin"/> 
    </classes> 
    </test> <!-- Test --> 
</suite> <!-- Suite --> 

但是,我得到异常

java.lang.RuntimeException: java.lang.NullPointerException 
at org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:161) 
at org.testng.internal.Parameters.handleParameters(Parameters.java:429) 
at org.testng.internal.Invoker.handleParameters(Invoker.java:1383) 
at org.testng.internal.Invoker.createParameters(Invoker.java:1075) 
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1180) 
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) 
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) 
at org.testng.TestRunner.privateRun(TestRunner.java:767) 
at org.testng.TestRunner.run(TestRunner.java:617) 
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) 
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) 
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) 
at org.testng.SuiteRunner.run(SuiteRunner.java:240) 
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224) 
at org.testng.TestNG.runSuitesLocally(TestNG.java:1149) 
at org.testng.TestNG.run(TestNG.java:1057) 
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111) 
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204) 
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) 
Caused by: java.lang.NullPointerException 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at automation.adminBase.getExcelData(adminBase.java:48) 
    at automation.adminLogin.getData(adminLogin.java:27) 
    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:84) 
    at org.testng.internal.MethodInvocationHelper.invokeDataProvider(MethodInvocationHelper.java:135) 
    ... 20 more 

下面从我的理解在adminLogin.java文件行automation.adminLogin.getData(adminLogin.java:27)

27行有错误是这样一行:

(Object[][] user = adminbase.getExcelData(testData, "adminLogin"); 

我明白,错误可能是由于我传递参数为null。但我只是不知道如何解决,因为我没有得到我的文件中的任何错误

我的代码真的很乱。因为我只是混搭而已。 我真的很抱歉谁读了我的代码头痛。 >。 <

请注意并帮助我改进。 谢谢!

+1

你用'调试器'尝试?找出这种问题的最好方法是'debuger' –

+0

Hi @RuchiraGayanRanaweera 你能告诉我如何使用调试器吗? – dieyb

+0

当然。你用于编码的IDE是什么?那里有调试选项。 –

回答

0

看起来您并未在AdminLogin类中的任何位置设置adminbase变量。

只需更换:

adminBase adminbase; 

有:

adminBase adminbase = new adminBase(); 

,如果你只是想adminBase类的一个实例。

另外按照惯例,建议使用大写字母开头的类名。 (即AdminBase和AdminLogin)

注意: 此答案只是解决您的直接问题。你的代码实际上可以做一些全面的改进。如果您希望其他人仔细查看您的代码,并为您提供有关如何改进代码的指示,我建议您在CodeReview site

+0

Hi @Ceiling Gecko, 试过你的解决方案,但我得到了新的错误。基本上错误是: 'java.lang.RuntimeException:java.lang.NullPointerException at java.io.FileInputStream。 (未知来源) 来自java.io.FileInputStream。 (来源不明) 在automation.adminBase.getExcelData(adminBase.java:48) 在automation.adminLogin.getData(adminLogin.java:27) ... 20 more' **注:** 谢谢为您的建议。会做的。 ^^ – dieyb

0

上提交它。您在FileInputStream fs = new FileInputStream(fileName);getExcelData方法中有例外。

您在如下adminLogin类调​​用getExcelData

Object[][] user = adminbase.getExcelData(testData, "adminLogin"); 

但是testData没有初始化,所以最终要传递到nullFileInputStream

您还宣布testDataadminBase类。如果你想使用它,然后更改代码如下:

FileInputStream fs = new FileInputStream(testData); 
相关问题