2017-10-18 64 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提供了一个更好的解决方案。