Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 页面对象模型在运行我的测试时看到空指针异常?_Java_Selenium_Selenium Webdriver_Pageobjects - Fatal编程技术网

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();
    }
}