Reputation: 43
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
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