julia_v_iluhina

Untitled

Oct 4th, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.27 KB | None | 0 0
  1. public abstract class CollectionCondition extends AbstractCondition<List<WebElement>> {
  2.  
  3.     // если здесь не имплементировать, просится во вме кондишены сразу)))
  4.     @Override
  5.     public String identity() {
  6.  ...
  7.  
  8. /*
  9.     )))
  10.     отлично написано
  11. */
  12.  
  13. public abstract class AbstractCondition<V> implements Condition<V> {
  14.  
  15. ...
  16.     public abstract String identity();
  17. /*
  18.     вот тут - убираем метод
  19. */
  20.  public String toString() {
  21.         return this.getClass().getSimpleName() + " for " + entity.identity() + " found by: " + entity + "\n expected: " + expected() + "\n actual: " + actual();
  22.  }
  23.  /*
  24.     вот тут - уже ок - ты вызываешь entity.identity()
  25.  */
  26.  
  27. public interface LazyEntity <T> {
  28.  
  29.     public T getWrappedEntity();
  30.  
  31.     public String identity();
  32. }
  33. /*
  34.     это ок
  35. */
  36. public abstract class AbstractLazyElement implements LazyElement {
  37. ...
  38.     public String identity() {
  39.         return "element";
  40.     }
  41.     /*
  42.         это ок)
  43.     */
  44. public abstract class AbstractLazyCollection implements LazyCollection {
  45. ...
  46.     public String identity() {
  47.         return "collection";
  48.     }
  49.     /*
  50.         это ок
  51.     */
  52. /*
  53.     то есть все, что мешало - это объявленный абстрактный метод в AbstractCondition
  54.     в AbstractCondition уберешь - и в потомках AbstractCondition сможешь убрать)
  55. */
  56. *********************************************************************************************************
  57. public abstract class AbstractLazyElement implements LazyElement {
  58.  
  59. ...
  60.     public LazyElement click() {
  61.         waitFor(this).until(visible());
  62.         actions().click(getWrappedEntity()).perform();
  63.         return this;
  64.     }
  65. /*
  66.     у вебэлемента есть метод click
  67.     вместо actions().click(getWrappedEntity()).perform();
  68.     вызывай getWrappedEntity().click()
  69.  
  70.     doubleClick() & hover() - да, надо реализовывать через actions()
  71.     тут - можно проще
  72. */
  73. **************************************
  74.     public LazyElement pressEnter() {
  75.         waitFor(this).until(visible());
  76.         getWrappedEntity().sendKeys(Keys.ENTER);
  77.         return this;
  78.     }
  79. /*
  80.     можно переиспользовать LazyElement sendKeys(CharSequence... text)
  81. */
  82. ************************************************
  83. /*
  84.  
  85.     следующий наворот )
  86.  
  87.  
  88.     WebElement - это тоже интерфейс
  89.  
  90.     Если мы отнаследуем наш интерфейс LazyElement от WebElement
  91.     Это то же самое что и заявить - "наш LazyElement - полная замена WebElement - и везде где вы его использовали
  92.     вы теперь можете использовать наш лейзи враппер
  93.     который помимо всех фич вебэлемента еще и будет ждать себя..."
  94.  
  95.     конечно, можно было бы абстрактный класс реализовать имплементирующим два интерфейса
  96.     Класс может быть реализован от нескольких интерфейсов
  97.  
  98.     но тогда, при использовании переменной типа LazyElement - мы не получим функциональности WebElement
  99.  
  100.     потому тут правильнее именно отнаследовать LazyElement от WebElement
  101.  
  102.     Это в java-ООП мире достаточно прикольная практика -
  103.     всегда, когда ты хочешь сделать какие-то штуки внутри объекта публичными -
  104.     выносить их сначала в отдельный интерфейс - и потом его имплементировать
  105.  
  106.     потому что просто сделать какие-то штуки публичными - это недостаточно "строго"
  107.  
  108.     если ты четко заявляешь - мой объект поддерживает такие-то интерфейсы, тогда
  109.     все могут общаться с твоим объектом через четко прописанное API этого интерфейса
  110.  
  111.     тут надо внимательно к вопросу подойти)
  112.  
  113.     в рамках LazyElement - не реализовывай методов, одноименных с методами WebElement
  114.     просмотри в WebElement - какие методы объявлены
  115.     и одноименных в LazyElement - не добавляй
  116.  
  117.     да, мы для некоторых методов потерям chainable возможности - изменится возвращаемый тип
  118.  
  119.     но зато не будет двусмысленностей
  120.  
  121.     в абстрактном классе AbstractLazyElement - реализуй все вебэлементовские методы
  122.     думаю, проблем с этим не будет
  123.     примеры уже есть
  124.  
  125.     думай - в каких методах и чего надо ждать - ничего не ждать / ждать видимости / ждать наличия в DOM
  126.  
  127. */
  128. *******************************************
  129. /*
  130.     следующий наворот )
  131.  
  132.     наворачиваем Collection )
  133.  
  134.         наследуем этот интерфейс и от Iterable<LazyElement>
  135.  
  136.         цель - уметь писать такой код
  137.  
  138.         elements = $$(...);
  139.         for(LazyElement element:elements) {
  140.             ...
  141.         }
  142.  
  143.         т е уметь обходить нашу коллекцию элементов в таком варианте цикла
  144.  
  145.         чистая теория
  146.         http://tutorials.jenkov.com/java-generics/implementing-iterable.html
  147.  
  148.         нам она практически не пригодится )
  149.         просто для понимания - разумно ознакомиться
  150.  
  151.         достаточно понять, что
  152.         при имплементировании интерфейса Iterable<...>
  153.         надо будет реализовать метод
  154.          public Iterator<ProxyElement> iterator()
  155.  
  156.         Дальше мы схитрим)
  157.  
  158.         List<...> тоже наследник Iterable<...>
  159.  
  160.         если мы внутри метода iterator()
  161.             создадим и заполним список list типа List<LazyElement> элементами из коллекции
  162.  
  163.             то тогда можно вернуть в качестве результата метода iterator() - list.iterator();
  164.  
  165.         загвоздка в том, что в коллекции  getWrappedEntity()  возвращает значение типа List<WebElement>
  166.         а мы хотим получить List<LazyElement>
  167.  
  168.         Вот и пришло время создать еще одного потомка для AbstractLazyElement
  169.           назовем его LazyWrappedWebElement (обернутый веб элемент)
  170.           будем передавать ему в конструктор вебЭлемент
  171.           как ты понимаешь, его реазизация getWrappedEntity() - будет возвращать тот же веб элемент
  172.  
  173.         И теперь опять возвращаемся к методу iterator()
  174.         Если в новый список List<LazyElement>
  175.         Ты будешь складывать новосозданные объекты типа LazyWrappedWebElement
  176.         То это будет ОК (т к LazyWrappedWebElement - потомок абстрактного класса который имплементирует интерфейс LazyElement)
  177.  
  178.         Проверяем новую функциональность на коде типа
  179.  
  180.             for (LazyElement element:tasks) {
  181.                 System.out.println(element.getText());
  182.                 element.shouldHave(text("а"));
  183.             }
  184.  
  185. */
Advertisement
Add Comment
Please, Sign In to add comment