Below is my Testbase class:
public class TestBase { public static WebDriver driver; //Initialise web-driver public static Properties prop; public TestBase() { try { prop= new Properties(); FileInputStream ip= new FileInputStream("/Users/admin/Desktop/BASE_AutomationTests/src/main/java/com/base/Config/config.properties"); prop.load(ip); }catch (FileNotFoundException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } } //** Write the code for reading the property of browser public static void initialization() { String browserName=prop.getProperty("browser"); if (browserName.equals("chrome")) { System.setProperty("webdriver.chrome.driver", "/C:/Users/admin/Desktop/BASE-Automation/chromedriver_win32/chromedriver.exe/"); driver = new ChromeDriver(); } driver.manage().window().maximize(); driver.get(prop.getProperty("url")); } }
My VerifyLaydownlogintest as below:
public class VerifyLaydownLoginTest extends TestBase { // LoginPage loginpage; HomePage homepage; //**Creating a constructor with Super so that after construction is called the Super keay word initialise properties of TestBase class first //** Super keyword = to call super class constructor i.e TestBase class public VerifyLaydownLoginTest() { super(); } @BeforeMethod public void setUp() { initialization(); loginpage= new LoginPage(); } @Test(priority= 1) public void loginTest() { loginpage.loginToBase(prop.getProperty("username"),prop.getProperty("password")); } @Test(priority=2) public void loginLaydownTest() { homepage=loginpage.changeLogin(); //**changeLogin method is returning you the object of Homepage class, so we can store it in a object } @AfterMethod public void tearDown() { driver.close(); } }
And this is my Login page class:
/** * */ package com.base.Pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import com.base.Baseclass.TestBase; /** * @author ketaki * This class will store all the locators and methods of Login page * */ public class LoginPage extends TestBase{ @FindBy(id="inputUsername") // Same as writing driver.findelement WebElement username; @FindBy(id="inputPassword") WebElement password; @FindBy(name="_submit") WebElement submit_button; //*** Initialise all these elements with the help pf page factory public LoginPage () { PageFactory.initElements(driver, this); } //** Write all the login functions methods public void loginToBase(String userid, String pass) { username.sendKeys(userid); password.sendKeys(pass); submit_button.click(); } public HomePage changeLogin() { driver.navigate().to("https://uat-heineken.base.website/?_switch_user=alaric.james"); driver.get("https://uat-heineken.base.website/#!/budget/?tab=edit"); return new HomePage(); } }
This is error of NPE:
RemoteTestNG] detected TestNG version 6.14.3 [TestNGContentHandler] [WARN] It is strongly recommended to add "<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >" at the top of your file, otherwise TestNG may fail or not work as expected. FAILED CONFIGURATION: @BeforeMethod setUp java.lang.NullPointerException: Cannot invoke "org.openqa.selenium.WebDriver.manage()" because "com.base.Baseclass.TestBase.driver" is null at com.base.Baseclass.TestBase.initialization(TestBase.java:42) at VerifyLaydownLoginTest.setUp(VerifyLaydownLoginTest.java:40) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124) at org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:59) at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:458) at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:222) at org.testng.internal.Invoker.invokeMethod(Invoker.java:523) 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)
I tried to resolve this but unable to find the root cause. Where am I going wrong?
My config.properties
url = https://uat-heineken.base.website/#!/ username = ketaki.naik password = 123456 browser = chrome
Advertisement
Answer
You are using TestNG
as your test automation framework.
In TestNG
, execution will take place according to the annotation that you define in your test
class.
@BeforeMethod
has higher priority than @Test
or @AfterMethod
and if you take a look at your @BeforeMethod
@BeforeMethod public void setUp() { initialization(); loginpage= new LoginPage(); }
the first method that you are calling is initialization();
and the first line in that method is String browserName=prop.getProperty("browser");
You are calling prop
here from public static Properties prop;
and it is a static variable and you’ve not initialized it there, hence you are getting the NPE
. Since prop
is just a variable
that you are trying to access.
You should rather create an object of TestBase
class in your @BeforeMethod
Something like this:
@BeforeMethod public void setUp() { TestBase base = new TestBase(); base.initialization(); loginpage= new LoginPage(); }
Now once you create an instance of TestBase like above, the below constructor will get invoked
public TestBase() { try { prop= new Properties(); FileInputStream ip= new FileInputStream("/Users/admin/Desktop/BASE_AutomationTests/src/main/java/com/base/Config/config.properties"); prop.load(ip); }catch (FileNotFoundException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } }
And since prop
is a static variable
, the assigned value to this variable will persist.