julia_v_iluhina

Untitled

Sep 23rd, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.31 KB | None | 0 0
  1.     @Override
  2.     public LazyElement pressEnter() {
  3.         waitFor(this).until(visible());
  4.         this.sendKeys(Keys.ENTER);
  5.         return this;
  6.     }
  7.  
  8.     @Override
  9.     public LazyElement pressEscape() {
  10.         waitFor(this).until(visible());
  11.         // getWrappedEntity().sendKeys(Keys.ESCAPE);
  12.         this.sendKeys(Keys.ESCAPE);
  13.         return this;
  14.     }
  15. /*
  16.     внутри this.sendKeys - уже есть ожидание видимости
  17.     тут - не надо еще раз делать waitFor(this).until(visible());
  18. */
  19. ***************************************
  20.  
  21. public Iterator<LazyElement> iterator()
  22. /*
  23.     этому методу тоже аннотацию @Override поставь - реализуем же метод интерфейса Iterable
  24. */
  25. ******************************************
  26.     @Override
  27.     public LazyElement findElement(int index, String locator) {
  28.         return new LazyCollectionFindElement(this, locator, index);
  29.     }
  30. /*
  31.     Таки усложнила )
  32.  
  33.     Давай разбираться
  34.     была цель - сделать вот такой find
  35.     $$(...).get(...).find(innerLocator)
  36.  
  37.     у какой сущности вызываем find - у $$(...).get(...)
  38.     а это - элемент (не коллекция)
  39.  
  40.     поэтому
  41.     в LazyElement - объявляй методы
  42.         LazyElement find(By innerLocator)
  43.         LazyElement find(String innerCssSelector)
  44.  
  45.         можно и методы - $ - с такой же сигнатурой
  46.         это по желанию - если кажется удобным использовать $
  47.  
  48.     и в AbstractLazyElement - реализуй их
  49.         сначала find(By innerLocator)
  50.         а в find(String innerCssSelector) (или $) - просто его переиспользуешь
  51.  
  52.     релизуй - аналогично тому - как делала для get
  53.  
  54. */
  55. ******************************
  56. public abstract class AbstractLazyCollection implements LazyCollection {
  57.  
  58.     @Override
  59.     public LazyElement findElement(int index, String locator) {
  60.         return new LazyCollectionFindElement(this, locator, index);
  61.     }
  62.  
  63.     @Override
  64.     public LazyElement $(int index, By innerLocator) {
  65.         return new LazyCollectionFindElement$ByLocator(this, innerLocator, index);
  66.     }
  67.  
  68.     @Override
  69.     public LazyElement $(String innerCssSelector, int index) {
  70.         return new LazyCollectionFindElement$BySelector(this, innerCssSelector, index);
  71.     }
  72. /*
  73.     вот это - учти на будущее
  74.  
  75.     понятно - что этот код уйдет весь
  76.     но - рассмотрим ошибку - чтоб дальше такую не повторять
  77.  
  78.     по сути - все эти методы делают одно и то же
  79.     у коллекции берут элемент по индексу, и у элемента - ищут внутренний элемент
  80.  
  81.     самый общий универсальный вариант  - это $(int index, By innerLocator)
  82.     из-за второго параметра - By innerLocator
  83.     тип By - позволит искать и по селектору, и по локатору, и по тексту и по ...
  84.     много вариантов
  85.  
  86.     вот его реализуем первым
  87.     и да - для этого реализуем класс лейзи-элементов специальный
  88.  
  89.  
  90.     далее - реализуем остальные методы
  91.     и тут - уже никакой развесистой клюквы не надо
  92.     т к - есть уже  $(int index, By innerLocator)
  93.     и мы его можем переиспользовать
  94.     вызвать - $(index, By.cssSelector(innerCssSelector))
  95.  
  96.     это тоже - DRY
  97.  
  98.     первое - что должно тебя насторожить - что пришлось реализовать несколько одинаковых по функциональности классов
  99.     это значит - что на предыдущем шаге - ты что-то не учла
  100.  
  101.     и еще
  102.      порядок параметров в методах-синонимах - должен быть аналогичным
  103.      да и надо взвешивать - сколько таких методов-синонимов нужно
  104.      я бы лишнего не делала
  105.  
  106.     и по поводу findElement(int index, String locator)
  107.     я бы не использовала имен, которые совпадают с именами методов от WebElement или
  108.     еще каких-то нами используемых интерфейсов
  109.     тут, оно, конечно, технически не мешает - мы в коллекции интерфейс WebElement не имплементируем
  110.     а все равно - на первый взгляд - путает
  111.  
  112.     и по поводу употребления слова locator
  113.     тут тоже лучше быть последовательным
  114.     мы употребляли locator - для параметров типа By
  115.     а для цсс селекторов - употребляли  CssSelector
  116.     не стоит путать смыслы
  117.     одно понятие = один термин
  118.  
  119. */
  120. ***************************************
  121.  
  122. public abstract class AbstractLazyElement implements LazyElement {
  123.  
  124.  
  125.     @Override
  126.     public WebElement $(By innerLocator) {
  127.         //     waitFor(this).until(visible());
  128. //        return new LazyWrappedWebElement(getWrappedEntity()).$(innerLocator);
  129.         return findElement(innerLocator);
  130.     }
  131.  
  132.     @Override
  133.     public WebElement $(String innerCssSelector) {
  134.         //     waitFor(this).until(visible());
  135.         //return new LazyWrappedWebElement(getWrappedEntity()).$(byCss(innerCssSelector));
  136.         return findElement(By.cssSelector(innerCssSelector));
  137.     }
  138.  
  139. /*
  140.     как раз тут надо было реализовать эти методы
  141.  
  142.     зачем нам синонимы для вебэлементовского findElement?
  143.  
  144.     нет)
  145.     у нас  - другая цель
  146.     у нас цель - чтобы
  147.     элементы
  148.         $(...).$(...)
  149.         $$(....).get(...).$(...)
  150.     были лейзи-элементами
  151.  
  152.     у такого лейзи-элемента будет
  153.          родительский лейзи-элемент
  154.             (в первом примере - это $(...)
  155.             во втором - это $$(....).get(...)
  156.  
  157.             в любом случае - LazyElement
  158.  
  159.             и это будет - одна реализация, а не 2
  160.  
  161.             нам не надо отдельного класса для $(...).$(...)
  162.             и для $$(....).get(...).$(...)
  163.  
  164.             т к обе эти ситуации = получить у лейзи-элемента(не важно, какого именно)
  165.             его внутренний элемент
  166.             )
  167.  
  168.          By локатор для внутреннего элемента
  169. */
  170.  
  171.     public WebElement getWrappedEntity() {
  172.         return new LazyWrappedWebElement(parentCollection.getWrappedEntity().get(index)).$(innerLocator);
  173.     }
  174. /*
  175.     применять в getWrappedEntity() - LazyWrappedWebElement - однозначный перебор
  176.  
  177.     parentCollection.getWrappedEntity() = List<WebElement>
  178.     parentCollection.getWrappedEntity().get(index) = WebElement
  179.     parentCollection.getWrappedEntity().get(index).findElement(innerLocator) = WebElement
  180.  
  181.     у WebElement - есть метод findElement
  182.     вспомни
  183.  
  184.     тут, внутри getWrappedEntity() - уже оперируем getWrappedEntity() родительских сущностей и уточняем
  185.     не надо тут использовать ничего из лейзи-сущностей
  186.  
  187.     тут наоборот задача - получить список вебэлементов или вебэлемент = вернуть то, что оборачивали
  188.  
  189.     для этого не надо еще оборачивать)
  190.  
  191.     наоборот - разворачиваем))))
  192. */
Advertisement
Add Comment
Please, Sign In to add comment