{"id":14978857,"url":"https://github.com/kochetkov-ma/pump-fw","last_synced_at":"2025-04-11T01:02:09.409Z","repository":{"id":57742718,"uuid":"115433765","full_name":"kochetkov-ma/pump-fw","owner":"kochetkov-ma","description":"Java selenium-webdriver framework (depricated) see qa-pump","archived":false,"fork":false,"pushed_at":"2019-03-27T17:31:52.000Z","size":42402,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-24T21:42:34.717Z","etag":null,"topics":["java","selenium","selenium-java","selenium-webdriver"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kochetkov-ma.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-12-26T15:31:12.000Z","updated_at":"2024-08-13T00:19:27.000Z","dependencies_parsed_at":"2022-09-09T10:11:01.526Z","dependency_job_id":null,"html_url":"https://github.com/kochetkov-ma/pump-fw","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kochetkov-ma%2Fpump-fw","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kochetkov-ma%2Fpump-fw/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kochetkov-ma%2Fpump-fw/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kochetkov-ma%2Fpump-fw/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kochetkov-ma","download_url":"https://codeload.github.com/kochetkov-ma/pump-fw/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248322600,"owners_count":21084336,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","selenium","selenium-java","selenium-webdriver"],"created_at":"2024-09-24T13:58:32.338Z","updated_at":"2025-04-11T01:02:09.384Z","avatar_url":"https://github.com/kochetkov-ma.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pump FW\n\n## Описание\n\nФреймворк для автоматизации тестирования web приложений основанный на Selenium WebDriver\nЯвляется дополнительным слоем между пользователем фреймворка и WebDriver\nПолностью исключает работу с WebDriver и предоставляет интерфейс для взаимодействия с браузером и веб элементами\nВключает модель работы со станицами **Page Object**\n\n## Организация проекта\n\u003e Монорепозиторий\n\u003e\n\u003e На текущи момент содержит 2 под-проекта\n* Под-проект **commons**, который содержит общие классы не привязанные к web\n* Под-проект **web**, который содержит Функционал для взаимодействия с браузером, страницей и реализации основных web элементов\n\u003e Система сборки - **gradle**\n\u003e\n\u003e Юнит-тесты **junit5**, web тестируется на PhantomJS и Chrome. На самом деле почти все тесты интеграционные\n\u003e\n\u003e Используются Idea аннотации **@Nullable** и **@NonNull**\n\u003e\n\u003e Логгер Logback\n\n## Особенности\n#### Под-проект **commons** включает все необходимые модули и зависимости для быстрого создания автотестов\n* Reporter - реализация на основе Allure\n* Verifier - замена ассертов, постинг сообщений в Reporter\n* Waiter - ожидания, которые возвращают параметризованный WaitResult. Замена ожиданий Selenium\n* PumpException - собственная реализация Исключений\n* PumpMessage - Форматированные сообщения для вывода в консоль\n* ConfigurationsLoader - удобная загрзка конфигурация из properties с маппингом на java объект\n\n#### Под-проект **web** предоставляет сущности для создания тестов web на основе подхода Page Object\n\n###### Пакет ru.mk.pump.web.browsers \n- Browser и AbstractBrowser - Интерфейс и реализация для доступа к браузеру. Изолирует работу с WebDriver от пользователя\n- Browsers - менеджер браузеров\n- AbstractDriverBuilder - билдер для создания экземпляра **WebDriver**. Можно расширять кол-во поддерживаемых реализаци **WebDriver**  \n\n###### Пакет ru.mk.pump.web.elements - Доступ к элементам на web странице.\n- Element и BaseElement  - Интерфейс и реализация для доступа элементам. Автоматизирует все проверки перед выполнением действия над элементом и упрощает взаимодействие.\nОбеспечивает логирование и репортинг с помощью слушателей.  \n  Все пользовательские элементы необходимо наследовать от **BaseElement**  \n  Все пользователькие интерфейсы элементов необходимо наследовать от **Element**  \n- api.annotations - Аннотации-маркеры для выбора из нескольких реализаций одного интерфейса элемента\n- ActionListener и StateListener - Слушатели для статусов элементов и действий над элементами\n- ElementFactory - Фабрика элементов для использования в Page Object инициализации. Расширяемая\n\n\n###### Пакет ru.mk.pump.web.page - web Страница. Автоматизирует проверки статуса загрузки старницы и упрощает работу со страницей для пользователя\n- ru.mk.pump.web.page.api.Page и BasePage - Интерфейс старницы и базовая реализация для наследования\n- ru.mk.pump.web.page.api.PageLoader и PageLoader - Все ожидания вынесены в отдельный интерфейс с базовой реализацией. Инстанс хранится в BasePage\n\n###### ru.mk.pump.web.component - общие сущности для возможности создания неограниченной иерархии вложенных элементов (и списков элементов) в странице\n \n###### ru.mk.pump.web.common - поддержка page object\n- Initializer - реализация org.openqa.selenium.support.pagefactory.FieldDecorator для иницализации элементов страницы. Без использования java.lang.reflect.Proxy (это плюс)\n- api.annotations - аннотации для полей с элементами на странице, в том числе аналоги FindBy и FindBys\n- ru.mk.pump.web.common.api.PageItemImplDispatcher - Диспетчер реализаций элементов. Загрущает и хранит интефрйсы и их реализации. \nПоддерживате возможность добавления пользовательских реализаций\n\n#### Для настройки элементов используются параметры вида Parameters\n- В паттерне Page Object для передачи параметров в элемент необходимо воспользоваться аннотациями из пакета ru.mk.pump.web.common.api.annotations\n- либо методом ru.mk.pump.web.elements.internal.BaseElement.withParams\n- элемент сам выбирает поддерживаемые параметры и записывает их в свои поля для дальнейшего использования\n- параметры описаны в ru.mk.pump.web.constants.ElementParams и в java-doc если присутствует аннотация ru.mk.pump.web.elements.internal.DocParameters\n\n#### Для настройки элементов используются параметры вида Parameters\n\n# Ожидает реализации\n- менеджер страниц\n- менеджер конфигураций фреймворка\n- отдельный проект - интеграция с cucumber\n- отдельный проект - параллельный раннер для cucumber и перезапуск проваленных тестов\n- дополнение юнит-тестов\n- поддержка сборки под Windows и Linux без установленных браузеров Chrome и PhantomJS (для юнит-тестов)\n\n## Quick Start\n#### Добавить в зависимости\nmaven\n```java\nне реализовано\n```\n\ngradle\n```java\nне реализовано\n```\n\n#### Создать класс Страницы Web Приложения унаследованный от ru.mk.pump.web.page.BasePage  \n```java\n    /**\n     * Страница наследуется от {@link BasePage}.\n     * Все приватные поля - это элементы либо компоненты\n     */\n    @Title(value = \"Регистрация\", desc = \"Страница регистрации Цифровая Ипотека\")\n    class RegPage extends BasePage {\n\n        /**\n         * Элемент TextArea.\n         * Стандартная аннотация FindBy.\n         * Аннотация {@link Title} определяет заголовок (имя) элемента и описание.\n         */\n        @FindBy(tagName = \"h2\")\n        @Title(value = \"Заголовок\", desc = \"Главный заголовок страницы\")\n        @Getter\n        private TextArea pageTitle;\n\n        /**\n         * Элемент наследник BaseComponent. Это отдельный класс - кусок страницы, который объединяет несколько элементов.\n         * Для него доступны все методы {@link Element}\n         * Стандартная аннотация FindBy.\n         * Аннотация {@link Title} определяет заголовок (имя) элемента (компонента) и описание.\n         */\n        @Title(\"Форма\")\n        @FindBy(className = \"mainlayout\")\n        @Getter\n        private RegMainForm mainForm;\n\n        /**\n         * Элемент общего интерфейса Element. Когда не важен конкретный класс элемента.\n         * Стандартная аннотация FindBy.\n         * Аннотация {@link Title} определяет заголовок (имя) элемента и описание.\n         * Этот элемент не существует на реальной странице, но удачно будет инициализирован.\n         * Ошибок не возникнет до взаимодействия.\n         */\n        @Title(\"Не существующий\")\n        @FindBy(className = \"mainlayout11\")\n        @Getter\n        private Element notExists;\n\n        /**\n         * Конcтруктор страницы. PUBLIC. Все конструкторы страниц, компонентов и элементов - PUBLIC!!!\n         * @param browser Браузер\n         */\n        public RegPage(Browser browser) {\n            super(browser);\n            setName(\"Регистрация\");\n            /*установить url*/\n            setUrl(DMUrls.REG_PAGE_URL);\n            /*установить проверку с ожиданием на присутствие в DOM элемента после открытия*/\n            getPageLoader().addExistsElements(pageTitle);\n            /*установить проверку с ожиданием на отображение элементов после открытия*/\n            getPageLoader().addDisplayedElements(pageTitle, mainForm);\n        }\n\n        /**\n         * Класс компонента. Наследуется от {@link BaseComponent} - это часть страницы. Объекдиняет несколько элементов.\n         * В данном случае это форма с множеством полей ввода и кнопок. Но описано только несколько.\n         * Аннотация {@link Title} читается не из класса компонента, а из поля, в котором он объявлен на странице!\n         * Не забываем про static для внутренних классов!\n         */\n        static class RegMainForm extends BaseComponent {\n\n            /**\n             * Список компонентов - это несколько зон в главной форме\n             */\n            @FindBy(xpath = \"//div[@class='squished row form-group']\")\n            @Getter\n            private List\u003cRegFormZone\u003e regFormZones;\n\n            public RegMainForm(By avatarBy, Page page) {\n                super(avatarBy, page);\n            }\n        }\n\n        /**\n         * Класс компонента. Наследуется от {@link BaseComponent} - это часть страницы. Объекдиняет несколько элементов.\n         * В данном случае это одна из зон основной формы\n         */\n        static class RegFormZone extends BaseComponent {\n\n            /**\n             * Список компонентов - это несколько колонок в каждой зоне основной формы\n             */\n            @FindBy(xpath = \"//div[contains(@class, 'column')]\")\n            @Getter\n            private List\u003cRegFormZoneColumn\u003e regFormZoneColumns;\n\n            public RegFormZone(By avatarBy, InternalElement parentElement) {\n                super(avatarBy, parentElement);\n            }\n        }\n\n        /**\n         * Колонка в каждой из зон формы\n         */\n        static class RegFormZoneColumn extends BaseComponent {\n\n            /**\n             * Список элементов\n             */\n            @FindBy(tagName = \"input\")\n            @Getter\n            private List\u003cInput\u003e inputs;\n\n            /**\n             * Конечный элемент\n             */\n            @FindBy(className = \"group-header\")\n            @Getter\n            private TextArea header;\n\n            @FindBy(id = \"regionAutocompleteId\")\n            @Title(value = \"Регион\", desc = \"Выбор региона из выпадающего списка\")\n            /*аннотация для определяния нескольких СТРОКОВЫХ параметров элемента*/\n            @PStrings({\n                /*один СТРОКОВЫЙ параметр*/\n                @PString(name = \"testParam1\", value = \"paramValue1\"),\n                @PString(name = \"testParam2\", value = \"paramValue2\")\n            })\n            /*аннотация для определяния нескольких параметров элемента типа Локатор*/\n            @PFindBys({\n                /*один параметр Локатор*/\n                @PFindBy(name = \"extraBy\", value = {@FindBy(xpath = \"//div\")}),\n                @PFindBy(name = \"iddInputBy\", value = {@FindBy(tagName = \"input\")}),\n                @PFindBy(name = \"iddDropDownBy\", value = {@FindBy(xpath = \".\")})\n            })\n            @Getter\n            private InputDropDown inputDropDownRegions;\n\n            public RegFormZoneColumn(By avatarBy, InternalElement parentElement) {\n                super(avatarBy, parentElement);\n            }\n        }\n    }\n```\n\n#### Создать браузер\n```java\nBrowsers browsers = new Browsers();\nBrowserConfig config = new BrowserConfig(false, Size.of(true), BrowserType.CHROME);\nBrowser browser = browsers.newBrowser(config);\n```\n\n#### Создать страницу\n```java\nRegPage page = new RegPage(browser);\n```\n\n#### Запустить браузер и открыть страницу\n```java\nbrowser.start();\npage.open();\n```\n\n#### Взаимодействие с элементом\n```java\n/*Получить элемент Поле ввода*/\nInput input = page.getMainForm().getRegFormZones().get(0).getRegFormZoneColumns().get(1).getInputs().get(2);\n/*Информация об элементе - имя*/\ninput.info().getName();\n/*Информация об элементе - описание*/\ninput.info().getDescription();\n/*Ввод значения*/\ninput.type(\"MAX\");\n/*Получить текст*/\ninput.getText();\n/*Получить элемент Выпадающий список с вводом*/\nInputDropDown inputDropDown = page.getMainForm().getRegFormZones().get(2).getRegFormZoneColumns().get(1).getInputDropDownRegions();\n/*Ввод текста и выбор из выпадающего списка введенного значения*/\ninputDropDown.typeAndSelect(\"Москва\");\n```\n\n\u003eЧтобы запустить из IDE со включенным логгером :  \n ```-javaagent:./../libs/aspectjweaver.jar``` ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkochetkov-ma%2Fpump-fw","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkochetkov-ma%2Fpump-fw","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkochetkov-ma%2Fpump-fw/lists"}