Maksym Ivanov
Maksym Ivanov

Reputation: 43

NullPointerException when run a test using PageObjects pattern

I have tried to find the answer to this but none of those helped me. I'm sure I'm missing one detail, but I can't figure out what exactly.

I get NullPointerException when run a test case. I think it happens when I try to pass driver to my page object (WikiMain), which is inherited from WebPage (superclass), because when I debugged, I noticed driver = null. Should I pass the driver to WebPage, because other pages are inherited from it? P.S. Sorry I'm kind of new to this and it's my first questions on this website.

Here is my Test Case class:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;

public class TestCase{

    public WebDriver driver;

    @BeforeTest
    public void setUp(){
        driver = new ChromeDriver();
    }

    @AfterTest
    public void tearDown(){
        driver.quit();
    }

    public WebPage getWikiMain(){
        driver.get("https://www.wikipedia.org/");
        return new WikiMain(driver);
    }
}

Here is my WebPage class:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;

public class WebPage{

    private WebDriver driver;

    public WebPage(WebDriver driver){
        this.driver = driver;
        initWebElements();
    }

    public void initWebElements(){
        PageFactory.initElements(driver, this);
    }
}

Here is WikiMain class:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class WikiMain extends WebPage{

    private WebDriver driver;

    public WikiMain(WebDriver driver){
        super(driver);
    }


    public WebPage getWikiEn(){
        String linkToWikiEn = driver.findElement(By.xpath(".//*[@class= 'central-featured-lang lang1']/a")).getAttribute("href");
        driver.get(linkToWikiEn);
        return new WikiMainEn(driver);
    }
}

And WikiMainEn class:

package com.company.pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;


public class WikiMainEn extends WebPage{

    private WebDriver driver;

    public WikiMainEn(WebDriver driver){
        super(driver);
    }

    @FindBy(xpath = ".//*[@id='mp-topbanner']/tbody/tr/td[1]/table/tbody/tr/td/div[1]")
    private WebElement title;

    public WebElement getTitle(){
        return title;
    }

    public String getTitleText(){
        return getTitle().getText();
    }
}

And actual Test:

import com.company.pages.*;
import org.testng.Assert;
import org.testng.annotations.Test;


public class TestWikiMain extends TestCase{

    @Test
    public void verifyEnWiki() {

        WikiMain wikiMain = (WikiMain) getWikiMain();
        WikiMainEn wikiMainEn = (WikiMainEn) wikiMain.getWikiEn();
        Assert.assertTrue(wikiMainEn.getTitleText().contains("Welcome to"));
    }

Upvotes: 2

Views: 477

Answers (1)

J.Lyu
J.Lyu

Reputation: 942

public class TestCase{
   public WebDriver driver;

   @BeforeTest
   public void setUp(){
       driver = new ChromeDriver();
   }

Here you have declared a driver and initialized.

public class WikiMain extends WebPage{

private WebDriver driver;

public WikiMain(WebDriver driver){
    super(driver);
}

Another driver without any initialaztion. So when you ran here

 WikiMainEn wikiMainEn = (WikiMainEn) wikiMain.getWikiEn();

You were using a uninitialized driver. Because you've never initilize the subclass's(WikiMain) driver. You just initilized WebPage.class 's driver.

In my opinion you can set the WebPage's driver protected and remove the subclass one.

 protected WebDriver driver;

And remove

public class WikiMain extends WebPage{

 private WebDriver driver; //remove it

Upvotes: 4

Related Questions