Null Pointer Exception while running code using TestNG

18,422

There are many issues in your scripts

1 - Your classes init separately. The driver from @BeforeClass doesnot inherite into your @Test

2 - When you do

Login lp = new Login();

you have

WebDriver driver = null;
@BeforeClass is not invoked, no driver init, your driver is still null

Then

lp.login(sUserName, sPassword);

NullPointException throws because driver in following line of code is null

driver.get("https://www.facebook.com/");

Suggest action

  • You need to get driver goes through all your classes

TestBase.class

Put your @BeforeClass here

LoginPage.class, be sure you allow to cast driver into it

public LoginPage(WebDriver driver) {
    // your code here
}    

// Put login(sUserName, sPassword) method here

TestRunner.class

inherite/extends from TestBase.class
LoginPage lp = new LoginPage(driver);
lp.login(sUserName, sPassword);
Share:
18,422
Ashwiinn Karaangutkar
Author by

Ashwiinn Karaangutkar

Updated on June 04, 2022

Comments

  • Ashwiinn Karaangutkar
    Ashwiinn Karaangutkar almost 2 years

    I am trying to automate a Login and Logout Scenario in TestNG and passing the browser as parameter from XML on the basis of which chromedriver() instance will be created and the code will run.I have two classes TestRunner and Login where login method gets data (username and password) TestRunner and data is fetched from excel.Exception e is getting null value as I found out while debugging. Any way to fix it?

    FAILED: Registration_data("[email protected]", "ashwin123")
    java.lang.NullPointerException
    at com.DataDriven.Login.login(Login.java:68)
    at com.DataDriven.TestRunner.Registration_data(TestRunner.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at   org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at     org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:12)
    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)
    

        package com.DataDriven;
        import java.util.concurrent.TimeUnit;
        import org.openqa.selenium.By;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.firefox.FirefoxDriver;
        public class TestRunner {
    
        @Test(dataProvider = "Authentication")
        public static void Registration_data(String sUserName, String sPassword)
            throws Exception {
    
        Login lp = new Login();
        lp.login(sUserName, sPassword);
        }
    
        @DataProvider
        public Object[][] Authentication() throws Exception {
    
        Object[][] testObjArray = ReadData.getTableArray(
                "F:\\Automation\\DataDrivenPractice\\DataFiles\\DataFile.xlsx",
                "Sheet1");
    
        return (testObjArray);  }  }
    

        package com.DataDriven;
    
        import java.io.File;
    
        import org.apache.commons.io.FileUtils;
        import org.openqa.selenium.By;
        import org.openqa.selenium.OutputType;
        import org.openqa.selenium.TakesScreenshot;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.chrome.ChromeDriver;
    
        public class Login {
         WebDriver driver = null;
    
         @Parameters("browser")
         @BeforeClass
        // Passing Browser parameter from TestNG xml
        public void beforeTest(String browser) {
    
        // If the browser is Firefox, then do this
    
        if (browser.equalsIgnoreCase("firefox")) {
    
            driver = new FirefoxDriver();
    
            // If browser is IE, then do this
    
          } else if (browser.equalsIgnoreCase("chrome")) {
    
            // Here I am setting up the path for my IEDriver
    
            driver = new ChromeDriver(); } }
    
         public void login(String username, String password) {
            try {
            driver.get("https://www.facebook.com/");
    
            driver.findElement(By.id("email")).sendKeys(username);
            driver.findElement(By.id("pass")).sendKeys(password);
            driver.findElement(By.id("loginbutton")).click();
            driver.findElement(By.linkText("Log Out")).click();
             }
    
           catch (Exception e) {
            File srcfile = ((TakesScreenshot) driver)
                    .getScreenshotAs(OutputType.FILE);
    
            try {
                FileUtils.copyFile(srcfile, new File(
                        "F:\\Automation\\Screenshots\\Login.jpg"));
            } catch (Exception e1) {
                e1.printStackTrace();
            }   }  }}
    

            <?xml version="1.0" encoding="UTF-8"?>
            <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
            <suite name="Suite" parallel="none">
            <test name="FirefoxTest">
             <parameter name="browser" value="chrome" />
             <classes>
             <class name="com.DataDriven.TestRunner" />
             <class name="com.DataDriven.Login" /> 
             </classes>
             </test>
             </suite>
    
  • Ar5hv1r
    Ar5hv1r about 9 years
    You're correct that beforeTest() isn't being called, but your reasoning isn't quite right. TestNG does searches classes for annotations, but only for @Test, all other TestNG annotations are inspected after the classes have been found. Your comment about "setting" extends doesn't make any sense; there's no need to extend anything.
  • Fenio
    Fenio about 9 years
    I would still work, tho! I used to create "Settings" class as a major settings for all @Tests and every @Test class extended Settings class. With this kind of solution, TestNG invokes @BeforeClass and @Test. It's kind of specific solution. I corrected my answer according to your comment. Thanks!
  • Ar5hv1r
    Ar5hv1r about 9 years
    Are you trying to suggest TestRunner extends Login?
  • Fenio
    Fenio about 9 years
    In this particullary scenario it won't be a good solution, but this is what i meant, answering this question. E.g.: Login extends BasicSettings or TestRunner extends Login
  • Ashwiinn Karaangutkar
    Ashwiinn Karaangutkar about 9 years
    I marked my login method as @Test and ran my class now my beforeTest method is getting invoked but now I am getting error as : org.testng.TestNGException: Method login requires 2 parameters but 0 were supplied in the Test annotation. ... Removed 23 stack frames Cant understand why values are not getting supplied, any idea why?