【问题标题】:Implementing PageObjects pattern for frames in a page为页面中的框架实现 PageObjects 模式
【发布时间】:2014-09-09 03:14:29
【问题描述】:

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

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

Public Class HomePageLeftFrame{

private WebElement link;
private WebElement textField;

}

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

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

【问题讨论】:

  • 我认为linkinLeftFrametextFieldLeftFrame 也可以是页面对象,因为它们内部还有其他元素。

标签: java selenium selenium-webdriver webdriver pageobjects


【解决方案1】:

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

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

  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 中建模了这个视图。将框架导航与页面对象类分离,我把它保存在一个单独的包中,它只是页面对象类的父包。

org.xyz.automation.sdk.global 包含 Navigation.java,它负责框架导航和所有其他导航。将其排除在global.pages 之外的唯一好处是,将来当您的应用程序不支持框架时,您无需更改任何 Page 类,只需修改 navigator 类。

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

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

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

【讨论】:

  • priyanshu,感谢您的详细回答和时间。你能告诉我你是如何初始化LeftFramePage中的元素的吗?你能给我一些关于LeftFrameNavigator类的见解吗?我仍然不清楚如何继续我的项目..您可以显示的任何代码都非常感谢..非常感谢..
  • @javanoob 添加了所需类的示例。
  • 非常感谢您的代码..现在我知道如何继续进行此操作..再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 2013-06-30
  • 2012-09-30
  • 1970-01-01
相关资源
最近更新 更多