julia_v_iluhina

Untitled

Sep 20th, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.63 KB | None | 0 0
  1. public class WaitFor {
  2.     ...
  3.     private By locator;
  4. /*
  5.     тут - уже не нужен локатор
  6.  
  7.     как и комментарии)
  8.  
  9.     предлагаю почистить и реформатировать
  10.  
  11.     а также - метод sleep
  12.     сместить вниз  - чтобы от гравного не отвлекаться
  13. */
  14. *********************
  15. public static WebElement setValue(WebElement element, String text) {
  16. public static void doubleClick(WebElement element) {
  17. public static void hover(WebElement element) {
  18. /*
  19.     нам такие методы в ConciseAPI не нужны
  20.  
  21.     они будут полезны - как методы для LazyElement
  22. */
  23. **************************************
  24. T t = (T) condition.apply(entity);
  25. /*
  26.     такого плана имена переменных мы уже обсуждали)
  27.  
  28.     лучше однобуквенные имена используй  - исключительно для числовых счетчиков в цикле
  29.  
  30.     остальное - требует осмысленных имен
  31. */
  32. ********************
  33. src / main / java / ui / net / itlabs / core / LazyEntity.java
  34.  
  35. перемести интерфейс в пекедж src / main / java / ui / net / itlabs / core / entities /
  36. к своим ближайшим родственникам)
  37. *****************************
  38. public class Present extends ElementCondition {
  39.     Boolean isPresent = false;
  40.  
  41.  ...
  42.     @Override
  43.     protected boolean check(WebElement element) {
  44.         if (element != null) {
  45.             isPresent = true;
  46.         }
  47.     /*
  48.         тут тоже все проше
  49.         isPresent = (element != null);
  50.     */
  51. ******************************
  52.  
  53.     public LazyElement shouldBe(Condition<WebElement>... conditions) {
  54.         return should();
  55.     }
  56.  
  57.     public LazyElement shouldHave(Condition<WebElement>... conditions) {
  58.         return should();
  59.     }
  60.     .................
  61.  
  62.     public LazyCollection shouldBe(Condition<List<WebElement>>... conditions)  {
  63.         return should();
  64.     }
  65.  
  66.     public LazyCollection shouldHave(Condition<List<WebElement>>... conditions)  {
  67.         return should();
  68.     }
  69. /*
  70.     а параметры передать при вызове should(????)
  71.  
  72.     касается и LazyCollection и LazyElement
  73. */
  74. ****************************************
  75. public class LazyElement implements LazyEntity<WebElement> {
  76.  
  77.    ...
  78.     private WebElement element;
  79. /*
  80.     это поле уже не используется
  81.     убивай
  82. */
  83. ***********************************************************************
  84.  
  85. Классов lazy - семейства - у нас будет несколько
  86.  
  87. давай уточним - названия наших элемента и коллекции
  88. оба эти класса - оперируют элементами, которые возвращает вебдрайвер
  89.  
  90. getDriver.findElement(...) / getDriver().findElements(...)
  91.  
  92. это и отразим в имени классов
  93. LazyWebDriverElement
  94. LazyWebDriverCollection
  95.  
  96.  
  97. *************************************************************************
  98. /*
  99.  
  100.     следующий наворот )
  101.  
  102.     Это в java-ООП мире достаточно прикольная практика -
  103.         всегда, когда ты хочешь сделать какие-то штуки внутри объекта публичными -
  104.         выносить их сначала в отдельный интерфейс - и потом его имплементировать
  105.  
  106.         потому что просто сделать какие-то штуки публичными - это недостаточно "строго"
  107.  
  108.         если ты четко заявляешь - мой объект поддерживает такие-то интерфейсы, тогда
  109.         все могут общаться с твоим объектом через четко прописанное API этого интерфейса
  110.  
  111.     реализуй интерфейсы
  112.      LazyCollection отнаследовав от LazyEntity<List<WebElement>>
  113.      LazyElement отнаследовав от LazyEntity<WebElement>
  114.  
  115.     в этих интерфейсах - объяви те public-методы
  116.     которые уже реализованы в классах LazyWebDriverElement и LazyWebDriverCollection
  117.  
  118.     теперь - ты можешь в классах LazyWebDriverElement и LazyWebDriverCollection
  119.     имплементировать интерфейсы LazyElement и  LazyCollection
  120.  
  121.     но - и это еще не все)
  122.  
  123.     как я и говорила - у нас будут разные лейзи-элементы и разные лейзи-коллекции
  124.     например
  125.             lazyElement.find(".destroy")
  126.             lazyCollection.find(cssClass("edited"))
  127.             lazyCollection.get(3)
  128.         т е - в итоге - у нас будет несколько классов, имплементирующих interface LazyElement
  129.         причем - отличаться у них будут лишь конструкторы и  реазицация getWrappedEntity
  130.         а реализация остальных методов, да и вообще набор методов - один-в-один
  131.  
  132.     И во всех этих случаях - нам нужно, чтобы у лейзи-элементов - были методы should, click ...
  133.     т е - все - что мы уже реализовали в LazyWebDriverElement
  134.     (почти все - все же реализация конструктора, getWrappedEntity, toString - будет у разных классов своей)
  135.  
  136.     Вот мы для лейзи-элементов - реализуем абстрактного предка AbstractLazyElement
  137.     в этом классе будут реализованы почти все методы, что мы реализовали ранее в LazyWebDriverElement
  138.     все - что будет общим для всех лейзи-элементов
  139.  
  140.     И уже от AbstractLazyElement будем наследовать наш LazyWebDriverElement
  141.     в котором и реализуем только то, что его отличает от его абстрактного предка -
  142.     конструктор, getWrappedEntity, toString
  143.  
  144.     Аналогично - поработай и с лейзи коллекцией
  145.     Организуй и тут абстрактного предка
  146.     и вынеси в него все общее
  147.  
  148.     а в LazyWebDriverCollection - останется лишь то, что отличает его от абстрактного предка -
  149.     конструктор, getWrappedEntity, toString
  150.  
  151. */
  152. ****************************************
  153.  
  154. /*
  155.  
  156.     вот и получим такую иерархию
  157.  
  158.      самый общий интерфейс
  159.      LazyEntity<T>
  160.  
  161.         его потомки - интерфейсы
  162.             LazyElement
  163.             LazyCollection
  164.  
  165.             абстрактные классы
  166.                 AbstractLazyElement
  167.                 AbstractLazyCollection
  168.                 (реализуем все методы, кроме абстрактного getWrappedEntity,
  169.                  также конструктор нам тут не нужен - т к класс абстрактный,
  170.                  и toString - реализовівать будем в потомках)
  171.  
  172.                     набор классов - для элементов и коллекций
  173.                         наши уже разработанные варианты
  174.                             LazyWebDriverElement
  175.                             LazyWebDriverCollection
  176.  
  177.                         список будет пополняться)
  178.  
  179.      получишь что-то такое http://joxi.ru/GrqLOX3SNZPLoA
  180.      пока закрасила те классы - которые еще у нас не появилимь)
  181.      ну и разумно - это в рамках core - выделить в отдельный пекедж
  182.      wrappers (или entities) - хорошее общее название
  183.      т к вот эти наши классы - это лишь обертка вокруг вебэлемента/списка вебэлементов
  184.  
  185.      есть конвеншенсы и по этому поводу - какие имена давать интерфейсу, какие - абстракному предку,
  186.      какие - классам-потомкам
  187.  
  188.      статья про это (лучший вариант)
  189.         http://www.vertigrated.com/blog/2011/02/interface-and-class-naming-anti-patterns-java-naming-convention-tautologies/
  190.      еще полезные линки
  191.          http://stackoverflow.com/questions/2814805/java-interfaces-implementation-naming-convention
  192.          https://web.archive.org/web/20130331071928/http://isagoksu.com/2009/development/java/naming-the-java-implementation-classes
  193.          http://programmers.stackexchange.com/questions/152759/should-i-add-an-abstract-prefix-to-my-abstract-classes
  194.  
  195.      Interfaces, abstract classes - good practice
  196.          http://stackoverflow.com/questions/1932247/abstract-classes-and-interfaces-best-practices-in-java
  197.          http://joxi.ru/E2pdR1lFB1pyM2
  198. */
  199. ************************************************************
  200.  
  201. /*
  202.     теперь - поправь методы $ & $$
  203.     внутри метода - создаем объект конкретного типа (LazyWebDriverElement / LazyWebDriverCollection)
  204.     и его вовзращаем
  205.    
  206.     а тип возвращаемого резултьтата - это соотвествующий интерфейс (LazyElement / LazyCollection)
  207.    
  208.     просмотри код - вне наших лейзи-сущностей - мы оперируем интерфейсами
  209.     Мы не заводим переменную типа LazyWebDriverElement
  210.     а используем тип LazyElement
  211.    
  212.    
  213.     в пейджах, например просмотри)
  214.    
  215. */
  216. *******************************************************
  217. /*
  218.     И еще один наворот
  219.    
  220.     WebElement - это тоже интерфейс
  221.  
  222.     мы можем создать интерфейс, который является наследником нескольких интерфейсов
  223.  
  224.     Если мы отнаследуем наш интерфейс LazyElement от WebElement
  225.     (в том числе, наследование от LazyEntity - никуда не убираем)
  226.     то - это то же самое что и заявить -
  227.     "наш LazyElement - полная замена WebElement - и везде где вы его использовали
  228.     вы теперь можете использовать наш лейзи враппер
  229.     который помимо всех фич вебэлемента еще и будет ждать себя..."
  230.  
  231.     конечно, можно было бы абстрактный класс реализовать имплементирующим два интерфейса
  232.     Класс может быть реализован с имплементацией нескольких интерфейсов
  233.  
  234.     но тогда, при использовании переменной типа LazyElement - мы не получим функциональности WebElement
  235.  
  236.     потому тут правильнее именно отнаследовать LazyElement от WebElement
  237.  
  238.     тут надо внимательно к вопросу подойти)
  239.  
  240.     в рамках интерфейса LazyElement - не объявляй методов, одноименных с методами интерфейса WebElement
  241.     так, останется в LazyElement - совсем немного методов
  242.  
  243.     да, мы для некоторых методов потерям chainable возможности
  244.  
  245.     но зато не будет двусмысленностей
  246.  
  247.     в абстрактном классе AbstractLazyElement - реализуй все вебэлементовские методы
  248.     думаю, проблем с этим не будет
  249.  
  250.     думай - в каких методах и чего надо ждать - ничего не ждать / ждать видимости / ждать наличия в DOM
  251.  
  252. */
Advertisement
Add Comment
Please, Sign In to add comment