Java 使用PageObjects模式运行测试时出现NullPointerException

Java 使用PageObjects模式运行测试时出现NullPointerException,java,selenium,webdriver,testng,pageobjects,Java,Selenium,Webdriver,Testng,Pageobjects,我试图找到这个问题的答案,但没有一个对我有帮助。我肯定我遗漏了一个细节,但我不知道到底是什么 当运行测试用例时,我得到NullPointerException。我想,当我试图将驱动程序传递给我的页面对象(WikiMain)时,就会发生这种情况,它是从WebPage(超类)继承的,因为在调试时,我注意到driver=null。我是否应该将驱动程序传递到网页,因为其他网页是从中继承的? 顺便说一句,对不起,我对这个有点陌生,这是我在这个网站上的第一个问题 下面是我的测试用例类: import org

我试图找到这个问题的答案,但没有一个对我有帮助。我肯定我遗漏了一个细节,但我不知道到底是什么

当运行测试用例时,我得到
NullPointerException
。我想,当我试图将驱动程序传递给我的页面对象(
WikiMain
)时,就会发生这种情况,它是从
WebPage
(超类)继承的,因为在调试时,我注意到driver=null。我是否应该将驱动程序传递到
网页
,因为其他网页是从中继承的? 顺便说一句,对不起,我对这个有点陌生,这是我在这个网站上的第一个问题

下面是我的测试用例类:

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);
    }
}
这是我的网页课:

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);
    }
}
以下是WikiMain类:

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);
    }
}
和WikiMainEn类:

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();
    }
}
和实际测试:

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"));
    }
这里您已经声明了一个驱动程序并进行了初始化

public class WikiMain extends WebPage{

private WebDriver driver;

public WikiMain(WebDriver driver){
    super(driver);
}
没有任何初始化的另一个驱动程序。所以当你跑来的时候

 WikiMainEn wikiMainEn = (WikiMainEn) wikiMain.getWikiEn();
您使用的是未初始化的驱动程序。因为您从未初始化过子类的(WikiMain)驱动程序。您刚刚初始化了WebPage.class的驱动程序

在我看来,你可以设置网页的驱动程序保护和删除子类之一

 protected WebDriver driver;
移除

public class WikiMain extends WebPage{

 private WebDriver driver; //remove it

在您的
testCase()
类中,注释是否应该是
@BeforeClass
而不是
@BeforeTest
(根据SimpleTest.java)?@bobulus,是的,它可以是BeforeClass或beforethod,我只是使用BeforeTest,因为我正在使用数据提供程序进行练习,只是没有替换它。但这并没有什么区别。是的,它起作用了,所以当我将驱动程序传递给WikiMain时,基本上没关系,因为另一个未初始化的驱动程序在那里声明,默认为null。谢谢!
public class WikiMain extends WebPage{

 private WebDriver driver; //remove it