2017-10-18 65 views
1

我有以下的硒結構,我在瀏覽器啓動後面臨錯誤&最大化。當@ Test方法開始執行時,我得到Java空指針異常。Selenium:Java空指針異常

請提出一個解決方案

基類:

public class BaseClass 

{ 


    public static WebDriver driver ; 

    public BaseClass(WebDriver _driver) 
    { 
     driver = _driver; 
    } 

    public WebElement FirstName = driver.findElement(By.name("firstname")); 
    public WebElement LastName = driver.findElement(By.name("LastName")); 




    public String GetFirstName() 
    { 
     return FirstName.getText(); 

    } 

    public String GetLastName() 
    { 
     return LastName.getText(); 
    } 


    public WebDriver SetFirstname(String FirstName) 
    { 
     this.FirstName.sendKeys(FirstName); 
     return driver; 
    } 

    public WebDriver SetLastname(String LastName) 
    { 
     this.LastName.sendKeys(LastName); 
     return driver; 
    } 

} 

測試類:

public class TestClassTest 

{ 

    public static WebDriver driver =null; 
    private String Url =""; 
    private String DriverOption=""; 
    private String DriverPath=""; 

    private String Firstname= ""; 
    private String LastName= ""; 



    @BeforeSuite(alwaysRun = true) 
    public void setupBeforeSuite(ITestContext context) throws IOException 
    { 

    Url = context.getCurrentXmlTest().getParameter("URL"); 

    DriverOption = context.getCurrentXmlTest().getParameter("DriverOptions"); 

    DriverPath = context.getCurrentXmlTest().getParameter("DriverPath"); 


    Firstname= ReadValue_XL(driver,0,0); 

    LastName= ReadValue_XL(driver,0,1); 

    } 

    @Parameters("Browser") 
    @BeforeTest 
    public void SetUp(String Browser) 
    { 
     if(Browser.equalsIgnoreCase("chrome")) 
     { 
     System.setProperty(DriverOption,DriverPath); 

     driver = new ChromeDriver(); 
     } 

     if(Browser.equalsIgnoreCase("firefox")) 
     { 
     System.setProperty(DriverOption, DriverPath); 

     driver = new FirefoxDriver(); 
     } 

     driver.get(Url); 

     driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); 

     driver.manage().window().maximize(); 



    } 


    @Test (priority = 1) 
    public void TestOne() 
    { 
     BaseClass Base= new BaseClass(driver); 

     Base.SetFirstname(Firstname); 
     Base.SetLastname(LastName); 

     Assert.assertEquals(Base.GetFirstName(), "Dog Food"); 


    } 



    @AfterTest 
    public void Driver_close() 
    { 
     driver.close(); 
     driver.quit(); 
    } 


    public String ReadValue_XL(WebDriver driver,int Row,int Column) throws IOException 
    { 
     XSSFWorkbook WrkBk = new XSSFWorkbook(".\\Input\\Input.xlsx"); 

     XSSFSheet sourceSheet = WrkBk.getSheet("Sheet1"); 

     XSSFRow sourceRow = sourceSheet.getRow(Row); 

     XSSFCell cell1=sourceRow.getCell(Column); 

     cell1.toString(); 

     WrkBk.close(); 

     return cell1.toString(); 

    } 
} 

錯誤:

java.lang.NullPointerException 
    at baseProject.BaseClass.<init>(BaseClass.java:19) 
    at TestProject.TestClassTest.TestOne(TestClassTest.java:88) 
    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:108) 
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:669) 
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:877) 
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1201) 
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125) 
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109) 
    at org.testng.TestRunner.privateRun(TestRunner.java:776) 
    at org.testng.TestRunner.run(TestRunner.java:634) 
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:425) 
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:420) 
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:385) 
    at org.testng.SuiteRunner.run(SuiteRunner.java:334) 
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) 
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) 
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1318) 
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1243) 
    at org.testng.TestNG.runSuites(TestNG.java:1161) 
    at org.testng.TestNG.run(TestNG.java:1129) 
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114) 
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) 
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77) 

我能夠理解驅動程序未在基類中正確解析或初始化。請建議我必須解決此問題的位置。

當我在testclass中擴展基類時,沒有TestNG類正在運行。

+4

可能重複[什麼是NullPointerException,以及如何解決它?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-doi-i-fix -它) – rmlan

回答

2

Initialisers構造之前被調用,因此,NullPointerException,嘗試下面的代碼:

public class BaseClass{ 

    public static WebDriver driver; 

    public BaseClass(WebDriver _driver){ 
     driver = _driver; 
     FirstName = driver.findElement(By.name("firstname")); 
     LastName = driver.findElement(By.name("LastName")); 
    } 

    public WebElement FirstName; 
    public WebElement LastName; 
    //Rest of the code 
1

@DarshanMehta具有很好的解釋的問題及其解決方案。我剛剛測試過它,它工作。我還要補充:

你正面臨的問題已經在Stackoverflow中得到了很好的討論。我覺得這個鏈接可以給你更好的理解執行順序的,當一個類實例化: Are fields initialized before constructor code is run in Java?

因此,你可以在第一個答案讀取初始化塊構造的超()部分後進行,但在構造函數的其餘部分之前。

如果例如,您的驅動程序初始化爲BaseClass的超類,則您不會產生此錯誤。 因此,如果您確實想要在初始化塊中初始化FirstNameLastName,則可以創建BaseTest將從中繼承的超類。它應該可以解決你的問題。

你可以試試下面的代碼,這說明它:創建一個超類:

public class MotherClass { 
    public MotherClass(WebDriver _driver){ 
     driver = _driver; 
    } 

    WebDriver driver; 
} 

和BaseClass的的構造,從MotherClass繼承添加超:

public class Testasupp extends MotherClass{  
    public BaseClass(WebDriver _driver) 
     { 
      super(_driver); 
      FirstName = driver.findElement(By.name("firstname")); 
      LastName = driver.findElement(By.name("LastName")); 
     } 

總括:除非您有充分的理由喜歡這個解決方案,我真的認爲@DashanMehta提供了一個更好的解決方案。