Реализация шаблона PageObjects для фреймов на странице

Как реализовать шаблон pageObject (Selenium) для фреймов на странице .. У меня есть домашняя страница, есть левый фрейм и правый фрейм, и я хотел бы создать объект страницы для каждого фрейма ..

Например, у меня есть объект страницы LeftFrame, как показано ниже:

Public Class HomePageLeftFrame{

private WebElement link;
private WebElement textField;

}

Как написать аннотацию @FindBy для двух элементов в объекте HomePageLeftFrame ... Есть ли способ?

Примечание. В документации по селену для pageObjects упоминается, что объекты страницы могут быть целой HTML-страницей или частью страницы .. Правильно ли я понимаю вышеприведенную реализацию ??


person javanoob    schedule 09.09.2014    source источник
comment
Я думаю, что linkinLeftFrame и textFieldLeftFrame тоже могут быть объектами страницы, поскольку внутри них есть другие элементы.   -  person alecxe    schedule 09.09.2014


Ответы (1)


Прежде чем написать свое предложение, я хотел бы поделиться своим приложением, для которого я разработал структуру POM. Итак, в основном мое приложение имеет три разных фрейма для каждой html-страницы:

  1. Верхняя рамка: это общий вид для всего приложения, который содержит общие функции, такие как выход из системы, справка, настройки администратора и т. Д.

  2. Левая панель навигации: в большинстве мест в моем приложении этот фрейм доступен и обеспечивает навигацию между различными разделами приложения.

  3. Фрейм содержимого: это фрейм, в котором пользователь выполняет основные операции.

Разработка инфраструктуры на основе Page Object для этого типа приложений - действительно утомительная работа, но я решил спроектировать ее таким образом, чтобы мы могли избежать всего повторяющегося кода. Прежде всего, я расскажу о структуре фреймворка:

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 содержит все общие классы конфигурации, которые отвечают за создание экземпляра веб-драйвера в соответствии с конфигурацией вашей системы.

org.xyz.automation.sdk.global.pages: Этот пакет содержит класс общих представлений объекта страницы, как я уже сказал, TopFrame - это то, что вы можете видеть во всем приложении, поэтому я смоделировал это представление в TopFrame.java. Чтобы отделить навигацию по кадрам от класса объекта страницы, я сохранил это в отдельном пакет, который является не чем иным, как родительским пакетом класса Page Object.

org.xyz.automation.sdk.global содержит Navigation.java, который отвечает за навигацию по кадрам и все другие виды навигации. Единственная выгода от сохранения global.pages в том, что в будущем, когда ваше приложение не будет поддерживать фреймы, вам не нужно будет изменять какой-либо класс Page, а изменять только класс навигатора.

org.xyz.automation.sdk.leftpanel.pages: Как и выше, этот пакет содержит java-класс объекта страницы на левой панели, и снова я отделил навигацию этой левой панели от пакета leftpanel.pages.

@FindBy Это не что иное, как быстрый способ поиска веб-элементов моделируемой страницы. Самая основная концепция объекта страницы заключается в том, что каждый класс должен моделировать только одно представление, поэтому смоделированный класс должен содержать только те веб-элементы, которые фактически появляются в смоделированном представлении. Например, 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()
            }
        }
    }
person Priyanshu Shekhar    schedule 09.09.2014
comment
priyanshu, спасибо за подробный ответ и время. Не могли бы вы показать мне, как вы инициализируете элементы в LeftFramePage, а также можете дать мне некоторое представление о классе LeftFrameNavigator? Я до сих пор не понимаю, как продолжить работу над моим проектом. Мы очень ценим любой код, который вы можете показать. Большое вам спасибо .. - person javanoob; 09.09.2014
comment
@javanoob Добавлены примеры требуемых классов. - person Priyanshu Shekhar; 10.09.2014
comment
Большое спасибо за код .. Теперь я понял, как это сделать ... Еще раз спасибо - person javanoob; 10.09.2014