Java 页面对象模型在运行我的测试时看到空指针异常?
当触发我的测试时,我似乎在尝试与我的Java 页面对象模型在运行我的测试时看到空指针异常?,java,selenium,selenium-webdriver,pageobjects,Java,Selenium,Selenium Webdriver,Pageobjects,当触发我的测试时,我似乎在尝试与我的页面工厂WebElement交互时看到空指针异常 myDriverFactory中包含的代码: public class DriverFactory { private static DriverFactory instance = null; public static ThreadLocal<WebDriver> webDriver = new ThreadLocal<WebDriver>(); publi
页面工厂
WebElement
交互时看到空指针异常
myDriverFactory中包含的代码
:
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();
}
}
myBaseTest
类中包含的代码:
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();
}
}
当触发my
TestNg
测试它时,openHomePage
方法工作,依次打开指定的url;它使用DriverFactory.getDriver().get()
但是当尝试单击页面工厂
元素时,例如调用:logIn_按钮。单击()代码>在我的测试中,我似乎收到了一个空指针异常,即使我已经初始化了类?在@BeforeClass中,您在创建驱动程序实例之前已经初始化了页面工厂。如果将pomSetup()
中的代码移动到DriverFactory.setDriver(“chrome”)之后的setup()
方法代码>测试代码应该可以工作。另外,在BasePO
类中,您已经在构造函数中初始化了页面工厂,因此在BaseTest
类中调用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();
}
}
公共类驱动程序工厂{
私有静态DriverFactory实例=null;
//单例初始化
公共静态驱动程序工厂getInstance(){
if(实例==null)
instance=newdriverfactory();
返回实例;
}
public ThreadLocal webDriver=new ThreadLocal();
公共最终void setDriver(字符串浏览器){
开关(浏览器){
案例“firefox”:
setProperty(“webdriver.gecko.driver”,Global\u VARS.FIREFOX\u driver\u目录);
设置(新的FirefoxDriver());
打破
案例“铬”:
System.setProperty(“webdriver.chrome.driver”,Global\u VARS.chrome\u driver\u目录);
set(新的ChromeDriver());
打破
}
getDriver().manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);
getDriver().manage().window().maximize();
}
公共WebDriver getDriver(){
返回webDriver.get();
}
公共无效拆卸(){
getDriver().quit();
}
}
您正在BasePO类和BaseTest类中执行PageFactory.InitElements。抽象类的PageFactory?我很困惑,你不能调用PageFactory.initElements(DriverFactory.getDriver(),BasePO.class)
,因为BasePO是抽象类。谢谢@sigil@西格尔,你知道这个问题的答案吗@西格尔再次感谢你的帮助,非常感谢
@BeforeClass
public void pomSetup() {
}
@BeforeMethod
public void setup() {
DriverFactory.setDriver("chrome");
// Page factory initialized the constructor of BasePO class
subPage = new SubPage();
}
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();
}
}