运行 我的测试时页面对象模型看到空指针异常?
Page Object Model seeing null pointer exception when running my tests?
在触发我的测试时,我似乎在尝试与我的 Page Factory
WebElement
交互时看到空指针异常。
代码包含在我的 DriverFactory
:
public class DriverFactory {
private static DriverFactory instance = null;
public static ThreadLocal<WebDriver> webDriver = new ThreadLocal<WebDriver>();
public static DriverFactory getInstance() {
if ( instance == null ) {
instance = new DriverFactory();
}
return instance;
}
public static final void setDriver(String browser) {
switch (browser) {
case "firefox":
System.setProperty("webdriver.gecko.driver",
Global_VARS.FIREFOX_DRIVER_DIRECTORY);
webDriver.set(new FirefoxDriver());
break;
case "chrome":
System.setProperty("webdriver.chrome.driver",
Global_VARS.CHROME_DRIVER_DIRECTORY);
webDriver.set(new ChromeDriver());
break;
}
getDriver().manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
getDriver().manage().window().maximize();
}
public static WebDriver getDriver() {
return webDriver.get();
}
public static void tearDown() {
getDriver().quit();
}
}
我的 base
页面中包含的代码:
public abstract class BasePO<T> {
private @FindBy(xpath = "//a[text()='Log in']") WebElement logIn_button;
protected WebDriver driver;
public BasePO() {
this.driver = DriverFactory.getDriver();
PageFactory.initElements(this.driver, this);
}
public void openHomepage() {
driver.get("https://whosebug.com/");
}
public void baseClickOnLoginButton() {
logIn_button.click();
}
}
代码包含在我的 BaseTest
class:
public class BaseTest {
public SubPage subPage;
public BasePO<?> basePage;
@BeforeClass
public void pomSetup() {
subPage = PageFactory.initElements(DriverFactory.getDriver(), SubPage.class);
basePage = PageFactory.initElements(DriverFactory.getDriver(), BasePO.class);
}
@BeforeMethod
public void setup() {
DriverFactory.setDriver("chrome");
//works
//subPage.openHomepage();
}
@AfterMethod
public void tearDown() {
if (DriverFactory.getDriver() != null) {
DriverFactory.tearDown();
}
}
形成我的测试用例的代码:
public class Test1 extends BaseTest {
@Test
public void exampleTest1() throws InterruptedException {
subPage.openHomepage(); //works as expected
subPage.clickOnLoginButton(); //Exception here, null pointer
}
}
当触发我的TestNg
时,测试其openHomePage
方法是否有效,依次打开指定的url;它使用 DriverFactory.getDriver().get()
但是当尝试单击 Page Factory
元素时,例如在我的测试中调用: logIn_button.click();
我似乎收到空指针异常,即使我已经初始化了 class?
在@BeforeClass中,您在创建驱动程序实例之前已经初始化了页面工厂。如果将 pomSetup()
中的代码移动到 DriverFactory.setDriver("chrome");
之后的 setup()
方法,测试代码应该可以工作。此外,在 BasePO
class 中,您已经在构造函数中初始化了页面工厂,因此在 BaseTest
Class 中调用 new 就足够了。
@BeforeClass
public void pomSetup() {
}
@BeforeMethod
public void setup() {
DriverFactory.setDriver("chrome");
// Page factory initialized the constructor of BasePO class
subPage = new SubPage();
}
关于代码部分,有几点建议。
DriveFactory 的实现是错误的。您正在使用从未使用过的单例初始化。而是将代码更改为以下内容。
public class DriverFactory {
private static DriverFactory instance = null;
// Singleton initialization
public static DriverFactory getInstance() {
if ( instance == null )
instance = new DriverFactory();
return instance;
}
public ThreadLocal<WebDriver> webDriver = new ThreadLocal<WebDriver>();
public final void setDriver(String browser) {
switch (browser) {
case "firefox":
System.setProperty("webdriver.gecko.driver", Global_VARS.FIREFOX_DRIVER_DIRECTORY);
webDriver.set(new FirefoxDriver());
break;
case "chrome":
System.setProperty("webdriver.chrome.driver", Global_VARS.CHROME_DRIVER_DIRECTORY);
webDriver.set(new ChromeDriver());
break;
}
getDriver().manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
getDriver().manage().window().maximize();
}
public WebDriver getDriver() {
return webDriver.get();
}
public void tearDown() {
getDriver().quit();
}
}
在触发我的测试时,我似乎在尝试与我的 Page Factory
WebElement
交互时看到空指针异常。
代码包含在我的 DriverFactory
:
public class DriverFactory {
private static DriverFactory instance = null;
public static ThreadLocal<WebDriver> webDriver = new ThreadLocal<WebDriver>();
public static DriverFactory getInstance() {
if ( instance == null ) {
instance = new DriverFactory();
}
return instance;
}
public static final void setDriver(String browser) {
switch (browser) {
case "firefox":
System.setProperty("webdriver.gecko.driver",
Global_VARS.FIREFOX_DRIVER_DIRECTORY);
webDriver.set(new FirefoxDriver());
break;
case "chrome":
System.setProperty("webdriver.chrome.driver",
Global_VARS.CHROME_DRIVER_DIRECTORY);
webDriver.set(new ChromeDriver());
break;
}
getDriver().manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
getDriver().manage().window().maximize();
}
public static WebDriver getDriver() {
return webDriver.get();
}
public static void tearDown() {
getDriver().quit();
}
}
我的 base
页面中包含的代码:
public abstract class BasePO<T> {
private @FindBy(xpath = "//a[text()='Log in']") WebElement logIn_button;
protected WebDriver driver;
public BasePO() {
this.driver = DriverFactory.getDriver();
PageFactory.initElements(this.driver, this);
}
public void openHomepage() {
driver.get("https://whosebug.com/");
}
public void baseClickOnLoginButton() {
logIn_button.click();
}
}
代码包含在我的 BaseTest
class:
public class BaseTest {
public SubPage subPage;
public BasePO<?> basePage;
@BeforeClass
public void pomSetup() {
subPage = PageFactory.initElements(DriverFactory.getDriver(), SubPage.class);
basePage = PageFactory.initElements(DriverFactory.getDriver(), BasePO.class);
}
@BeforeMethod
public void setup() {
DriverFactory.setDriver("chrome");
//works
//subPage.openHomepage();
}
@AfterMethod
public void tearDown() {
if (DriverFactory.getDriver() != null) {
DriverFactory.tearDown();
}
}
形成我的测试用例的代码:
public class Test1 extends BaseTest {
@Test
public void exampleTest1() throws InterruptedException {
subPage.openHomepage(); //works as expected
subPage.clickOnLoginButton(); //Exception here, null pointer
}
}
当触发我的TestNg
时,测试其openHomePage
方法是否有效,依次打开指定的url;它使用 DriverFactory.getDriver().get()
但是当尝试单击 Page Factory
元素时,例如在我的测试中调用: logIn_button.click();
我似乎收到空指针异常,即使我已经初始化了 class?
在@BeforeClass中,您在创建驱动程序实例之前已经初始化了页面工厂。如果将 pomSetup()
中的代码移动到 DriverFactory.setDriver("chrome");
之后的 setup()
方法,测试代码应该可以工作。此外,在 BasePO
class 中,您已经在构造函数中初始化了页面工厂,因此在 BaseTest
Class 中调用 new 就足够了。
@BeforeClass
public void pomSetup() {
}
@BeforeMethod
public void setup() {
DriverFactory.setDriver("chrome");
// Page factory initialized the constructor of BasePO class
subPage = new SubPage();
}
关于代码部分,有几点建议。
DriveFactory 的实现是错误的。您正在使用从未使用过的单例初始化。而是将代码更改为以下内容。
public class DriverFactory { private static DriverFactory instance = null; // Singleton initialization public static DriverFactory getInstance() { if ( instance == null ) instance = new DriverFactory(); return instance; } public ThreadLocal<WebDriver> webDriver = new ThreadLocal<WebDriver>(); public final void setDriver(String browser) { switch (browser) { case "firefox": System.setProperty("webdriver.gecko.driver", Global_VARS.FIREFOX_DRIVER_DIRECTORY); webDriver.set(new FirefoxDriver()); break; case "chrome": System.setProperty("webdriver.chrome.driver", Global_VARS.CHROME_DRIVER_DIRECTORY); webDriver.set(new ChromeDriver()); break; } getDriver().manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); getDriver().manage().window().maximize(); } public WebDriver getDriver() { return webDriver.get(); } public void tearDown() { getDriver().quit(); } }