julia_v_iluhina

Untitled

Oct 5th, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.84 KB | None | 0 0
  1. public abstract class CollectionCondition extends AbstractCondition<List<WebElement>> {
  2. }
  3. /*
  4.     отсюда ушел весь код)
  5.     в принципе - мы используем этот тип - как предка для кондишенов
  6.  
  7.     мы - объявляя кондишены - используем
  8.         public class ListNthElementHasText extends CollectionCondition
  9.     а не
  10.         public class ListNthElementHasText extends AbstractCondition<List<WebElement>>
  11.  
  12.     что немного проще - и ради этого - можно оставить  этот класс
  13.     а можно - убрать эту ступень в иерархии
  14.  
  15.     касается и ElementCondition
  16. */
  17. ************************************************
  18. public interface LazyElement extends LazyEntity <WebElement>, WebElement {
  19.  
  20.  
  21.     public void click();
  22.     public void clear();
  23. /*
  24.     такие методы есть и у WebElement )
  25.     потому - эти тут убирай
  26.     нету смысла тут объявлять одноименные методы с методами интерфейса-предка
  27.     потому - непонятно - какой интерфейс будет источником объявлений для метода
  28.     как бы - нам оно не мешает, но может запутать
  29.     а главное - нету в этом полезного)
  30.  
  31.     а вот doubleClick(), hover(), setValue(...) - нету )
  32.     эти тут стоит объявить
  33.     и реализовать в AbstractLazyElement
  34. */
  35. *******************************
  36.     @Override
  37.     public String getTagName() {
  38.         waitFor(this).until(present());
  39.         /*
  40.             подождали правильно
  41.         */
  42.         getWrappedEntity().getTagName();
  43.         /*
  44.             получили имя тега
  45.             но - полученое значение никак не использовали
  46.         */
  47.         return String.valueOf(this);
  48.         /*
  49.             а вместо имени тега - вернули тестовое предстваление нашего объекта
  50.  
  51.             у нас просили имя тега)
  52.         */
  53.     }
  54. **************************************
  55.        @Override
  56.         public String getAttribute(String s) {
  57.             waitFor(this).until(present());
  58.             getWrappedEntity().getAttribute(s);
  59.             return String.valueOf(this);
  60.         }
  61. /*
  62.     тут - аналогичная проблемка)
  63.  
  64.     получили значение атрибута, но вернули другое)
  65.  
  66.     и я бы подправила имя параметра
  67.     я в курсе - что это еще на уровне объявления WebElement проблемка
  68.     но тут - мы в состоянии имя параметра сделать нагляднее
  69.     name -  будет в самый раз)
  70. */
  71. **************************
  72.     @Override
  73.     public String getText() {
  74.         waitFor(this).until(visible());
  75.         getWrappedEntity().getText();
  76.         return String.valueOf(this);
  77.     }
  78. /*
  79.     тут тоже - получили текст
  80.     но его не вернули
  81. */
  82. *********************************
  83.     @Override
  84.     public List<WebElement> findElements(By by) {
  85.         waitFor(this).until(visible());
  86.         getWrappedEntity().findElements(by);
  87.         /*
  88.             вот findElements - уже возвратил - то что нам нужно
  89.             это и нам надо вернуть
  90.         */
  91.         return (List<WebElement>) this;
  92.     }
  93. *********************************
  94.     @Override
  95.     public WebElement findElement(By by) {
  96.         waitFor(this).until(visible());
  97.         getWrappedEntity().findElement(by);
  98.         /*
  99.             верни результат getWrappedEntity().findElement(by);
  100.         */
  101.         return this;
  102.     }
  103. *****************************************
  104.     @Override
  105.     public String getCssValue(String s) {
  106.     /*
  107.         тут тоже имя параметра можно улучшить до propertyName
  108.         к примеру
  109.         или просто name
  110.     */
  111.         waitFor(this).until(visible());
  112.         getWrappedEntity().getCssValue(s);
  113.         /*
  114.             то же самое - возвращай результат getWrappedEntity().getCssValue(s);
  115.  
  116.             как-то через один метод - ок
  117.             а через один - с такой проблеммой)
  118.  
  119.             тут кстати лучше ждать present()
  120.             для таких вещей видимости  и не нужно
  121.         */
  122.         return String.valueOf(this);
  123.     }
  124. *************************************
  125.     @Override
  126.     public boolean isDisplayed() {
  127.         waitFor(this).until(visible());
  128.         /*
  129.             тоже интересно)
  130.             сначала - дождемся - что элемент видим
  131.  
  132.             а потом - ответим - видим он или нет)
  133.  
  134.             тут ждать present()
  135.         */
  136.         return getWrappedEntity().isDisplayed();
  137.     }
  138. ****************************
  139. http://joxi.ru/DmBNWL6FNRNzom
  140. http://joxi.ru/823k1x0U6P6DV2
  141.  
  142. /*
  143.     я бы интерфейсы вынесла на уровень выше
  144.  
  145.     мы же в итоге - будем оперировать именно итпами этих интерфейсов
  146.     потому глубоко запихивать - такое не надо
  147.     но и выносить из wrappers - не стоит
  148. */
  149. ****************************
  150. public class LazyWrappedWebElement extends AbstractLazyElement
  151. /*
  152.     в этот класс я бы передавала не только вебэлемент
  153.     но и родительскую сущность - откуда мы добыли этот вебэлемент
  154.  
  155.     чтоб потом в toString  вот такое писать
  156.     "WebElement " + element.toString() + " from " + parentEntity;
  157.  
  158.     причем - мы моем это добыть как в коллекции, так и в элементе
  159.     потому parentEntity - это именно LazyEntity
  160.     к этому типу можно привести как коллекцию так и элемент
  161. */
  162. ***********************************
  163. public interface LazyCollection extends LazyEntity<List<WebElement>>, Iterable<LazyElement> {
  164.  
  165.     ....
  166.  
  167.     public WebElement get(List <LazyElement> lazyElements, int index);
  168.     /*
  169.         в правильном месте объявила
  170.         но - перемудрила )
  171.  
  172.         это - метод коллекции
  173.         потому - не нужен параметр List <LazyElement> lazyElements
  174.         т к мы оперируем именно элементами коллекции - того же объекта
  175.         чей это метод
  176.  
  177.         и возвращает этот метод не WebElement
  178.         а тоже LazyElement
  179.     */
  180. }
  181. **********************************
  182.  public WebElement get(List<LazyElement> lazyElementList, int index) {
  183.      return new ElementOfLazyCollection(lazyElementList, index).getWrappedEntity();
  184.  }
  185.  
  186. /*
  187.     верно - мы создадим новый лейзи-элемент нового специального типа
  188.  
  189.     и передадим ему - лейзи-коллекцию (this)
  190.     и индекс
  191.  
  192.     и вернет этот метод - собственно этот лейзи-элемент
  193.  
  194.     все лейзи-элементы - можно привести к типу LazyElement
  195.     так что LazyElement - это тип
  196.     который возвращает этот метод
  197.  
  198.     а по сути - это объект нового типа ElementOfLazyCollection
  199.  
  200.     про вот такое использование типа интерфейса - почитай
  201.     http://stackoverflow.com/questions/1932247/abstract-classes-and-interfaces-best-practices-in-java
  202.     http://joxi.ru/E2pdR1lFB1pyM2
  203.  
  204.     про this
  205.     https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
  206.     http://stackoverflow.com/questions/2411270/when-should-i-use-this-in-a-class
  207.  
  208.  
  209.     а getWrappedEntity() - не
  210.     нам тут не надо
  211.     тут - мы лишь фиксируем - как искать то, что нам надо
  212.  
  213.     начнем искать - когда будет потребность
  214.     или проверка, или работа с элементом
  215.     и там уже - и подождем и получим getWrappedEntity()
  216. */
  217. ***********************************
  218.  public Iterator<LazyElement> iterator() {
  219.  /*
  220.     с этим - все ок
  221.  */
  222. ****************************************
  223. public class ElementOfLazyCollection {
  224. /*
  225.     все классы - будем называть по схеме
  226.     Lazy+откуда+уточнения+Element
  227.     LazyCollectionNthElement - будет ок
  228. */
  229.  
  230.     List<LazyElement> lazyElementList;
  231.     /*
  232.         тут будет LazyCollection parentCollection
  233.  
  234.         в конструкторе - тоже
  235.     */
  236.     int index;
  237. ...
  238.  
  239.     public WebElement getWrappedEntity() {
  240.         return lazyElementList.get(index);
  241.         /*
  242.             а тут уже воспозьзуемся getWrappedEntity() нашей родительской коллекции
  243.             это - список вебэлементов
  244.             и из нее - уже по индексу получишь что нужно
  245.         */
  246.     }
  247. }
  248. *****************************************
  249. *
  250.     ну и еще один наворот на тему интерфейсов )
  251.  
  252.     как выше писала - класс может имплементировать несколько интерфейсов
  253.  
  254.     и прикольно - всю функциональность описывать на уровне интерфейсов
  255.     это дает ряд интересных полезных эффектов
  256.  
  257.     вот тут например -
  258.     описать интерфейс DescribesResult
  259.     с методами expected() и  actual()
  260.  
  261.     и пусть класс AbstractCondition<V> имплементирует как Condition<V>, так и DescribesResult
  262.  
  263.     первая мелочь - можно описания абстрактных методов отсюда убрать
  264.     (они же и так объявлены в интерфейсе, а реализовывать мы будем в кондишенах уже)
  265.  
  266.     вторая приятная и важная вещь - соблюли лучше Single Responsibility Principle
  267.  
  268.     третья приятная вещь
  269.     конечно, при условии, если таки для переменных-кондишенов будем использовать типы интерфейсов
  270.     CollectionCondition & ElementCondition (выше описаннный вариант 1)
  271.     когда мы будем оперировать переменной
  272.         CollectionCondition condition
  273.         или
  274.         ElementCondition condition
  275.  
  276.     то для такой переменной - мы не сможем вызвать методы  expected() /   actual()
  277.     т е - там, где это было нужно - у нас эта функциональность была видна
  278.     а там, где это не нужно - этого вообще не видно
  279.  
  280.     аналогично - для LazyEntity
  281.     можно для порядку вынести объявление метода identity
  282.     в интерфейс DescribesEntity
  283.     и от него отнаследовать LazyEntity
  284. */
Advertisement
Add Comment
Please, Sign In to add comment