Bhanu Prakash
Bhanu Prakash

Reputation: 41

Null pointer exception in selenium webdriver - TestNG - PageFactory

I am trying to automate using selenium webdriver, testng and page factory. But I am facing null pointer exception.

public class BrowserOpenClose extends Common {
    public WebDriver driver;

    @BeforeTest
    @Parameters("browser")
    public void initBrowser(String browser) {
        if (browser.equalsIgnoreCase("FF")) {
            System.setProperty("webdriver.firefox.marionette", "./gecko/geckodriver.exe");
            driver = new FirefoxDriver();
            driver.manage().window().maximize();
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            driver.get("https://www.flipkart.com/");
        } else if (browser.equalsIgnoreCase("CH")) {
            System.setProperty("webdriver.chrome.driver", "./chrome/chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().window().maximize();
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            driver.get("https://www.flipkart.com/");
        }
    }

    @AfterTest
    public void closeBrowser() {
        waitUntil(10);
        driver.quit();
    }
}

    public class Login extends BrowserOpenClose {

    @FindBy(xpath = "//a[text()='Log In']")
    private WebElement loginLink;

    @FindBy(xpath = "//input[@class='_2zrpKA']")
    private WebElement username;

    @FindBy(xpath = "//input[@class='_2zrpKA _3v41xv']")
    private WebElement password;

    @FindBy(xpath = "//button[@class='_3zLR9i _1LctnI _36SmAs']")
    private WebElement loginButton;

    public Login(WebDriver driver) {
        PageFactory.initElements(driver, this);
        this.driver = driver;
    }

    public void openLoginDialog() {
        loginLink.click();
    }

    public void enterUsername(String name) {
        username.sendKeys(name);
    }

    public void enterPassword(String pass) {
        password.sendKeys(pass);
    }

    public void clickLogin() {
        loginButton.click();
    }

}

    public class SwitchTShirtPage extends BrowserOpenClose {
    WebDriver driver;
    Login login;

    @BeforeMethod
    public void initElements() {
        login = new Login(driver);
    }

    @Test
    public void switchToTShirt() {
        login.openLoginDialog();
        login.enterUsername("abc");
        login.enterPassword("xyz");
        login.clickLogin();
    }

}

Error trace log: 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.$Proxy9.click(Unknown Source) at com.login.test.Login.openLoginDialog(Login.java:50) at com.homepage.test.SwitchTShirtPage.switchToTShirt(SwitchTShirtPage.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: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:1129) 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:746) at org.testng.TestRunner.run(TestRunner.java:600) at org.testng.SuiteRunner.runTest(SuiteRunner.java:366) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319) at org.testng.SuiteRunner.run(SuiteRunner.java:268) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1264) at org.testng.TestNG.runSuitesLocally(TestNG.java:1189) at org.testng.TestNG.runSuites(TestNG.java:1104) at org.testng.TestNG.run(TestNG.java:1076) at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:126) at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:152) at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:57)

Upvotes: 1

Views: 3335

Answers (1)

juherr
juherr

Reputation: 5740

WebDriver driver from SwitchTShirtPage is never initialized and is always null.

What you want is the one from BrowserOpenClose, so just remove the declaration from SwitchTShirtPage.

Then, be careful because driver is initialized with a @BeforeTest which is only run once by test (group of classes). So only the first instance of BrowserOpenClose will have driver initialized. Consider to replace @BeforeTest by @BeforeClass which should fix the issue.

Upvotes: 0

Related Questions