julia_v_iluhina

Untitled

Sep 30th, 2016
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.24 KB | None | 0 0
  1. @Override
  2.     public WebElement getWrappedEntity() {
  3.         WebElement element = fetchWrappedEntity();
  4.         if (element == null) {
  5.             throw new ElementNotFoundException();
  6.             /*
  7.                 тут лучше в качестве параметра для ElementNotFoundException -
  8.                 передать toString() этого же лейзи-элемента
  9.                 чтобы было яснее - какой элемент не найден
  10.  
  11.                 см раздел ниже - ответы на вопросы (тут же в ревью)
  12.             */
  13.         }
  14.         else return element;
  15.         /*
  16.             тут и без else будет ок
  17.  
  18.             если нулл - мы уже вышли по эксепшену)
  19.  
  20.             дальше - просто возвращай element
  21.         */
  22.     }
  23. ***********************************
  24.         @Override
  25.         public WebElement fetchWrappedEntity() {
  26.             for (LazyElement lazyElement: parentCollection) {
  27.                 if (lazyElement.is(condition)) {
  28.                     return lazyElement.getWrappedEntity();
  29.                 }
  30.             }
  31.             return null;
  32.         }
  33.         /*
  34.             мы договорились - сами нулл нигде не возвращаем)
  35.  
  36.             тут - вместо return null;
  37.             тоже бросай ElementNotFoundException
  38.         */
  39. ************************************************
  40.  
  41. public abstract class AbstractCondition<T> implements Condition<T>, DescribesResult{
  42.  
  43.     protected LazyEntity entity;
  44.     /*
  45.         тут можно объявить LazyEntity<T> entity
  46.         тогда можно будет не приводить тип
  47.         вместо - check((T) entity.getWrappedEntity())
  48.         будет - check(entity.getWrappedEntity())
  49.     */
  50.  
  51.     public abstract T check(T wrappedEntity);
  52.     /*
  53.         давай check  - доработаем
  54.         пусть он возвращает boolean
  55.     */
  56.  
  57.     public T apply(LazyEntity entity) {
  58.         this.entity = entity;
  59.         T result = check((T) entity.getWrappedEntity());
  60.         /*
  61.             тут - мы сначала в переменную типа T wrappedEntity
  62.             поместим entity.getWrappedEntity()
  63.  
  64.             далее вызовем  check
  65.             и если он вернет true - мы вернем wrappedEntity
  66.  
  67.             иначе - вызовем исключение WebDriverAssertionException
  68.             и в качестве параметра WebDriverAssertionException() - передадим toString()
  69.             кондишена
  70.  
  71.             так мы в коде всех конецных кондишенов - уберем работу с нуллом
  72.  
  73.             метод  check - будет говорить - да/нет
  74.             и уже лишь на уровне apply - мы будем возвращать wrappedEntity, если
  75.         */
  76.  ********************************************
  77.  public LazyElement startEdit(String oldTask, String newTask) {
  78.          tasks.find(exactText(oldTask)).find("label").doubleClick();
  79.          //return tasks.find(exactText(oldTask)).find("label").doubleClick().find(".editing").find(".edit").setValue(newTask);
  80.          return tasks.find(exactText(oldTask)).find("editing").find(".edit").setValue(newTask);
  81.  }
  82.  
  83.  плюс падает тест на редактирования таска в тудумвс, хотелось бы обсудить
  84.  
  85.  /*
  86.     вторая строчка - изначально была не такой)
  87.  
  88.     подними селенидовские тесты)
  89.  
  90.     было - return tasks.find(cssClass("editing").find(".edit").setValue(newTask);
  91.  
  92.     после даблклика -
  93.         внутри таски становится видимым элемент .edit
  94.         у самой таски появляется класс editing
  95.         и теперь таску - мы не пожен найти по тексту, но можем - по классу editing
  96.  
  97.     нужно разработать новый кондишен cssClass - потомок AbstractElementCondition
  98.     который для элемента определит - есть ли у элемента такой класс
  99.  
  100.     в предыдущих работах по селениуму было что-то такое, только посложнее
  101.     возьми идеи оттуда
  102. */
  103. ********************************
  104. ******ответы на вопросы**************
  105. *************************
  106. когда мы пишем WebDriverAssertionException, что должно быть в его теле?
  107. Надо как-то подробнее выводить прчину ошибки?
  108.  
  109. /*
  110.     все верно
  111.     у всех тобой реализованных кондишенов  - реализуй конструктор с одним параметром String message
  112.     в котором вызывай super(message);
  113.  
  114.     http://developer.alexanderklimov.ru/android/java/extends.php
  115.     http://metanit.com/java/tutorial/3.5.php
  116.     https://docs.oracle.com/javase/tutorial/java/IandI/super.html
  117.  
  118.  
  119.     и в качестве параметров для конструкторов этих эксепшенов - передавай toString() того объекта
  120.     с которым работаем
  121.     выше писала про это
  122.  
  123. */
  124. ********************************
  125. “Дорабатываем наши кондишены
  126.        метод check - у нас уже возвращает значение типа boolean (прошла/не прошла проверка)
  127.  
  128. но я смотрю на метод например у кондишена Text
  129.  
  130. public WebElement check(WebElement element) {
  131.        actualText = element.getText();
  132.        return actualText.contains(expectedText)?element:null;
  133.    }
  134.  
  135. и я там возвращаю нулл, если проверка не прошла. Мы когда-то сделали так, чтобы возвращать элемент, а не булеан.
  136.  
  137. /*
  138.     это выше расписала
  139.  
  140.     мы получается - отделяем логику проверки
  141.     которая суть - да или нет
  142.     и логику apply - который возвращает нужный нам объект в случае успеха
  143. */
  144. ***************************
  145.  
  146. и еще: я в AbstractLazyElement объявила абстрактный метод fetchWrappedEntity, использовала его в новом методе getWrappedEntity():
  147.  
  148. public WebElement getWrappedEntity() {
  149.        WebElement element = fetchWrappedEntity();
  150.        if (element == null) {
  151.            throw new ElementNotFoundException();
  152.        }
  153.        else return element;
  154.    }
  155.  
  156. и теепрь мне надо реализовать этот fetch для каждого вида lazy entity
  157.  
  158. т.е. я просто переименовываю в каждом классе для entity метод getWrappedEnitty на fetchWrappedEntity?
  159.  
  160. и получается вот так:
  161.  
  162. @Override
  163.    public WebElement fetchWrappedEntity() {
  164.        for (LazyElement lazyElement: parentCollection) {
  165.            if (lazyElement.is(condition)) {
  166.                return lazyElement.getWrappedEntity();
  167.            }
  168.        }
  169.        return null;
  170. /*
  171.     все верно ты сделала
  172.     только null возвращать мы не будем - сразу исключение кинем
  173.     выше есть про это
  174. */
  175. ***********************************************
  176.  
  177. /*
  178.     в fetchWrappedEntity()
  179.     для классов
  180.             LazyCollectionFoundByConditionElement
  181.             и
  182.             LazyCollectionFiltered
  183.  
  184.     вариант обхода
  185.              for (LazyElement lazyElement: parentCollection)
  186.     с применением метода is
  187.     конечно, дает наиболее аккуратный код
  188.     тут я с тобой соглашусь)
  189.  
  190.     что по факту мы делаем
  191.  
  192.            сначала - заворачиваем каждый вебэлемент списка коллекции
  193.            (чтобы воспользоваться итератором для нашей лейзи-коллекции)
  194.            а потом - на каждом шаге - разворачиваем
  195.            (внутри проверки is - получаем wrappedElement = element.getWrappedEntity())
  196.  
  197.            т е - делаем таки кучу ненужной работы - заворачиваем и разворачиваем
  198.            хоть код и красивый, конечно...
  199.  
  200.        правильнее - для оптимизации реально выполняемых действий -
  201.        отказаться от идеи обхода коллекции таким образом
  202.             for (LazyElement lazyElement: parentCollection)
  203.  
  204.        а реализовать вот так
  205.            получить список вебэлементов parentCollection.getWrappedEntity()
  206.            обойти полученный список вебэлементов в цикле
  207.            и применять к вебэлементу - метод check
  208.            (как раз - у него параметр = вебэлемент, соотвественно
  209.            никаких дополнительных ужимок и прыжков делать не надо)
  210.  
  211.            сэкономим на заворачиваниях-разворачиваниях)
  212.  
  213.      
  214.       пока метод check нам не доступен... - мы не можем вызвать метод check кондишена
  215.           т к у интерфейса кондишена такой метод не объявлен.
  216.    
  217.           поступим пока не красиво - объявим на уровне интерфейса Condition - метод check
  218.           тогда для метода check - придется поправить во всех реализованных кондишенах - модификатор доступа -
  219.           protected на public
  220.    
  221.           про красоту  - чуть позже побеспокоимся )
  222.           сейчас про функциональность
  223.    
  224.           раз у нас будет метод check объявлен на уровне интерфейса - значит мы сможем его использовать
  225.           в варианте condition.check(...)
  226.    
  227.     пока не настаиваю
  228.     но разумнее прислушаться к моему совету)
  229.     и поправить методы fetchWrappedEntity()
  230.                 и для LazyCollectionFoundByConditionElement
  231.                 и для LazyCollectionFiltered
  232.    
  233.     важно  - чтобы fetchWrappedEntity() максимально шустро работали
  234.     оптимизировать скорость - уже на следующем шаге придется)
  235. */
  236. **************************************************
  237. /*
  238.     еще немного challenge )
  239.  
  240.     в интерфейсе LazyElement
  241.         объяви методы
  242.     LazyCollection findAll(By innerLocator);
  243.     LazyCollection findAll(String innerCssSelector);
  244.  
  245.     и реализуй их в AbstractLazyElement
  246.  
  247.     этот метод позволит у элемента  - по селектору или локатору - получить коллекцию внутренних элементов
  248.  
  249.     отладиться можно - используя
  250.     LazyCollection tasks = $("#todo-list").findAll("li");
  251.     или
  252.     LazyCollectionLazyCollection emails = $("[role='main']").findAll(".zA");
  253.  
  254.     Иногда такой метод findAll будет очень полезным
  255.  
  256.     принципы - те же
  257.     как ты до этого реализовывала методы get, find, filter ...
  258.  
  259.     так сказать - для закрепления результатов)
  260. */
Advertisement
Add Comment
Please, Sign In to add comment