为页面中的帧实现PageObjects模式

时间:2014-09-09 03:14:29

标签: java selenium selenium-webdriver webdriver pageobjects

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

例如,我有如下的LeftFrame Page Object:

Public Class HomePageLeftFrame{

private WebElement link;
private WebElement textField;

}

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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