julia_v_iluhina

Untitled

Dec 2nd, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.28 KB | None | 0 0
  1.     @Override
  2.     public boolean is(Condition<WebElement> condition) {
  3.         try {
  4.             return condition.check(getWrappedEntity());
  5.         } catch (NullPointerException ex) {
  6.             throw new ElementNotFoundException(this.toString());
  7.         }
  8.     }
  9. /*
  10.     не, Null Pointer Exception - ловить не стоит)
  11.     это bad practice
  12.     да нам это и не нужно - см ниже
  13.  
  14.     https://www.quora.com/Is-it-bad-practice-to-catch-null-pointer-exceptions-in-Java
  15.     http://stackoverflow.com/questions/4716353/if-catching-null-pointer-exception-is-not-a-good-practice-is-catching-exception
  16. */
  17. *****************************************
  18.     public <V> V until(Condition<V> condition, long timeout){
  19.         ...
  20.         do {
  21.             try {
  22.               ...
  23.             } catch (WebDriverException | IndexOutOfBoundsException ex) {
  24.                ...
  25. /*
  26.     в WaitFor#until - мы ловим лишь WebDriverException и нам этого достаточно
  27.     собственно - это же - WebDriverException - и в is нужно ловить
  28.  
  29.     IndexOutOfBoundsException - уже ловить не нужно
  30.     мы же словили это в LazyCollectionNthElement и вместо этого бросили свой эксепшен-потомок WebDriverException
  31.  
  32.     так что - ловим только WebDriverException
  33.     и тут, и в is
  34.  
  35.     если при использовании is - возникает NullPointerException - то надо искать источник
  36. */
  37. ***********************************************
  38. public abstract class AbstractLazyElement implements LazyElement {
  39. ...
  40.     @Override
  41.     public WebElement getWrappedEntity() {
  42.         ...
  43.             throw new ElementNotFoundException();
  44.         ...
  45. /*
  46.     не забывай - везде где бросаешь исключения
  47.     передавай в конструктор исключения строку - полезную информацию
  48.  
  49.     я писала - лучше this.toString() что-то сложно придумать
  50.  
  51.     не throw new ElementNotFoundException();
  52.     а throw new ElementNotFoundException(this.toString());
  53.  
  54.     тогда - при возникновении такого исключения
  55.     в сообщении об ошибке будет фигурировать и полезное сообщение
  56.  
  57.     тут - это описание нашего лейзи элемента
  58.  
  59. */
  60. ***************************************************
  61. public class LazyCollectionFoundByConditionElement extends AbstractLazyElement {
  62.  
  63.    ...
  64.  
  65.     @Override
  66.     public String toString() {
  67.         return parentCollection.getClass().getSimpleName() + " find(" + condition.getClass().getSimpleName() + ")";
  68.     }
  69. /*
  70.     вот для кондишена - и правда  - тут уместнее condition.getClass().getSimpleName()
  71.     почему это лучше в данном случае чем condition.toString() - посмотри на реализацию condition.toString() -
  72.     нам в данном случае это только усложнило бы выражение
  73.  
  74.     а вот для parentCollection - лучше использовать toString()
  75.     именно toString() для родительской коллекции - опишет нормально - как получена эта коллекция
  76.     а имя класса коллекции - никому особо не поможет
  77.  
  78.     чтоб увидеть - насколько полезно сообщение - моделируй ситуацию
  79.     для элемента/коллекции нужного вида - выполни проверку
  80.     которая заведомо должна упасть
  81.     и смотри на описание ошибки
  82.     и сам кондишен
  83.     и лейзи-сущность - для которой эта проверка вызывалась -
  84.     все это должно быть описано понятно и достаточно
  85.  
  86.     то же касается и LazyFilteredCollection
  87. */
  88. ************************************
  89. public class LazyWebDriverElement extends AbstractLazyElement {
  90.  
  91.  ....
  92.     @Override
  93.     public String toString() {
  94.         return "WebElement by locator " + locator;
  95.     }
  96. /*
  97.     я бы использовала только locator
  98.  
  99.     то же самое - посмотри на сообщение об ошибке
  100.  
  101.     и аналогично - LazyWebDriverCollection
  102. */
  103. **********************************
  104. public class CssClass extends ElementCondition{
  105.  
  106.     public Boolean actualState;
  107.     public String expectedClass;
  108.  
  109.  ....
  110.     @Override
  111.     public String expected() {
  112.         return "True";
  113.     }
  114.  
  115.     @Override
  116.     public String actual() {
  117.         return String.valueOf(actualState);
  118.     }
  119. }
  120. /*
  121.     тут в expected() - правильнее сообщить expectedClass
  122.     а в actual() - actual класс
  123.  
  124.     тут - бесполезно оперировать категориями да-нет
  125.     в данном случае - это скрывает важные детали
  126.  
  127.     категории да-нет - хороши там, где больше и нету подробностей
  128.     а тут они есть
  129. */
  130. **************************************************
  131. public abstract class ElementCondition extends AbstractCondition<WebElement> {
  132. }
  133. /*
  134.     мне кажется, я это писала
  135.     в общем-то - можно обойтись без этого класса
  136.  
  137.     т к сейчас - в реализации класса - кода нет
  138.     и класс используется только как предок для кондишенов
  139.  
  140.     в принципе - наследовать кондишены можно и от AbstractCondition<WebElement>
  141.     и тогда не потребуется класс ElementCondition
  142.  
  143.     CollectionCondition - аналогично
  144. */
  145. ***************************************
  146. public class NthElementText extends CollectionCondition
  147. /*
  148.     этот кондишен уже не нужен
  149.  
  150.     кондишена text - достаточно
  151.  
  152.     будем оперировать $$(...).get(...).shouldHave(text(...))
  153. */
  154. ****************************************
  155. public class Texts extends CollectionCondition {
  156. /*
  157.     а вот тут - еще бы и exactTexts не помешал бы )
  158.  
  159.     реализуй
  160.     можно отнаследоваться от Texts
  161. */
  162. *************************************************
  163. public abstract class Load<T, V> {
  164. /*
  165.     Вариант рабочий, и делает то, что нам нужно
  166.     но - сложный
  167.     и нарушает принцип Single Responsibility Principle
  168.  
  169.     у нас будет класс WithWaitFor (например)
  170.         в конструктор которого передадим
  171.             лейзи-элемент
  172.             кондишен
  173.     и у этого класса - будет метод run (например)
  174.         метод в качестве параметра - получит объект-команду
  175.         и вернет значение некого типа (тут нам пригодятся дженерики - т к нам нужны результаты разных типов,
  176.         заостряю внимание - это работаем с дженерик-типом  - на уровне метода run)
  177.  
  178.         именно в этом методе -
  179.             мы сначала пытаемся выполнить команду над вебэлементом
  180.             полученным без жлущей проверки
  181.  
  182.             и если возникнут проблемы - сначала выполним ждущую проверку
  183.             и затем - выполним команду
  184.  
  185.     что до объекта-команды
  186.          это как раз то, что мы будем реализовывать как объекты анонимного класса
  187.          все эти объекты - будут имплементировать один интерфейс (например Command)
  188.  
  189.          а в интерфейсе - мы объявляем метод run (например)
  190.          в реализации которого
  191.             мы будем выполнять нужные действия
  192.             и возвращать нужное нам значение
  193.            
  194.             действия будут совершаться над вебэлементом
  195.             потому - вебЭлемент - будет параметром этого метода
  196.  
  197.          потому и на уровне этого интерфейса - мы будем оперировать дженерик-типом
  198.          чтобы задать - значение какого типа вернет метод run
  199.  
  200.          параметров методу run не нужно
  201.          благодаря тому - что мы воспользуемся объектами анонимного класса
  202.          (см прошлую информацию)
  203.  
  204.     приведу пример - что получим с внешней стороны
  205. */
  206.     public LazyElement setValue(final String text) {
  207.         new WithWaitFor(this, visible()).run(new Command<WebElement>() {
  208.             public WebElement run(WebElement element) {
  209.                 element.clear();
  210.                 element.sendKeys(text);
  211.                 return element;
  212.             }
  213.         });
  214.         return this;
  215.     }
  216. /*
  217.     заметь - когда нам безразлично - что возвращать - мы возвращаем WebElement - в методе WithWaitFor#run
  218.     (и в методе команды - тоже)
  219.    
  220.     что нам даст такой подход
  221.    
  222.     у нас логика команды и логика запускателя команды - будут реализованы в разных классах
  223.     каждый из которых - будет отвечать за свое
  224. */
Advertisement
Add Comment
Please, Sign In to add comment