为页面中的帧实现PageObjects模式

如何为页面中的帧实现pageObject模式(Selenium)..我有一个主页,有一个左框架和右框架,我想为每个框架创建页面对象..

例如,我有如下的LeftFrame页面对象:

Public Class HomePageLeftFrame{ private WebElement link; private WebElement textField; } 

如何为HomePageLeftFrame对象中的两个元素编写@FindBy注释…有没有办法?

注意:根据关于pageObjects的selenium的文档,提到页面对象可以是整个HTML页面或页面的一部分。我的理解是否正确上述实现?

在写我的建议之前,我首先想分享我开发POM框架的应用程序。 所以基本上我的应用程序为每个html页面有三个不同的框架:

  1. 顶部框架:它是整个应用程序的共享视图,包含常见的function主义,如注销,帮助,管理员设置等。

  2. 左侧导航面板:在我的应用程序的大多数位置,此框架可用,它提供应用程序的不同部分之间的导航。

  3. 内容框架:这是用户执行主要操作的框架。

为这种类型的应用程序设计基于页面对象的框架实际上是一项繁琐的工作,但我决定以这种方式设计它,以便我们可以避免所有重复的代码。首先,我将共享框架结构:

 org.xyz.automation.sdk - TopFrame.java - MainNavigator.java - WebDriverFactory.java - Configuration.java org.xyz.automation.sdk.global.pages - LoginPage.java - TopFrame.java org.xyz.automation.sdk.global - Navigator.java org.xyz.automation.sdk.leftpanel.pages - LeftFramePage.java org.xyz.automation.sdk.leftpanel - LeftFrameNavigator.java 

所以基本上org.xyz.automation.sdk包含所有常见的配置类,它们负责根据您的系统配置实例化Web驱动程序。

org.xyz.automation.sdk.global.pages :这个包包含常见视图的页面对象类,正如我已经说过的,你可以在整个应用程序中看到TopFrame,所以我在TopFrame.java建模了这个视图。要分离框架从Page对象类导航,我把它保存在一个单独的包中,它只是Page Object类的父包。

org.xyz.automation.sdk.global包含Navigation.java ,它负责框架导航和所有其他导航。 从global.pages中保留它的唯一好处是,将来当您的应用程序不支持框架时,您不需要更改任何页面类,只修改导航器类。

org.xyz.automation.sdk.leftpanel.pages :与上面类似,这个包包含左面板的页面对象java类,我再次从leftpanel.pages包中分离出这个左面板的导航。

@FindBy这只是查找建模页面的Web元素的快捷方式。 页面对象的基本概念是每个类应该只为单个视图建模,因此建模类应该只包含实际出现在建模视图上的那些web元素。 例如, TopFrame.java应该包含仅在该帧上出现的注销元素。

  @FindBy(name = "logOut") // To find the element by name @CacheLookup private WebElement logOutLInk; 

在对其执行任何操作时,您应将其视为WebElement一个实例。

logOutLInk.click();

  /** * Class which models the view of Left Navigation Frame */ public class LeftNavigationFrame{ @FindBy(name= "exampleName") private WebElement exampleButton; private WebDriver driver; public LeftNavigationFrame(WebDriver driver) { this.driver = driver; } /** * Opens a new page by clicking example button */ public void openNewPage() { exampleButton.click(); } } 

Navigator类的示例:

  /** * Class which provides convenient methods to navigate on left frame */ public class LeftFrameNavigator{ private WebDriver driver; public LeftFrameNavigator(WebDriver driver) { this.driver = driver; } /** * Changes scope to the left frame * * @return Page Object class of LeftNavigationFrame */ public LeftNavigationFrame switchToLeftFrame() { // Code to switch Frame return new LeftNavigationFrame(driver); } } 

这是您的测试类的示例:

  /** * Class which contains test cases of xyz */ public class doTesting{ LeftFrameNavigator leftNav; @BeforeTest public void instantiateRequiredClasses() { LeftFrameNavigator leftNav = new LeftFrameNavigator(); } @Test public void doTestingHere() { LeftNavigationFrame leftFrame = leftNav.switchToLeftFrame(); leftFrame.openNewPage() } } }