Java 页面工厂初始化

Java 页面工厂初始化,java,selenium-webdriver,pageobjects,Java,Selenium Webdriver,Pageobjects,我使用POM和页面工厂方法实现了一个框架。我有一个包含大量init的baseTest类,例如:(每个其他测试类都会扩展它) 它工作正常,但我想找到更优雅/结构化的方式来处理它 我尝试将其构建到构造函数中: public Registeration(WebDriver driver) { super(driver); PageFactory.initelements(driver,Registration.class(or can be this)); } 在这种情况下,我得到了一个巨大的hea

我使用POM和页面工厂方法实现了一个框架。我有一个包含大量init的baseTest类,例如:(每个其他测试类都会扩展它)

它工作正常,但我想找到更优雅/结构化的方式来处理它

我尝试将其构建到构造函数中:

public Registeration(WebDriver driver) {
super(driver);
PageFactory.initelements(driver,Registration.class(or can be this));
}
在这种情况下,我得到了一个巨大的heapmemory错误,但这将是非常好的,因为我可以使用断言来验证构造函数中的每个pageObject,使用title或页面上的任何元素,对吗

如何构造我的init,以及如何使用构造函数处理PageFactory


谢谢

这是因为元素卡在无限循环中。PageFactory的InitElement函数首先查找带有webdriver参数的页面构造函数。它类似于运行程序-->initElements(第2行)-->initElements调用的页面创建调用,并不断循环。因此,您不能使用pagefactory在页面的构造函数中启动页面类。你可以这样做

    public class MyTest{
    @Test
    public void test(){
        TestFactory.invokeBrowser();
        MyPage page = TestFactory.getPage(MyPage.class);
    }
    }

//TestFactory class
    public class TestFactory{
    private static WebDriver driver;

    public static void invokeBrowser(){
    WebDriver driver = new ChromeDriver();
    //invokes the browser
    this.driver = driver;
    }

    public static <T> T getPage(Class<T> page){
    return PageFactory.initElements(driver,page);
    }
    }
公共类MyTest{
@试验
公开无效测试(){
TestFactory.invokeBrowser();
MyPage=TestFactory.getPage(MyPage.class);
}
}
//测试工厂类
公共类测试工厂{
私有静态WebDriver;
公共静态void invokeBrowser(){
WebDriver驱动程序=新的ChromeDriver();
//调用浏览器
this.driver=driver;
}
公共静态T getPage(类页){
返回PageFactory.initElements(驱动程序,页面);
}
}

如果它需要返回的实例的类型作为参数,那么它不是工厂,而是围绕
new
和构造函数的乱七八糟的东西。只需在构造函数中初始化。伪工厂方法将严重损害可维护性和可扩展性。您拼写了一个类型
注册
,但它的构造函数
注册
。请小心。您是否阅读了
PageFactory
上的文档或任何指南?他们解释如何正确使用它。谢谢,杰夫克,这是一本有趣的书。我已经使用了它在我的所有PO中显示的所有功能,但很高兴能够确认我没有遗漏任何东西。
    public class MyTest{
    @Test
    public void test(){
        TestFactory.invokeBrowser();
        MyPage page = TestFactory.getPage(MyPage.class);
    }
    }

//TestFactory class
    public class TestFactory{
    private static WebDriver driver;

    public static void invokeBrowser(){
    WebDriver driver = new ChromeDriver();
    //invokes the browser
    this.driver = driver;
    }

    public static <T> T getPage(Class<T> page){
    return PageFactory.initElements(driver,page);
    }
    }