Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class Menu {
- private final SelenideElement container;
- private final ElementsCollection items;
- public Menu(SelenideElement container, ElementsCollection items) {
- this.container = container;
- this.items = items;
- }
- /*
- тут все ок
- универсальный конструктор
- */
- public Menu(SelenideElement container) {
- this(
- container,
- container.findAll(".dropdown-menu a").filterBy(visible)
- );
- }
- /*
- и тут все неплохо - частый случай похоже
- смотри - ниже в конструкторах - this.items - всегда так получаешь
- значит - можно далее и не реализовывать
- первый совсем универсальный
- и этот поточнее, но тоже в общем универсальный
- остальные - уже перебор
- и будешь вызывать тогда виджет - передавая разные контейнеры как параметр конструктора
- т е - изнутри этого виджета - оперирует уже лишь тем контейнером что нам передали
- */
- public Menu() {
- this.container = $("#user_name");
- this.items = container.findAll(".dropdown-menu a").filterBy(visible);
- }
- public Menu(String name){
- this.container = $$("#navbar-collapse .navbar-nav li a").filterBy(visible).findBy(exactText(name));
- this.items = container.findAll(".dropdown-menu a").filterBy(visible);
- }
- /*
- вот я про эти
- они уйдут
- и будешь вызывать
- new Menu(xxx("name"))
- где xxx() - хорощее понятное имя для метода
- возвращающего $$("#navbar-collapse .navbar-nav li a").filterBy(visible).findBy(exactText(name))
- это все будет там - гже мы меню вызываем
- т е - логика самого виджета меню - будет максимально разгруженная
- тут будет лишь самое необходимое
- то что касается любого меню
- а все уточнения - это уже на вызывающей стороне пусть будет
- */
- public Menu open(){
- this.container.click();
- return this;
- }
- public void select(String itemText){
- this.items.findBy(exactText(itemText)).click();
- }
- /*
- к этим методам вопросов нет, тут все ок
- */
- public SelenideElement getCommonMenuElement(){
- return container;
- }
- /*
- благодаря тому - что на вызывающей стороне - мы точно зададим контейнер для меню
- то и из меню - нам не надо его добывать)
- он уже там есть - на вызывающей стороне)
- этот метод уйдет
- будет версия - очень похожая на
- https://github.com/automician/snippets/blob/master/java/widgetsapproach/src/main/java/com/automician/widgets/basic/Menu.java
- */
- ********************************************************
- второй проблемный вариант у меня там был с кнопкой выбра типа поста при публикации (в методе ensurePublicPostingMode())
- public class Post {
- ...
- public void ensurePublicPostingMode() {
- new Button($(".aspect_dropdown")).click();
- new RadioGroup($(".aspect_dropdown .radio")).clickOn(By.linkText("Public"));
- }
- }
- http://joxi.ru/MAj1YoWs4jy092
- /*
- будет еще что-то похожее http://joxi.ru/82QYoQyIjwGQ12
- будем делать виджеты, да не один )
- Тут - http://joxi.ru/MAj1YoWs4jy092 - наш виджет (прямоугольник 3 на рисунке)
- пусть будет PostAspectManager
- кликаем на кнопку и открывается дропдаун лист
- это похоже на меню - но не меню
- радиогруп - это только вот эта часть - http://joxi.ru/n2YkKaGUobKqXr
- радио = выбрать что-то одно из нескольких вариантов
- только этот кусочек так и работает
- а вот область 1 из http://joxi.ru/MAj1YoWs4jy092
- похожа на дропдаун лист из http://joxi.ru/82QYoQyIjwGQ12
- и вот у этого кусочка листа - есть общая логика
- отображены в листе - аспекты
- и тут - множественный выбор
- что у нас тут за логика - на уровне PostAspectManager в общем (http://joxi.ru/MAj1YoWs4jy092)
- у виджета = есть контейнер $(".aspect_dropdown")
- а вот для выбора аспектов для контакта -
- обрати внимание на http://joxi.ru/82QYoQyIjwGQ12
- на одной страничке - несколько таких виджетов
- так что критично оттолкнуться от парента
- у виджета = есть контейнер $(....).find(".aspect_dropdown")
- где вот этот $(....) - это SelenideElement parent
- который надо передать в конструктор
- пусть этот будет ContactAspectManager
- и там и там
- по клику на контейнере открывается дропдаун список
- Именно для PostAspectManager - актуально
- для прямоугольника 2 из http://joxi.ru/MAj1YoWs4jy092
- selectPublic()
- selectAllAspects()
- В отличие от ContactAspectManager, где такого блока нету
- А вот часть 1 из http://joxi.ru/MAj1YoWs4jy092 (и также весь список из http://joxi.ru/82QYoQyIjwGQ12)
- эта часть переменная, там отображаются все аспекты, которые юзер использует
- это можно настраивать - набор аспектов - что юзер использует, так что тоже это придется учитывать
- и в работе с этой частью - вот что происходит
- клик - не закрывает дропдаун список
- а лишь меняет статус аспекта - включен/отключен
- и у PostAspectManager, и у ContactAspectManager - есть такая же штука
- раз это встречается в 2-ух разных случаях
- причем - поведение этого куска = одинаково
- то это стоит оформить как еще один виджет
- пусть будет AspectList
- вызывать из менеджера - будем методом openAspects() например
- в котором фактически - сделаем new AspectList(this.container)
- и вернем это
- в общем случае - чего бы мы хотели от такого виджета - от AspectList
- конструктор new AspectList(...) - передали парента (в нашем случае - это контейнер от ....AspectManager)
- select(String... aspectNames)
- deselect(String... aspectNames)
- selectAll()
- deselectAll()
- и
- ensure(String... selectedAspectNames)
- сделать все заявленное и закрыть дропдаун
- ensure - проверяет(if) и если надо делает
- select - проверяет что отключен(assert)=можем включить + включает
- deselect - аналогично = проверяет что включен(assert)=можем отключить + отключает
- ensure - просто обеспечивает нужную ситуацию
- больше для гивен-действий нужно
- а вот select/deselect - уже для тестового действия
- мы в момент действия - ведь рассчитываем и на начальное состояние какое-то
- и на последующие конкретные действия
- Уже на уровне менеджера = возможно понадобится проверка текста на кнопке - после выбора
- assertChoice(....)
- про параметры - надо подумать
- как понадобится - подумаешь
- и в твоем простом случае - будет вот такой вызов
- new PostAspectManager().selectPublic()
- а если бы пришлось по аспектам пройтись
- то
- new postAspectManager().openAspects().select(....)
- похоже будет и у ContractAspectManager
- мы не объединили в один виджет PostAspectManager и ContractAspectManager
- т к все же разница в поведении есть
- и на этапе использования - уже не хочется думать
- ага, раз работаем с контрактами, знач этого у виджета вызывать нельзя - selectPublic()
- хотя, конечно, очень похои они
- может через время станет понятнее - как упростить еше
- но для первого варианта - точно ок будет )
- общее - что и там и там используется - вынесли в AspectList
- и будем его переиспользовать
- Посмотри в моем проекте на гитхабе - тест-классы для контактов и аспектов
- там скорее всего работа с этими штуками есть
- сможешь сообразить какой функционал будет востребован
- */
Advertisement
Add Comment
Please, Sign In to add comment