julia_v_iluhina

Untitled

Nov 24th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.19 KB | None | 0 0
  1. http://joxi.ru/Rmzqpx8HW6wZnr
  2.  
  3. /*
  4.     чуть форматирование подправь)
  5. */
  6. *******************
  7. public class Texts extends CollectionCondition {
  8.  
  9.     protected List<String> expectedTexts = new ArrayList<>();
  10.     protected List<String> actualTexts = new ArrayList<>();
  11.  
  12.     public Texts(String... expectedTexts) {
  13.         for (String expectedText : expectedTexts) {
  14.             this.expectedTexts.add(expectedText);
  15.         }
  16.         /*
  17.             можно было сохранять переданные значения - в массиве
  18.             public String[] expectedTexts;
  19.             ....
  20.             this.expectedTexts = expectedTextss;
  21.  
  22.             а можно и со списком работать)
  23.             protected List<String> expectedTexts;
  24.             ...
  25.             this.expectedTexts = Arrays.asList(expectedTexts);
  26.  
  27.             кстати, при объявлении поля expectedTexts - можно его не инициализировать
  28.             ведь мы в конструкторе это делаем)
  29.         */
  30.     }
  31.  
  32.     @Override
  33.     public List<WebElement> check(List<WebElement> elements) {
  34.         for (WebElement webElement : elements) {
  35.             actualTexts.add(webElement.getText());
  36.         }
  37.         /*
  38.             это не единственный кондишен, где нам придется собирать список текстов
  39.             я бы реализовала где-то в Helpels - getTexts(List<WebElement> elements)
  40.         */
  41.         /*
  42.             сначала - сравниваем размеры
  43.             если не одинаковое количество ожидаемых текстов и элементов - уже кондишен не прошел
  44.         */
  45.         for (int i = 0; i < expectedTexts.size(); i++) {
  46.             if (!actualTexts.get(i).contains(expectedTexts.get(i))) return null;
  47.             /*
  48.                 и тут для if - согласно конвеншенс - нужны фигурные скобки
  49.  
  50.             */
  51.  
  52.         }
  53.         return elements;
  54.     }
  55.  
  56.     @Override
  57.     public String expected() {
  58.         return Arrays.toString(expectedTexts.toArray());
  59.     }
  60.  
  61.     @Override
  62.     public String actual() {
  63.         return Arrays.toString(actualTexts.toArray());
  64.     }
  65.     /*
  66.         у List<String> - уже все ок с toString()
  67.         это для массива нам нужно использовать Arrays.toString(...)
  68.  
  69.         когда у нас был - один массив, а второй - список
  70.         то список вот так выводить - через Arrays.toString(list.toArray()) - давало на то,
  71.         что и список, и массив - в одном формате выводится
  72.  
  73.         в варианте - когда оба списка у нас - можно просто toString() использовать
  74.         для обоих списков
  75.     */
  76. **************************************************
  77.     public interface LazyElement extends LazyEntity, WebElement {
  78.  
  79.         void click();
  80.         /*
  81.             click() - есть и у WebElement
  82.             нету смысла объявлять тут одноименный метод
  83.             технически это не запрещено, но чего-то дополнительного - не получим
  84.  
  85.             а вот такие - стоит добавить
  86.             doubleClick
  87.             hover
  88.             setValue
  89.  
  90.             pressTab()
  91.             pressEscape()
  92.  
  93.             эти все методы - можно реализовать вовращающими LazyElement
  94.             чтоб они все - поддерживали chainable вызовы
  95.         */
  96. *******************************************
  97. внесла правки согласно ревью. Не писала еще реализацию метов (нужно обязательно реализации всех методов писать?)
  98.  
  99.  
  100.     public void submit() {
  101.  
  102.     }
  103.  
  104.     @Override
  105.     public String getTagName() {
  106.         return null;
  107.     }
  108. ...
  109. /*
  110.     все верно, нам нужно реализовать все эти методы
  111.  
  112.     это методы - WebElement-а
  113.  
  114.     нам нужно дождаться - или наличия элемента в DOM, или видимости
  115.     зависит от того - что реализуем
  116.         например - видимости стоит ждать - при какой-то интерактивной работе, или при получении какой-то информации
  117.         которая нас интересует о видимом элементе (его координаты, текст и т п)
  118.         в остальых случаях - достаточно, чтоб элемент был в DOM
  119.     а после того, как дождались - надо у вебэлемента нашего - вызвать то же самое действие,
  120.     что мы реализуем теперь для лейзи элемента
  121.  
  122.     аналогия с тем - что уже ты реализовала - полная
  123.     просто нужно продолжить)
  124.  
  125.     ну еще по пути - почитать можно - что какой метод вебэлемента делает
  126. */
  127. ***************************************
  128. public class LazyWrappedWebElement extends AbstractLazyElement {
  129. /*
  130.     в каждом из таких лейзи-классов - реализуй toString()
  131.  
  132.     я бы сюда передала кроме вебэлемента - еще и родительскую лейзи-сущность
  133.     чтоб в toString() - рассказать - и откуда этот объект
  134.  
  135.     типа такого
  136.     "WebElement " + element + " from " + parentEntity;
  137. */
  138. ***************************************
  139. public class LazyCollectionNthElement extends AbstractLazyElement {
  140.  
  141.     ...
  142.  
  143.     public LazyCollectionNthElement(By locator, int index) {
  144.     ...
  145.     @Override
  146.     public WebElement getWrappedEntity() {
  147.         return getDriver().findElements(locator).get(index);
  148.     }
  149. /*
  150.     не ограничивай себя только вариантом - когда коллекцию получили по локатору
  151.     и затем элемент - по индексу
  152.  
  153.     можно побольше вариантов тут придумать)
  154.  
  155.     передавай родительскую коллекцию и индекс
  156.     родительская коллекция - уже умеет возвращать список вебэлементов
  157.     это не нужно и здесь повторять
  158.     достаточно вызвать для родительской коллекции - ее getWrappedEntity()
  159.     и уже у этого списка - вызывать get
  160. */
  161.     @Override
  162.     public String toString(){
  163.         return locator.toString() + " with index " + index;
  164.     }
  165.     /*
  166.         parentCollection.toString() + "[" + index + "]" ???
  167.         предлагаю чуть лаконичнее)
  168.  
  169.         то же самое)
  170.  
  171.     */
  172. *****************************
  173.     @Override
  174.     public LazyCollection shouldHave(Condition<List<WebElement>>... conditions) {
  175.         should(conditions);
  176.         return this;
  177.     }
  178. /*
  179.     можно проще - return should(conditions);
  180. */
  181. *********************************
  182.     @Override
  183.     public LazyElement get(int index) {
  184.  
  185.     @Override
  186.     public Iterator<LazyElement> iterator() {
  187. /*
  188.     с реализацией - все ок
  189.     только перенеси эти  методы  в абстрактный класс
  190.  
  191.     такая (или почти такая) реализация - будет для любой из коллекции
  192.     потому - эти методы можно уже в абстрактном классе реализовать
  193.  
  194.     насчет get - думаю, по комментариям выше - ты уже сориентировалась)
  195. */
  196. **********************************
  197. public abstract class CollectionCondition extends AbstractCondition<List<WebElement>> {
  198.  
  199.     @Override
  200.     public String identity() {
  201.         return "elements";
  202.     }
  203.  
  204. }
  205. ...
  206. public abstract class ElementCondition extends AbstractCondition<WebElement> {
  207.  
  208.     @Override
  209.     public String identity() {
  210.         return "element";
  211.     }
  212. }
  213. /*
  214.     если так подумать - то этот метод identity() - все же свойство лейзи-сущности
  215.  
  216.     стоит этот метод объявить на уровне интерфейса LazyEntity
  217.     реализовать в абстрактных классах
  218.     и в AbstractCondition - уже использовать метод лейзи-сущности
  219.     и в AbstractCondition метода identity() - уже не нужно объявлять
  220.  
  221.     тогда эти классы - CollectionCondition и ElementCondition
  222.  
  223.     а чтоб не смешивать в LazyEntity - такие разные методы
  224.     то лучше метод identity() - объявить в новом интерфейсе DescribesEntity
  225.  
  226.     и уже LazyEntity - наследовать от DescribesEntity
  227.  
  228.     все будет по полочкам)
  229.  
  230.     примерно также - можно сделать на уровне AbstractCondition
  231.     объявить методы
  232.      String expected();
  233.      String actual();
  234.  
  235.     в новом интерфейсе  - DescribesResult
  236.     от его наследовать - Condition
  237.  
  238.     и уже в  AbstractCondition - не понадобится объявлений абстрактных методов
  239.  
  240.     для потомков ничего не изменится
  241.     но зато разложим разный функционал по разным интерфейсам
  242.     так четче обозначим разные по назначению наборы методов
  243.  
  244. */
Advertisement
Add Comment
Please, Sign In to add comment