Java 页面工厂初始化
我使用POM和页面工厂方法实现了一个框架。我有一个包含大量init的baseTest类,例如:(每个其他测试类都会扩展它) 它工作正常,但我想找到更优雅/结构化的方式来处理它 我尝试将其构建到构造函数中: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
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);
}
}