extent report 2.41 throws null pointer when logger is in method ( class 1) called from method (class 2) - selenium

java.lang.NullPointerException
at runnerClasses.Class1.meth1(Class1.java:106)
at runnerClasses.Class2.meth2(Class2.java:72)
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:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:661)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:744)
at org.testng.TestRunner.run(TestRunner.java:602)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
at org.testng.SuiteRunner.run(SuiteRunner.java:289)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
at org.testng.TestNG.runSuites(TestNG.java:1144)
at org.testng.TestNG.run(TestNG.java:1115)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
Here is the code
public class Class1Method1{
public ExtentReports report;
ExtentTest logger;
#BeforeClass
public void somemeth(){
report = new ExtentReports(System.getProperty("user.dir") + "\\src\\test\\java\\Reports\\TestReport.html", false, DisplayOrder.NEWEST_FIRST);
report.loadConfig(new File(System.getProperty("user.dir") + "\\src\\test\\java\\Reports\\extent-config.xml"));
logger = report.startTest("desc", "Test1");
}
#Test()
public void meth1(String some1){
logger.log(LogStatus.PASS, "desc");
}
#AfterClass
public void afterreports(){
report.flush();
driver.quit();
}
}
Class2Method2{
public ExtentReports report;
ExtentTest logger;
#BeforeClass
public void somemeth1(){
report = new ExtentReports(System.getProperty("user.dir") + "\\src\\test\\java\\Reports\\TestReport.html", false, DisplayOrder.NEWEST_FIRST);
report.loadConfig(new File(System.getProperty("user.dir") + "\\src\\test\\java\\Reports\\extent-config.xml"));
logger = report.startTest("desc", "Test1");
}
#Test()
public void meth2() throws InterruptedException {
class1.meth1("Para1")
}
#AfterClass
public void afterreports(){
report.flush();
driver.quit();
}
}
extent report 2.41 throws null pointer when logger is in method ( class 1) called from method (class 2)
extent logger is in method of class1 which is being called in method of class2.
if I comment the extent report logger in Class1Method1, code works well..am i missing something???
unable to edit here anymore...

Related

Getting java.lang.NullPointerException in Selenium WebDriver

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)
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"));}
}

How to resolve java.lang.NullPointerException in Page Object Model in Selenium?

TestBase Class:-
public class TestBase {
public static WebDriver driver;
public static Properties prop;
// TestBase class constructor is used to initialize the properties object to
// fetch config variables from config.properties file.
public TestBase() {
try {
// File src = new File("./src/main/java/com/config/config.properties");
File src = new File(".\\src\\main\\java\\com\\config\\config.properties");
FileInputStream fs = new FileInputStream(src);
prop = new Properties();
prop.load(fs);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void initialization() throws InterruptedException {
String browserName = prop.getProperty("Browser");
if (browserName.equals("chrome")) {
System.setProperty("webdriver.chrome.driver", "C:\\Selenium\\chromedriver_win32\\chromedriver.exe");
driver = new ChromeDriver();
} else {
System.out.println("Oops! Exception has Caught");
}
driver.manage().window().maximize();
driver.get(prop.getProperty("URL"));
}
}
HomePage Class:-
public class HomePage extends TestBase {
TestUtil testUtil;
#FindBy(xpath = "//a[#title='Update your profile, personal settings, and more']")
WebElement updateProfile;
#FindBy(xpath = "//a[#title='Create a New Post']")
WebElement createNewPost;
#FindBy(xpath="(//span[#class='count'])[2]")
WebElement drafts;
#FindBy(xpath="//a[#class='button masterbar__recent-drafts-see-all is-compact is-borderless']")
WebElement seeAll;
public HomePage() {
PageFactory.initElements(driver, this);
}
public ProfilePage updateYourProfile() throws AWTException, InterruptedException {
updateProfile.click();
Thread.sleep(3000);
return new ProfilePage();
}
public NewPostPage createNewPost() throws InterruptedException {
createNewPost.click();
Thread.sleep(3000);
return new NewPostPage();
}
public DraftsPage draftsPage() throws InterruptedException {
createNewPost.click();
Thread.sleep(3000);
drafts.click();
Thread.sleep(3000);
seeAll.click();
Thread.sleep(3000);
return new DraftsPage();
}
}
DraftsPage Class:-
public class DraftsPage extends TestBase {
#FindBy(xpath="(//button[#title='Toggle menu'])[1]")
WebElement toggleMenu;
#FindBy(xpath="(//button[#role='menuitem'])[2]")
WebElement trash;
public void toggleMenu() throws InterruptedException {
toggleMenu.click();
Thread.sleep(3000);
trash.click();
Thread.sleep(3000);
}
}
DraftsPageTest Class:-
public class DraftsPageTest extends TestBase {
ProfilePage myProfile;
LoginPage loginpage;
HomePage homepage;
NewPostPage newPostPage;
DraftsPage draftspage;
public DraftsPageTest() {
super();
}
#BeforeMethod
public void setUp() throws InterruptedException {
initialization();
loginpage = new LoginPage();
loginpage.login();
Thread.sleep(3000);
loginpage.userName(prop.getProperty("username"));
Thread.sleep(3000);
homepage = loginpage.password(prop.getProperty("password"));
Thread.sleep(3000);
myProfile = new ProfilePage();
Thread.sleep(3000);
newPostPage = new NewPostPage();
Thread.sleep(3000);
draftspage = new DraftsPage();
Thread.sleep(3000);
}
#Test
public void DraftsPageTest() throws InterruptedException {
homepage.draftsPage();
Thread.sleep(3000);
draftspage.toggleMenu();
Thread.sleep(3000);
}
#AfterMethod
public void close() {
driver.close();
}
}
Error Message:-
FAILED: DraftsPageTest
java.lang.NullPointerException
at com.pages.DraftsPage.toggleMenu(DraftsPage.java:18)
at com.testCases.DraftsPageTest.DraftsPageTest(DraftsPageTest.java:51)
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:114)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
Description:-
I am trying to develop TestNG Framework with the help of Selenium.
I have developed HomePage, LoginPage, ProfilePage, NewPostPage, DraftsPage. While I was running the DraftsPageTest.java, #BeforeMethod was working fine
and the moment control comes to #Test, homepage.draftsPage(); is also working fine. But the moment control comes to draftspage.toggleMenu(); it is throwing
java.lang.NullPointerException.
Any help will be highly appreciated.
Thanks in advance:)
There's a bug in your code.
Please add a constructor which calls PageFactory.initElements(driver, this); to your com.pages.DraftsPage class [ similar to the HomePage constructor in your shared code ]. That should fix the problem.
The reason behind the NullPointerException is because, there's no call to PageFactory.initElements() the WebElement toggleMenu is not being initialised.

Error while executing Selenium script - java.lang.NullPointerException - TestNG

I'm trying to run a script via testNG. But getting java.lang.NullPointerException. I have put in the driver initialisation code in BeforeMethod and rest of the code under Test. Please let me know what's wrong in my script due which Im getting the error.Thanks in Advance.
My Script:
public class NewTest {
WebDriver driver = null;
#BeforeMethod
public void beforeMethod() {
System.setProperty("webdriver.chrome.driver", Constants.Chrome_Driver);
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get("http://" + Constants.auth_Username + ":" + Constants.auth_Password + "#" + Constants.URL);
}
#Test
public void f() throws InterruptedException {
actions.Admin_Login.txbx_aUsername(driver).sendKeys(Constants.aUsername);
actions.Admin_Login.txbx_aPassword(driver).sendKeys(Constants.aPassword);
actions.Admin_Login.btn_login(driver).click();
actions.create(driver).click();
Actions action = new Actions(driver);
action.moveToElement(actions.create.list(driver)).build().perform();
actions.create_list.list_category(driver).click();
actions.create_list.list_ceate_category(driver).click();
actions.create_list.txtbx_Cat_tile(driver).sendKeys(Constants.list_title);
actions.create_list.btn_Cat_Save(driver).click();
System.out.println("List Created Successfully");
}
}
I am using PageObjects to get the data. This script is running fine without testNG. But when I convert the test into testNG and execute, it throws error.
Error I am facing:
java.lang.NullPointerException
at actions.Admin_Login.txbx_aUsername(Admin_Login.java:13)
at testScripts.NewTest.f(NewTest.java:43)
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:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:580)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:716)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:988)
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:114)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
Constants Class :
public class Constants {
public static final String URL_Shika = "url";
public static final String list_Title = "Test";
public static final String aUsername = "Test";
public static final String aPassword = "abcd123";
public static final String uUsername = "Test01";
public static final String uPassword = "abcd123";
public static final String vUsername = "test321";
public static final String vPassword = "abcd123";
public static final String auth_Username = "admin";
public static final String auth_Password = "admin#123";
public static final String FF_Driver = "/path/geckodriver";
public static final String Chrome_Driver = "/path/chromedriver";
}
Action Class:
public class Admin_Login {
private static WebElement element = null;
public static WebElement txbx_aUsername (WebDriver driver) {
element = driver.findElement(By.id("username"));
return element;
}
public static WebElement txbx_aPassword (WebDriver driver) {
element = driver.findElement(By.id("password"));
return element;
}
}
The driver object you are initialising in #BeforeMethod is not visible in your test method. Try following:
public class NewTest {
WebDriver driver = null;
#BeforeMethod
public void beforeMethod() {
System.setProperty("webdriver.chrome.driver", Constants.Chrome_Driver);
//Pay close attention this below line. Notice how we are not creating a new WebDriver variable
//but we are just initialising the class level data member here
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.get("http://" + Constants.auth_Username + ":" + Constants.auth_Password + "#" + Constants.URL);
}
#Test
public void f() throws InterruptedException {
Admin_Login.txbx_aUsername(driver).sendKeys(Constants.aUsername);
Admin_Login.txbx_aPassword(driver).sendKeys(Constants.aPassword);
Admin_Login.btn_login(driver).click();
actions.create(driver).click();
Actions action = new Actions(driver);
action.moveToElement(actions.create.list(driver)).build().perform();
//Create a Course Category
actions.create_list.list_category(driver).click();
actions.create_list.list_ceate_category(driver).click();
actions.create_list.txtbx_Cat_tile(driver).sendKeys(Constants.list_title);
actions.create_list.btn_Cat_Save(driver).click();
System.out.println("List Created Successfully");
}
}
Please try to wait for the text box to appear, before entering any data using following code:
public static WebElement txbx_aUsername (WebDriver driver) {
WebDriverWait w = new WebDriverWait(driver, 30);
w.until(ExpectedConditions.visibilityOfElementLocated(By.id("username")));
return driver.findElement(By.id("username"));
}
Let me know, if you still face any issue.

Null pointer exception when calling a Page Object Model class

I am trying my hands on Selenium test automation using TestNG as the test framework. For this, I have used a Page Object pattern to model each of the page of the website that I am writing the test for.
I have two java classes
SignInPage.java (Page Object Model Class)
TestLogin.java (where the actual test is written and where the SignInPage is instantiated)
SignInPage.java
public class SignInPage {
private WebDriver driver;
#FindBy(id = "username")
private WebElement usernameTextbox;
#FindBy(id = "password")
private WebElement passwordTextbox;
#FindBy(xpath = "//*[#id=\"left\"]/div[3]/div/form/input[3]")
private WebElement loginButton;
public SignInPage(WebDriver driver) {
this.driver = driver;
driver.get("www.somewebsite.com");
}
public HomePage performLogin(String username, String password){
usernameTextbox.sendKeys(username);
passwordTextbox.sendKeys(password);
loginButton.click();
return PageFactory.initElements(driver, HomePage.class);
}
}
TestLogin.java
public class TestLogin {
public WebDriver driver;
#BeforeClass
public void setup(){
System.setProperty("webdriver.chrome.driver", "path_to_chromedriver.exe");
driver = new ChromeDriver();
}
#Test
public void TestSignIn(){
SignInPage signInPage = new SignInPage(driver);
HomePage homePage = signInPage.performLogin("someusername","somepassword");
}
}
My problem is whenever the signInPage.performLogin() is invoked in the #Test of TestLogin.java, a null pointer exception is encountered.
java.lang.NullPointerException
at com.tipidpc.webpages.SignInPage.performLogin(SignInPage.java:30)
at com.tipidpc.tests.TestLogin.TestSignIn(TestLogin.java:26)
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:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:645)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:851)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1177)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
at org.testng.TestRunner.privateRun(TestRunner.java:756)
at org.testng.TestRunner.run(TestRunner.java:610)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:387)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
at org.testng.SuiteRunner.run(SuiteRunner.java:289)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1218)
at org.testng.TestNG.runSuites(TestNG.java:1133)
at org.testng.TestNG.run(TestNG.java:1104)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:127)
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:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
I solved the issue. Since I was using the TestNG framework to run my tests, the proper imports must be present for the test script to run properly.
All my driver initialization is being done in the #BeforeClass method but it uses the import org.junit.BeforeClass. The solution was to change this to org.testng.annotations.BeforeClass.

null pointer exception_using java selenium webdriver with TestNG

when execute the code below , null pointer exception is occures, as driver of class Pom_MainHerokuapp is always null
testcases:-
package testcases;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
import poms.Pom_MainHerokuapp;
import testbase.TestBase;
public class MainHerokuapp extends TestBase {
Pom_MainHerokuapp mainHerokuappObject;
public MainHerokuapp() {
mainHerokuappObject = new Pom_MainHerokuapp(driver);
}
#Test(priority = 0)
public void TestMainpagetitle() {
mainHerokuappObject.VerifyTitles();
}
#Test(priority = 1)
public void TestABTestingText() {
mainHerokuappObject.VerifyTextOfABTesting();
}
}
TestBase class:-
package testbase;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.BeforeTest;
public class TestBase {
public WebDriver driver;
#BeforeTest
public void setup() {
driver = new FirefoxDriver();
driver.get("https://the-internet.herokuapp.com/");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
}
Also:
package poms;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.testng.Assert;
public class Pom_MainHerokuapp {
public WebDriver driver;
String text;
String StringMaintext;
String Stringsubtitle;
#FindBy(xpath = "//html//body//div[2]//div//h1")
WebElement Maintitle;
#FindBy(xpath = "//html//body//div[2]//div//h2")
WebElement Subtitle;
#FindBy(linkText = "A/B Testing")
WebElement ABTesting;
#FindBy(xpath = "//html//body//div[2]//div//div//h3")
WebElement ABTestingText;
create constructor of this class
public Pom_MainHerokuapp(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this); // Initialization all webelements
}
public void VerifyTitles() {
StringMaintext = Maintitle.getText();
Stringsubtitle = Subtitle.getText();
System.out.println(StringMaintext);
System.out.println(Stringsubtitle);
Assert.assertEquals(StringMaintext, "Welcome to the Internet");
Assert.assertEquals(Stringsubtitle, "Available Examples");
}
public void VerifyTextOfABTesting() {
ABTesting.click();
text = ABTestingText.getText();
System.out.println(text);
Assert.assertEquals(text, "A/B Test Variation 1");
}
}
the error is :-
FAILED: TestMainpagetitle java.lang.NullPointerException at
org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at
org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy7.getText(Unknown Source) at
poms.Pom_MainHerokuapp.VerifyTitles(Pom_MainHerokuapp.java:36) at
testcases.MainHerokuapp.TestMainpagetitle(MainHerokuapp.java:28) 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:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:639) at
org.testng.internal.Invoker.invokeTestMethod(Invoker.java:816) at
org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1124) at
org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at
org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:774) at
org.testng.TestRunner.run(TestRunner.java:624) at
org.testng.SuiteRunner.runTest(SuiteRunner.java:359) at
org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354) at
org.testng.SuiteRunner.privateRun(SuiteRunner.java:312) at
org.testng.SuiteRunner.run(SuiteRunner.java:261) at
org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at
org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at
org.testng.TestNG.runSuitesSequentially(TestNG.java:1215) at
org.testng.TestNG.runSuitesLocally(TestNG.java:1140) at
org.testng.TestNG.run(TestNG.java:1048) at
org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:112) at
org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:205) at
org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:176)
FAILED: TestABTestingText java.lang.NullPointerException at
org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at
org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy7.click(Unknown Source) at
poms.Pom_MainHerokuapp.VerifyTextOfABTesting(Pom_MainHerokuapp.java:46)
at testcases.MainHerokuapp.TestABTestingText(MainHerokuapp.java:33)
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:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:639) at
org.testng.internal.Invoker.invokeTestMethod(Invoker.java:816) at
org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1124) at
org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at
org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:774) at
org.testng.TestRunner.run(TestRunner.java:624) at
org.testng.SuiteRunner.runTest(SuiteRunner.java:359) at
org.testng.SuiteRunner.runSequentially(SuiteRunner.java:354) at
org.testng.SuiteRunner.privateRun(SuiteRunner.java:312) at
org.testng.SuiteRunner.run(SuiteRunner.java:261) at
org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at
org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at
org.testng.TestNG.runSuitesSequentially(TestNG.java:1215) at
org.testng.TestNG.runSuitesLocally(TestNG.java:1140) at
org.testng.TestNG.run(TestNG.java:1048) at
org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:112) at
org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:205) at
org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:176)
This isn't hard to explain. The default constructor of your test class MainHerokuapp will be called as soon as it is run, i.e. when driver is still null - before your #BeforeTest method, where driver gets set.
MainHerokuapp and TestBase seem to be mixed-up rather than having a clear separation, so you'd be better off merging them back into one.
Another way is to restore control to the child class by dropping the constructor, moving the #BeforeTest there, and calling up to the parent. This definitely works:
public class MainHerokuapp extends TestBase {
Pom_MainHerokuapp mainHerokuappObject;
#BeforeTest
public void setup() {
super.setup();
mainHerokuappObject = new Pom_MainHerokuapp(driver);
}
#Test(priority = 0)
public void TestMainpagetitle() {
mainHerokuappObject.VerifyTitles();
}
#Test(priority = 1)
public void TestABTestingText() {
mainHerokuappObject.VerifyTextOfABTesting();
}
}
public class TestBase {
public WebDriver driver;
// #BeforeTest
public void setup() {
driver = new FirefoxDriver();
driver.get("https://the-internet.herokuapp.com/");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
}
I also get the same error while I didnt mention the static but when I wrote
public static WebDriver driver = null;
in TestBase class it was working fine.