0

I am getting java.lang.NullPointerException when I run the testcase in Eclipse. Can somebody help me in pointing out the error I have made.

Error @ Line 17: WebElement in LoginPage.Java. @ Line 12: LoginPage in TC_LoginTest_001.java.

**LoginPage.Java**

package com.internetBanking.pageObjects;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class LoginPage {
    
    WebDriver driver;
    
    public LoginPage (WebDriver driver) {
            
        this.driver = driver;
        
    }
    
    WebElement usrname = driver.findElement(By.name("uid"));
    WebElement pwd = driver.findElement(By.name("password"));
    WebElement login = driver.findElement(By.name("btnLogin"));
    
    public void setUsrname(String uname) {
        usrname.sendKeys(uname);
    }

    public void setPwd(String pswd) {
        pwd.sendKeys(pswd);
    }

    public void login() {
        
        login.click();
    }

}

**TC_LoginTest_001.java**

package com.internetBanking.testCases;
import org.testng.annotations.Test;
import com.internetBanking.pageObjects.LoginPage;
public class TC_LoginTest_001 extends BaseClass {
    
    @Test
    public void LoginTest() {
                
        driver.get(baseURL);
        logger.info("URL is opened");
        
        LoginPage loginPage = new LoginPage(driver);
        
        loginPage.setUsrname(username);
        logger.info("Username is entered");
        
        loginPage.setPwd(password);
        logger.info("Password is entered");
        
        loginPage.login();                                         
        logger.info("Login button is clicked");
        
    }
}

When I run the test case, I am getting the below errors:

java.lang.NullPointerException at com.internetBanking.pageObjects.LoginPage.(LoginPage.java:17) at com.internetBanking.testCases.TC_LoginTest_001.LoginTest(TC_LoginTest_001.java:12) 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:124) at org.testng.internal.Invoker.invokeMethod(Invoker.java:583) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989) 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:648) at org.testng.TestRunner.run(TestRunner.java:505) at org.testng.SuiteRunner.runTest(SuiteRunner.java:455) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415) at org.testng.SuiteRunner.run(SuiteRunner.java:364) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208) at org.testng.TestNG.runSuitesLocally(TestNG.java:1137) at org.testng.TestNG.runSuites(TestNG.java:1049) at org.testng.TestNG.run(TestNG.java:1017) at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

2
  • 1
    Did you initialize your web driver? Do you have something like this : driver=new ChromeDriver(options); befor you are searching for the elements? Commented Feb 10, 2021 at 20:13
  • Driver.get is working ? In login test ? Commented Feb 10, 2021 at 20:13

1 Answer 1

1

Consider this code:

public class MainTest {
    public static void main(String[] args) {
        new Test(new Object());
    }
}

class Test {
    InitMe initMe = new InitMe();
    public Test(Object o){
        System.out.println("Test instance has been created");
    }
}

class InitMe{
    public InitMe(){
        System.out.println("Init me instance has been created");
    }
}

If you run it you will see the following output:

Init me instance has been created
Test instance has been created

which means that fields are initialized before the constructor is executed. So in your case you have the following structure:

public class MainTest {
    public static void main(String[] args) {
        new Test(new Object());
    }
}

class Test {
    Object o;
    String oStr = o.toString();
    public Test(Object o){
        this.o = o;
    }
}

where your fields are initialized through the reference that has not been yet initialized itself (because the constructor has not yet been called).

Your particular solution would be to change this:

    WebDriver driver;
    
    public LoginPage (WebDriver driver) {
            
        this.driver = driver;
        
    }
    
    WebElement usrname = driver.findElement(By.name("uid"));
    WebElement pwd = driver.findElement(By.name("password"));
    WebElement login = driver.findElement(By.name("btnLogin"));

to this:

    WebDriver driver;
    WebElement usrname;
    WebElement pwd;
    WebElement login;
    
    public LoginPage (WebDriver driver) {
        this.driver = driver;
        usrname = driver.findElement(By.name("uid"));
        pwd = driver.findElement(By.name("password"));
        login = driver.findElement(By.name("btnLogin"));}
    }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.