Getting java.lang.NullPointerException in Selenium WebDriver - selenium

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

Related

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.

Null Pointer Exception in Selenium WebDriver in second page after successful login Page

How to resolve below exception.
Here is code
package com;`
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class Browserfactory {
static WebDriver driver;
public static WebDriver startBrowser(String browserName)
{
if(browserName.equalsIgnoreCase("firefox"))
{
System.setProperty("webdriver.firefox.marionette","geckodriver.exe");
driver = new FirefoxDriver();
}
else if(browserName.equalsIgnoreCase("chrome"))
{
System.setProperty("webdriver.chrome.driver","chromedriver.exe");
driver = new ChromeDriver();
}
return driver;
}
}
Accessing from another class.
below code is written in different class and accessing this as a Base class.
i wanted to make Logout method as utility, when ever required to logout just call it and get done.
package com;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class Guru99 {
//creating a guru99 bank page login verify.
public WebDriver driver=null;
private static final String URL="http://demo.guru99.com/v4/";
#BeforeTest
//pre-requisition
public void launchpage()
{
WebDriver driver = Browserfactory.startBrowser("firefox");
driver.get(URL);
driver.findElement(By.name("uid")).sendKeys("mngr117051");
driver.findElement(By.name("password")).sendKeys("EhYtErY");
driver.findElement(By.name("btnLogin")).click();
}
#Test
public void logout()
{
driver.findElement(By.xpath("html/body/div[2]/div/ul/li[15]/a")).click();
}
}
//Running code through TestNG.
Getting Error
FAILED: logout
java.lang.NullPointerException
at com.Guru99.logout(Guru99.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:100)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:646)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:811)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1137)
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:753)
at org.testng.TestRunner.run(TestRunner.java:607)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:368)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:363)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:321)
at org.testng.SuiteRunner.run(SuiteRunner.java:270)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1284)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1209)
at org.testng.TestNG.runSuites(TestNG.java:1124)
at org.testng.TestNG.run(TestNG.java:1096)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:236)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:81)
That is because of the mistake you have done in your code.
I didn't understand why you have declared driver in 3 places in your code. Whenever you declare same variable again and again its previous value get override every time and that is the reason you are getting NullPointerException.
I have modified your code and verified the working also.
public class Browserfactory {
public static WebDriver startBrowser(WebDriver driver,String browserName) {
if (browserName.equalsIgnoreCase("firefox")) {
System.setProperty("webdriver.firefox.marionette","geckodriver.exe");
driver = new FirefoxDriver();
} else if (browserName.equalsIgnoreCase("chrome")){
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
driver = new ChromeDriver();
}
return driver;
}
}
public class Guru99 {
// creating a guru99 bank page login verify.
public WebDriver driver = null;
private static final String URL = "https://demo.guru99.com/v4";
#BeforeTest
// pre-requisition
public void launchpage() {
driver = Browserfactory.startBrowser(driver,"firefox");
driver.manage().window().maximize();
driver.get(URL);
driver.findElement(By.name("uid")).sendKeys("mngr117051");
driver.findElement(By.name("password")).sendKeys("EhYtErY");
driver.findElement(By.name("btnLogin")).click();
}
#Test
public void logout() {
driver.findElement(By.xpath("html/body/div[2]/div/ul/li[15]/a")).click();
}
}
Hope this will help you.

Selenium pageFactory NullPointerException for driver

Selenium pageFactory NullPointerException. Any help will be appreciated. It works for the login of setUp(), but after that driver comes up null.
public class TestBase {
public WebDriver driver;
String url = PropertiesFile.readPropertiesFile("autUrl");
public WebDriver getDriver() {
System.setProperty("webdriver.chrome.driver",
System.getProperty("user.dir") + "/driver/chromedriver.exe");
driver = new ChromeDriver();
return driver;
}
public void getUrl(String url) {
driver.get(url);
driver.manage().window().maximize();
}
public void init() {
getDriver();
getUrl(url);
}
}
public class LogInPage extends TestBase {
WebDriver driver;
#FindBy(id = "loginEmail")public WebElement userName_field;
#FindBy(name = "password")public WebElement password_field;
#FindBy(xpath = "//*[#id='main-content']/aside/div/form/input[2]")public WebElement SignMeIn_btn;
public LogInPage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
// Login
public void logIn(String userName, String password) {
userName_field.sendKeys(userName);
password_field.sendKeys(password);
SignMeIn_btn.click();
}
}
public class LogIn extends TestBase {
LogInPage logInPage;
private String user = PropertiesFile.readPropertiesFile("user");
private String password = PropertiesFile.readPropertiesFile("password");
public LogIn(WebDriver driver) {
this.driver = driver;
}
public void setUp(){
init();
}
public void logIn(){
logInPage = new LogInPage(driver);
logInPage.logIn(user, password);
}
}
public class PortalsPage extends TestBase {
WebDriver driver;
#FindBy(id = "loginEmail") public WebElement userName_field;
#FindBy(xpath=".//*[#id='tabDetail']") public WebElement tenantPage_li;
#FindBy(id="tabDetail") public WebElement ownerPage_li;
#FindBy(xpath="//a[contains(#href,'tenant.action')]") public WebElement tenantPortal_link;
#FindBy(xpath="//a[contains(#href,'owner.action')]") public WebElement ownerPortal_link;
public PortalsPage(WebDriver driver){
this.driver = driver;
PageFactory.initElements(driver, this);
}
public void goToPortals(){
userName_field.sendKeys("a");
tenantPage_li.click();
}
}
public class Portals extends TestBase {
PortalsPage portals;
WebDriver driver;
#BeforeClass
public void setUp(){
LogIn login = new LogIn(driver);
login.setUp();
login.logIn();
}
#Test
public void goToPortal(){
portals = new PortalsPage(driver);
portals.goToPortals();
}
}
Following exception I got:
FAILED: goToPortal 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.$Proxy6.sendKeys(Unknown Source) at
com.demo.pages.PortalsPage.goToPortals(PortalsPage.java:30) at
com.demo.control.Portals.goToPortal(Portals.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:80)
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:127)
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:1198) at
org.testng.TestNG.runSuitesLocally(TestNG.java:1123) at
org.testng.TestNG.run(TestNG.java:1031) at
org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)
Your current approach seems to be a bit convoluted. But without delving into the details of what other approach you can use to fix your overall design, here's a cleaned up version of your code, that should work.
The idea here is that you only need page classes (the ones that end with *Page which represent a particular page, and exposes some business functions that can be executed on that particular page) and test classes, with the test class themselves extending from your TestBase
So here are the classes
LoginPage.java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class LogInPage {
#FindBy(id = "loginEmail")
private WebElement userNameTextField;
#FindBy(name = "password")
private WebElement passwordTextField;
#FindBy(xpath = "//*[#id='main-content']/aside/div/form/input[2]")
private WebElement signInButton;
public LogInPage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
public void logIn(String userName, String password) {
userNameTextField.sendKeys(userName);
passwordTextField.sendKeys(password);
signInButton.click();
}
}
PortalsPage.java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class PortalsPage {
#FindBy(id = "loginEmail")
private WebElement usernameTextField;
#FindBy(xpath = ".//*[#id='tabDetail']")
private WebElement tenantPage;
#FindBy(id = "tabDetail")
private WebElement ownerPage;
#FindBy(xpath = "//a[contains(#href,'tenant.action')]")
private WebElement tenantPortalLink;
#FindBy(xpath = "//a[contains(#href,'owner.action')]")
private WebElement ownerPortalLink;
public PortalsPage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
public void goToPortals() {
usernameTextField.sendKeys("a");
tenantPage.click();
}
}
TestBase.java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class TestBase {
private WebDriver driver;
protected WebDriver getDriver() {
if (driver != null) {
return driver;
}
System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "/driver/chromedriver.exe");
driver = new ChromeDriver();
return driver;
}
public void getUrl(String url) {
getDriver().get(url);
getDriver().manage().window().maximize();
}
}
PortalsTest.java
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class PortalsTest extends TestBase {
private PortalsPage portals;
private String user = PropertiesFile.readPropertiesFile("user");
private String password = PropertiesFile.readPropertiesFile("password");
private String url = PropertiesFile.readPropertiesFile("autUrl");
#BeforeClass
public void setUp() {
LogInPage login = new LogInPage(getDriver());
getUrl(url);
login.logIn(user, password);
}
#Test
public void goToPortal() {
portals = new PortalsPage(getDriver());
portals.goToPortals();
}
}

Page Object Pattern with Selenium and Testng failure

I am having issue running the below Page Object Model with testng.
TestClass 1
package Proj;
public class signInPage {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "C:/chromedriver_win32/chromedriver.exe");
ChromeDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
public signInPage (WebDriver driver)
{
this.driver=driver;
}
WebDriver driver;
public signInPage()
{
driver.get("baseURL");
}
By Email_address = By.name("Username");
By Password = By.id("Password");
public WebElement Email_address ()
{
return driver.findElement(Email_address);
}
public WebElement Password ()
{
return driver.findElement(Password);
}
public WebElement button_id ()
{
return driver.findElement(button_id);
}
}
TestClass 2
package Proj;
public class MyDetailsPage {
public MyDetailsPage (WebDriver driver)
{
this.driver=driver;
}
WebDriver driver;
By My_Details=By.xpath(".//*[#id='masterForm']/div[5]/div/div[3]/div[3]/a/span");
By First_name = By.id("FirstName");
By Last_name= By.name("NameModel.LastName");
By button_id= By.id("stage_one_button");
public WebElement My_Details ()
{
return driver.findElement(My_Details);
}
public WebElement First_name ()
{
return driver.findElement(First_name);
}
public WebElement Last_name ()
{
return driver.findElement(Last_name);
}
}
TestData Page
package Proj;
public class testData {
public static void main (String[] args) throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "C:/chromedriver_win32/chromedriver.exe");
ChromeDriver driver = new ChromeDriver();
}
public void testDetails (WebDriver driver)
{
this.driver=driver;
}
static WebDriver driver;
protected static String baseUrl;
protected static String Email_address;
protected static String Password;
protected String First_name;
protected String Last_name;
public void Data () {
baseUrl = "https://login.yahoo.com/";
driver = new ChromeDriver();
Email_address = "myname#yahoo.com";
Password = "myname";
First_name = "Testing";
Last_name = "Account";
}
}
TestCases
package Proj;
import org.testng.annotations.Test;
import org.openqa.selenium.SearchContext;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;
public class TestCases extends testData {
private static SearchContext WebElement;
#BeforeSuite
public void BeforeSuite () {
System.setProperty("webdriver.chrome.driver", "C:/chromedriver_win32/chromedriver.exe");
WebDriver driver = new ChromeDriver ();
}
#BeforeClass
public void driver(WebDriver driver) throws InterruptedException
{
this.driver = driver;
driver.get(baseUrl);
}
#Test
public void AllTest () throws InterruptedException {
signInPage a = new signInPage (driver);
a.Email_address().sendKeys(Email_address);
a.Password().sendKeys(Password);
a.SIGN_IN().click();
MyDetailsPage e = new MyDetailsPage (driver);
e.My_Details ().click();
e.First_name ().sendKeys("Testing");
e.Last_name (). sendKeys ("Account");
e.button_id ().click();
}
}
It opens up Browser but fail to enter baseUrl and could not perform the Test. It is failing from the TestCases class. No matter how i have tried to reconfigure this with no luck. I appreciate your prompt assistance. Thank you
FAILED CONFIGURATION: #BeforeClass driver
org.testng.TestNGException:
Can inject only one of <ITestContext, XmlTest> into a BeforeClass annotated driver.
For more information on native dependency injection please refer to http://testng.org/doc/documentation-main.html#native-dependency-injection
at org.testng.internal.Parameters.checkParameterTypes(Parameters.java:244)
at org.testng.internal.Parameters.createParameters(Parameters.java:172)
at org.testng.internal.Parameters.createParameters(Parameters.java:458)
at org.testng.internal.Parameters.createConfigurationParameters(Parameters.java:118)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:206)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:146)
at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:166)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:105)
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.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)
SKIPPED: AllTest
org.testng.TestNGException:
Can inject only one of <ITestContext, XmlTest> into a BeforeClass annotated driver.
For more information on native dependency injection please refer to http://testng.org/doc/documentation-main.html#native-dependency-injection
at org.testng.internal.Parameters.checkParameterTypes(Parameters.java:244)
at org.testng.internal.Parameters.createParameters(Parameters.java:172)
at org.testng.internal.Parameters.createParameters(Parameters.java:458)
at org.testng.internal.Parameters.createConfigurationParameters(Parameters.java:118)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:206)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:146)
at org.testng.internal.TestMethodWorker.invokeBeforeClassMethods(TestMethodWorker.java:166)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:105)
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.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)
===============================================
Default test
Tests run: 1, Failures: 0, Skips: 1
Configuration Failures: 1, Skips: 0
===============================================
===============================================
Default suite
Total tests run: 1, Failures: 0, Skips: 1
Configuration Failures: 1, Skips: 0
===============================================
public void driver(WebDriver driver) is not allowed on a #BeforeClass method. You have to remove the parameter and find another way to set the driver.
As juherr pointed out that you can not parameterize the #BeforeClass in this manner by passing webdriver instead you can follow following approach to do so:
public class TestCases extends testData {
private static SearchContext WebElement;
WebDriver driver;
#BeforeSuite
public void BeforeSuite () throws InterruptedException {
System.setProperty("webdriver.chrome.driver", "C:\\Eclipse\\Selenium\\chromedriver.exe");
}
#BeforeClass
public void driver() throws InterruptedException
{
driver = new ChromeDriver ();
testData td = new testData ();
driver.get(td.baseUrl);
}
/
/
/
/

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.