Java 页面对象应该在哪里实例化?

Java 页面对象应该在哪里实例化?,java,selenium,pageobjects,Java,Selenium,Pageobjects,我想知道我应该在哪里实例化我的页面对象? 以下是我的项目层次结构: Pages:包含具有构造函数的所有页面对象,例如 public LoginPage extends BasePage { super(driver); PageFactory.initElements(driver, this); } My BasePage包含所有常用方法,如表处理、从webtable收集数据等 我有一个包含所有页面对象实例化的baseTest,我的测试扩展了这个类 LoginPage logi

我想知道我应该在哪里实例化我的页面对象? 以下是我的项目层次结构:

Pages:包含具有构造函数的所有页面对象,例如

public LoginPage extends BasePage
 {
   super(driver);
   PageFactory.initElements(driver, this);
}
My BasePage包含所有常用方法,如表处理、从webtable收集数据等

我有一个包含所有页面对象实例化的baseTest,我的测试扩展了这个类

LoginPage loginPage = new LoginPage(driver);
我有助手(非静态)类以及导航、数据库连接、自定义等待等

有什么最佳做法吗?Basetest是实例化它们的合适位置吗


谢谢

根据场景需要,我在测试代码中实例化页面对象,但不实例化基类。例如:

@Test(dataProvider = PROVIDER)
public void testLogin(WebDriver driver, Info info) {
  Login login = new Login(driver);
  assertTrue(login.isDisplayed());
  login.enterCredentials(info.getUser(), info.getPw());
  Welcome welcome = new Welcome(driver);
  assertTrue(welcome.isDisplayed());
}
这只是使用页面对象的一种方法


注意不要编写太多的“helper”类,也不要编写太深的继承层次结构。

我按照下面给出的方法编写。我不知道它有多好。欢迎评论和反馈

a.我使用一个AbstractPage类,该类包含实例化页面对象,还包含所有对象级包装方法,如clickButton()、sendKeys()等。页面对象实例化通过构造函数进行

public AbstractPage(WebDriver driverWeb) {
  this.driverWeb = driverWeb;
  PageFactory.initElements(driverWeb, this);
}
b.那么我所有的页面类都扩展了这个抽象页面-

public LoginCanvas(WebDriver driverWeb) {
  super(driverWeb);
}

c.然后是一个运行我所有测试用例的类。但是我使用cucumber,所以这个基类只运行cucumber场景。

公共登录页面扩展BasePage(WebDriver驱动程序)
将不会编译。你是对的,我犯了一个复制粘贴错误。更正了。我强烈建议将
initElements
调用放入基页类。谢谢你的评论!在哪里实例化LoginCanvas:LoginCanvas lc=new LoginCanvas(驱动程序);?我也使用cucumber,我有一些utils/helper类,所以我有3个包。帮助程序、页面对象、步骤定义(以及包含功能文件的资源)。。。BasePage包含所有常用的自定义方法(我用wait等实现了自定义click、setElement等方法)。我的Basepage与您的AbstractPage类似,但我也有baseSteps,在这里我存储所有页面对象实例化。对吗?还有一件事。我有一个导航帮助器类,它包含导航方法的所有方法,如navigateToLogin、navigateToAboutUs等。我无法扩展BasePage,因为它是一个帮助器类,但是BasePage包含所有setElement、clickElement和其他常用方法。我认为这是一种不好的做法。我该怎么解决呢?我应该用click、set和其他基本方法创建一个ElementUtils助手类吗?但在这种情况下,我在哪里可以实例化它?谢谢我在步骤定义类中进行实例化。例如,网站中有一个名为Profile的部分。此配置文件部分有3页。我为此创建了3个页面类和1个步骤定义类。在这个步骤定义类中,我实例化了页面对象类。我还使用了3个包——步骤定义、页面和公共。Common包含所有实用程序和帮助程序类。对于导航,我有两种不同的类型-一次,当我点击某个按钮时,我在同一页面上。另一个是我导航到另一个页面。对于这两种方法,navigateTo()函数都有类似的代码-navigateToHomePage(){clickButton(login);waitTillPageIsLoaded(“页面标题”);}我不会对
click
sendKeys
之类的方法使用包装器方法,因为这些方法在底层库中工作得很好,对于一行覆盖的方法,它是一行覆盖方法。我更喜欢页面对象方法名称反映UI功能点的样式,而不是低级元素操作。页面对象模型的思想首先是隐藏底层元素操作,并以UI术语公开功能。提示一种方法。我使用PageFactory方法,这比在每个测试方法中使用这个方法更复杂。你在PF方面有经验吗?有很多经验。我在这里展示的代码是为使用页面工厂方法而设计的。到目前为止,我还有其他类型的问题,所以我想实现您提到的这种方法。因此,如果我有很多测试用例,每个测试用例都应该包含您提到的示例中的实例化?包含所有安装信息的basePage是否有任何好处?