2017-10-18 3 views
1

Ich habe die unten Selen Struktur und ich bin konfrontiert Fehler nach dem Browser gestartet & maximiert. Wenn die @Test-Methode ausgeführt wird, erhalte ich eine Java-Nullzeiger-Ausnahme.Selen: Java Null Zeiger Ausnahme

Bitte legen nahe, eine Lösung

Basisklasse:

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; 
    } 

} 

Testklasse:

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(); 

    } 
} 

Fehler:

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) 

Ich kann verstehen, dass Treiber in Basisklasse nicht ordnungsgemäß analysiert oder initialisiert wird. Bitte geben Sie an, wo ich dieses Problem beheben muss.

Wenn ich Basisklasse in Testklasse erweitern, werden keine TestNG-Klassen ausgeführt.

+4

Mögliche Duplikate von [Was ist eine NullPointerException und wie behebe ich sie?] (Https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -es) – rmlan

Antwort

2

Initialisers werden vor Bauer aufgerufen und damit NullPointerException, versuchen Sie den Code unten:

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 hat auch das Problem und seine Lösung erklärt. Ich habe es gerade getestet und es funktioniert. Ich würde auch hinzufügen:

Das Problem, mit dem Sie konfrontiert sind, wurde in Stackoverflow gut diskutiert. Ich denke, diesen Link können Ihnen ein besseres Verständnis der Reihenfolge der Ausführung geben, wenn eine Klasse instanziiert wird: Are fields initialized before constructor code is run in Java?

So Sie in der ersten Antwort lesen, dass die Initialisierung Block nach dem super() Teil des Konstruktors erfolgt, ABER vor dem Rest des Konstruktors.

Sie hätten diesen Fehler nicht gehabt, wenn zum Beispiel Ihr Treiber in einer Oberklasse von BaseClass initialisiert wurde. Wenn Sie also wirklich Initialisierungsblock FirstName und LastName initialisieren möchten, können Sie eine Oberklasse erstellen, von der BaseTest erbt. Und es sollte dein Problem lösen.

können Sie den folgenden Code versuchen, die es veranschaulicht: eine Superklasse erstellen:

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

    WebDriver driver; 
} 

und fügen Super im Konstruktor von Baseclass, die von MotherClass erbt:

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

Zum Abschluss : Außer wenn Sie einen guten Grund haben, diese Lösung zu bevorzugen, denke ich, dass @DashanMehta eine bessere Lösung bietet.