julia_v_iluhina

Untitled

Jan 17th, 2017
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.68 KB | None | 0 0
  1. public class Menu {
  2.     private final SelenideElement container;
  3.     private final ElementsCollection items;
  4.  
  5.     public Menu(SelenideElement container, ElementsCollection items) {
  6.         this.container = container;
  7.         this.items = items;
  8.     }
  9.     /*
  10.         тут все ок
  11.         универсальный конструктор
  12.     */
  13.  
  14.     public Menu(SelenideElement container) {
  15.         this(
  16.             container,
  17.             container.findAll(".dropdown-menu a").filterBy(visible)
  18.         );
  19.     }
  20.     /*
  21.         и тут все неплохо - частый случай похоже
  22.         смотри - ниже в конструкторах - this.items - всегда так получаешь
  23.  
  24.         значит - можно далее и не реализовывать
  25.         первый совсем универсальный
  26.         и этот поточнее, но тоже в общем универсальный
  27.  
  28.         остальные - уже перебор
  29.         и будешь вызывать тогда виджет - передавая разные контейнеры как параметр конструктора
  30.         т е - изнутри этого виджета - оперирует уже лишь тем контейнером что нам передали
  31.     */
  32.  
  33.     public Menu() {
  34.         this.container = $("#user_name");
  35.         this.items = container.findAll(".dropdown-menu a").filterBy(visible);
  36.     }
  37.  
  38.     public Menu(String name){
  39.         this.container = $$("#navbar-collapse .navbar-nav li a").filterBy(visible).findBy(exactText(name));
  40.         this.items = container.findAll(".dropdown-menu a").filterBy(visible);
  41.     }
  42.     /*
  43.         вот я про эти
  44.         они уйдут
  45.  
  46.         и будешь вызывать
  47.         new Menu(xxx("name"))
  48.         где xxx() - хорощее понятное имя для метода
  49.         возвращающего $$("#navbar-collapse .navbar-nav li a").filterBy(visible).findBy(exactText(name))
  50.  
  51.         это все будет там - гже мы меню вызываем
  52.         т е - логика самого виджета меню - будет максимально разгруженная
  53.         тут будет лишь самое необходимое
  54.         то что касается любого меню
  55.  
  56.         а все уточнения - это уже на вызывающей стороне пусть будет
  57.     */
  58.  
  59.     public Menu open(){
  60.         this.container.click();
  61.         return this;
  62.     }
  63.  
  64.     public void select(String itemText){
  65.         this.items.findBy(exactText(itemText)).click();
  66.     }
  67. /*
  68.     к этим методам вопросов нет, тут все ок
  69. */
  70.  
  71.     public SelenideElement getCommonMenuElement(){
  72.         return container;
  73.     }
  74. /*
  75.     благодаря тому - что на вызывающей стороне - мы точно зададим контейнер для меню
  76.     то и из меню - нам не надо его добывать)
  77.     он уже там есть - на вызывающей стороне)
  78.  
  79.     этот метод уйдет
  80.  
  81.     будет версия - очень похожая на
  82.     https://github.com/automician/snippets/blob/master/java/widgetsapproach/src/main/java/com/automician/widgets/basic/Menu.java
  83.  
  84.  
  85. */
  86. ********************************************************
  87. второй проблемный вариант у меня там был с кнопкой выбра типа поста при публикации (в методе ensurePublicPostingMode())
  88. public class Post {
  89. ...
  90.     public void ensurePublicPostingMode() {
  91.         new Button($(".aspect_dropdown")).click();
  92.         new RadioGroup($(".aspect_dropdown .radio")).clickOn(By.linkText("Public"));
  93.     }
  94. }
  95. http://joxi.ru/MAj1YoWs4jy092
  96. /*
  97.     будет еще что-то похожее http://joxi.ru/82QYoQyIjwGQ12
  98.     будем делать виджеты, да не один )
  99.  
  100.     Тут - http://joxi.ru/MAj1YoWs4jy092 - наш виджет (прямоугольник 3 на рисунке)
  101.     пусть будет PostAspectManager
  102.  
  103.     кликаем на кнопку и открывается дропдаун лист
  104.  
  105.     это похоже на меню - но не меню
  106.  
  107.     радиогруп - это только вот эта часть - http://joxi.ru/n2YkKaGUobKqXr
  108.     радио = выбрать что-то одно из нескольких вариантов
  109.     только этот кусочек так и работает
  110.  
  111.     а вот область 1 из http://joxi.ru/MAj1YoWs4jy092
  112.     похожа на дропдаун лист из http://joxi.ru/82QYoQyIjwGQ12
  113.     и вот у этого кусочка листа - есть общая логика
  114.     отображены в листе - аспекты
  115.     и тут - множественный выбор
  116.  
  117.     что у нас тут за логика - на уровне PostAspectManager в общем (http://joxi.ru/MAj1YoWs4jy092)
  118.     у виджета = есть контейнер $(".aspect_dropdown")
  119.  
  120.     а вот для выбора аспектов для контакта -
  121.     обрати внимание на http://joxi.ru/82QYoQyIjwGQ12
  122.     на одной страничке - несколько таких виджетов
  123.     так что критично оттолкнуться от парента
  124.     у виджета = есть контейнер $(....).find(".aspect_dropdown")
  125.     где вот этот $(....) - это  SelenideElement parent
  126.     который надо передать в конструктор
  127.     пусть этот будет ContactAspectManager
  128.  
  129.     и там и там
  130.     по клику на контейнере открывается дропдаун список
  131.    
  132.     Именно для PostAspectManager - актуально
  133.             для прямоугольника 2 из http://joxi.ru/MAj1YoWs4jy092
  134.             selectPublic()
  135.             selectAllAspects()
  136.     В отличие от ContactAspectManager, где такого блока нету        
  137.  
  138.     А вот часть 1 из http://joxi.ru/MAj1YoWs4jy092 (и также весь список из http://joxi.ru/82QYoQyIjwGQ12)
  139.         эта часть переменная, там отображаются все аспекты, которые юзер использует
  140.         это можно настраивать - набор аспектов - что юзер использует, так что тоже это придется учитывать
  141.         и в работе с этой частью - вот что происходит
  142.         клик - не закрывает дропдаун список
  143.         а лишь меняет статус аспекта - включен/отключен
  144.        
  145.         и у PostAspectManager, и у ContactAspectManager - есть такая же штука
  146.         раз это встречается в 2-ух разных случаях
  147.         причем - поведение этого куска = одинаково
  148.         то это стоит оформить как еще один виджет
  149.         пусть будет AspectList
  150.        
  151.         вызывать из менеджера - будем методом openAspects() например
  152.         в котором фактически - сделаем new AspectList(this.container)
  153.         и вернем это
  154.  
  155.     в общем случае - чего бы мы хотели от такого виджета - от AspectList
  156.         конструктор new AspectList(...)  - передали парента (в нашем случае - это контейнер от ....AspectManager)
  157.  
  158.         select(String... aspectNames)
  159.         deselect(String... aspectNames)
  160.         selectAll()
  161.         deselectAll()
  162.  
  163.         и
  164.         ensure(String... selectedAspectNames)
  165.        
  166.         сделать все заявленное и закрыть дропдаун
  167.         ensure - проверяет(if) и если надо делает
  168.         select - проверяет что отключен(assert)=можем включить + включает
  169.         deselect - аналогично = проверяет что включен(assert)=можем отключить + отключает
  170.  
  171.         ensure - просто обеспечивает нужную ситуацию
  172.         больше для гивен-действий нужно
  173.         а вот select/deselect - уже для тестового действия
  174.         мы в момент действия - ведь рассчитываем и на начальное состояние какое-то
  175.         и на последующие конкретные действия
  176.  
  177.         Уже на уровне менеджера = возможно понадобится проверка текста на кнопке - после выбора
  178.         assertChoice(....)
  179.         про параметры - надо подумать
  180.         как понадобится - подумаешь
  181.  
  182.     и в твоем простом случае - будет вот такой вызов
  183.     new PostAspectManager().selectPublic()
  184.    
  185.     а если бы пришлось по аспектам пройтись
  186.     то
  187.     new postAspectManager().openAspects().select(....)
  188.    
  189.     похоже будет и у ContractAspectManager
  190.    
  191.     мы не объединили в один виджет PostAspectManager и ContractAspectManager
  192.     т к все же разница в поведении есть
  193.     и на этапе использования - уже не хочется думать
  194.     ага, раз работаем с контрактами, знач этого у виджета вызывать нельзя - selectPublic()
  195.     хотя, конечно, очень похои они
  196.     может через время станет понятнее - как упростить еше
  197.     но для первого варианта - точно ок будет )
  198.    
  199.     общее - что и там и там используется - вынесли в AspectList
  200.     и будем его переиспользовать
  201.  
  202.     Посмотри в моем проекте на гитхабе - тест-классы для контактов и аспектов
  203.     там скорее всего работа с этими штуками есть
  204.     сможешь сообразить какой функционал будет востребован
  205.  
  206. */
Advertisement
Add Comment
Please, Sign In to add comment