运行 测试使用 PageObjects 模式时出现 NullPointerException
NullPointerException when run a test using PageObjects pattern
我试图找到这个问题的答案,但其中 none 帮助了我。我确定我遗漏了一个细节,但我无法弄清楚到底是什么。
当 运行 一个测试用例时,我得到 NullPointerException
。我认为当我尝试将驱动程序传递给我的页面对象 (WikiMain
) 时会发生这种情况,它是从 WebPage
(superclass) 继承的,因为当我调试时,我注意到 driver = null .我是否应该将驱动程序传递给 WebPage
,因为其他页面都继承自它?
P.S。抱歉,我是新手,这是我在这个网站上的第一个问题。
这是我的测试用例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);
}
}
这是我的网页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);
}
}
这里是 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);
}
}
和 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();
}
}
实际测试:
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 TestCase{
public WebDriver driver;
@BeforeTest
public void setUp(){
driver = new ChromeDriver();
}
在这里您已经声明了一个驱动程序并进行了初始化。
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
我试图找到这个问题的答案,但其中 none 帮助了我。我确定我遗漏了一个细节,但我无法弄清楚到底是什么。
当 运行 一个测试用例时,我得到 NullPointerException
。我认为当我尝试将驱动程序传递给我的页面对象 (WikiMain
) 时会发生这种情况,它是从 WebPage
(superclass) 继承的,因为当我调试时,我注意到 driver = null .我是否应该将驱动程序传递给 WebPage
,因为其他页面都继承自它?
P.S。抱歉,我是新手,这是我在这个网站上的第一个问题。
这是我的测试用例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);
}
}
这是我的网页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);
}
}
这里是 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);
}
}
和 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();
}
}
实际测试:
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 TestCase{
public WebDriver driver;
@BeforeTest
public void setUp(){
driver = new ChromeDriver();
}
在这里您已经声明了一个驱动程序并进行了初始化。
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