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);
Author by
Ashwiinn Karaangutkar
Updated on June 04, 2022Comments
-
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 about 9 yearsYou'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 about 9 yearsI would still work, tho! I used to create "Settings" class as a major settings for all
@Tests
and every@Test
class extendedSettings
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 about 9 yearsAre you trying to suggest
TestRunner extends Login
? -
Fenio about 9 yearsIn this particullary scenario it won't be a good solution, but this is what i meant, answering this question. E.g.:
Login extends BasicSettings
orTestRunner extends Login
-
Ashwiinn Karaangutkar about 9 yearsI 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?