julia_v_iluhina

Untitled

Sep 27th, 2016
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.47 KB | None | 0 0
  1. public class LazyCollectionFiltered extends AbstractLazyCollection {
  2. /*
  3.     см прошлое ревью
  4.     строки 3-20
  5. */
  6. **********************
  7. public class LazyCollectionFiltered extends AbstractLazyCollection {
  8.  
  9.     private LazyCollection parentCollection;
  10.     private Condition<WebElement> condition;
  11.  
  12. ...
  13.     @Override
  14.     public String toString() {
  15.         return parentCollection.toString() ;
  16.     }
  17. /*
  18.     у нас есть - родительская коллекция + операция = фильтрация + как фильтруем = такой-то кондишен
  19.     это все должно быть отражено в toString()
  20.  
  21.         return parentCollection.toString() + " filter(" + condition.getClass().getSimpleName() + ")";
  22.  
  23.     а почему я не советовала использовать condition.toString() - ты мне расскажи)
  24.  
  25.     аналогично - и для LazyCollectionFoundByConditionElement поправь
  26. */
  27. ******************************************
  28. public class Enabled extends ElementCondition {
  29.  
  30.  ...
  31.     @Override
  32.     protected boolean check(WebElement element) {
  33.         isEnabled = element.isDisplayed();
  34. /*
  35.     см прошлое ревью
  36.     строки 124-127
  37. */
  38. ********************************************
  39. tasks.filter(visible()).shouldHave(exactTexts(taskTexts));
  40. /*
  41.     раз мы уже так умеем - то как считаешь - нужны нам такие кондишены?
  42.         ExactTextsOfVisible
  43.         SizeOfVisible
  44. */
  45. *********************************
  46. public class CssClass extends ElementCondition {
  47.     ...
  48.     @Override
  49.     protected boolean check(WebElement element) {
  50.         actualClass = element.getAttribute("class");
  51.         String[] classes = actualClass.split(" ");
  52.         return classes.equals(expectedClass);
  53.     /*
  54.         читаем код
  55.  
  56.         мы сравниваем массив строк со строкой
  57.  
  58.         как думаешь - что в результате такого сравнения получим?
  59.         вспомни - как похожий кондишен реализовывали раньше
  60.     */
  61. ***************************************
  62.     public class Configuration {
  63.         //default interval for WaitFor.Until - smart waiting check one condition, in milliseconds
  64.         public static int timeout = 4000;
  65.     /*
  66.         замечаем - таймаут храним в миллисекундах
  67.     */
  68.  
  69.    public <T> T until(Condition<T> condition, long timeOutInSeconds) {
  70.    ...
  71.         while (System.currentTimeMillis() - startTime < timeOutInSeconds * 1000);
  72.     /*
  73.         тут - оперируем таймаутом в секундах
  74.     */
  75.  
  76.     public <T> T until(Condition<T>... conditions) {
  77.         ...
  78.                 result = until(condition, Configuration.timeout);
  79.     /*
  80.         но - не смотря на это - передаем в метод миллисекунды ...
  81.  
  82.         как думаешь - что в итоге получим?
  83.  
  84.         советую везде оперировать таймаутом в одной размерности
  85.         чтоб не приходилось нигде переводить одно в другое
  86.         так - уменьшишь вероятность проблем из-за неверного пересчета
  87.  
  88.         ты в слеке писала - про зависание
  89.         это не оно
  90.         это ожидание выполнения кондишена в 4000 * 1000 миллисекунд)
  91.  
  92.         осваивай отладку)
  93.         очень полезный навык
  94.         вот видео
  95.         https://drive.google.com/file/d/0B2UFaKOpHq_MUEtTUDFoZzdTbTg/view?usp=sharing
  96.         это такой... еще черновик
  97.         но там - все верно показано, и все вот такие штуки - учись применять
  98.         наверняка про это можно кучу других материалов найти...
  99.         минимально - будет достаточно освоить показанное
  100.     */
  101. ****************************************
  102.         @Override
  103.         public WebElement getWrappedEntity() {
  104.             ...
  105.                 throw new ElementNotFoundException();
  106.                 /*
  107.                     можно что-то и написать в качестве сообщения об ошибке)
  108.                     например - передав в конструктор ElementNotFoundException как параметр -
  109.                     тот же toString() самого лейзи элемента
  110.                 */
  111. ***********************************************
  112. http://joxi.ru/p275M9zs0eZagr
  113.  
  114. /*
  115.     давай разберем - что за NPE еще есть
  116.  
  117.     1-кликни на упавшем тесте
  118.     2-кликни в стектрейсе на Visible
  119.     3-увидишь на какой строке тест упал
  120.  
  121.     если тут возникло NPE - значит именно isDisplayed - в этот момент равен null
  122.     можно его инициализировать значением false - еще при объявлении(4)
  123.  
  124.     после такого исправления - ошибок станет значительно меньше
  125.     но они останутся...
  126.     ниже  - разбор
  127. */
  128. ****************************************
  129. /*
  130.     на самом деле - разобраться - почему возникают ошибки при работе некоторых тестов - не так просто...
  131.  
  132.     дело еще усложняется тем - что не проходят наши ждущие проверки
  133.     а это значит - что если мы будем в отладке разбираться - что не работает/ или что не так работает
  134.  
  135.     мы искусственнно добавим ожиданий
  136.  
  137.     и код наших ждущих проверок под отладкой - будет работать не так
  138.     как он работает в режиме обычного запуска
  139.     потому - будем встраивать отладочные сообщения
  140.         в метод iterator() для коллекции  - перед циклом
  141.         System.out.println("Building iterator..."+toString());
  142.  
  143.         в метод fetchWrappedEntity() класса LazyCollectionFoundByConditionElement
  144.         перед циклом System.out.println(toString()+"get wrapped entity");
  145.         внутри цикла System.out.println("   check "+condition.getClass().getSimpleName()+ " for element..."+element.getWrappedEntity().getText());
  146.  
  147.  
  148.     разберем на примере теста testEditAtActive()
  149.  
  150.     получим такие сообщения
  151. */
  152.  
  153. By.cssSelector: #todo-list>li find(ExactText)get wrapped entity
  154. Building iterator...By.cssSelector: #todo-list>li
  155.    check ExactText for element...a
  156. By.cssSelector: #todo-list>li find(ExactText)get wrapped entity
  157. Building iterator...By.cssSelector: #todo-list>li
  158.    check ExactText for element...a
  159. By.cssSelector: #todo-list>li find(ExactText)get wrapped entity
  160. Building iterator...By.cssSelector: #todo-list>li
  161.    check ExactText for element...a
  162. ...
  163.  
  164. /*
  165.     т е далее вызова apply - для первого элемента - дело не идет...
  166.     как думаешь - почему?
  167.  
  168.     давай посмотрим на реализацию apply
  169.  
  170.     если проверка не проходит - мы бросаем исключение WebDriverAssertException
  171.     вот и причина - почему мы дальше первого элементика - не продвигаемся в поисках
  172.  
  173.     кстати - тогда бессмысленно проверять результат apply - на равенство null ...
  174.  
  175.     какие наши варианты
  176.       в методе fetchWrappedEntity() класса LazyCollectionFoundByConditionElement -
  177.       можно обернуть вызов apply - в try-catch секцию
  178.       и ловить это исключение
  179.       так себе метод - здорово утяжелит код
  180.  
  181.       в принципе - что делает apply
  182.       вызывает для полученного вебэлемента - метод check
  183.  
  184.       пока он нам не доступен... - мы не можем вызвать метод check кондишена
  185.       т к у интерфейса кондишена такой метод не объявлен.
  186.  
  187.       поступим пока не красиво - объявим на уровне интерфейса Condition - метод check
  188.       тогда для метода check - придется поправить во всех реализованных кондишенах - модификатор доступа -
  189.       protected на public
  190.  
  191.       про красоту  - чуть позже побеспокоимся )
  192.       сейчас про функциональность
  193.  
  194.       раз у нас будет метод check объявлен на уровне интерфейса - значит мы сможем его использовать
  195.       в варианте condition.check(...)
  196.  
  197.       только заметь - в качестве параметра для check - надо уже не лейзи-сущность передавать
  198.       а то, что возвращает getWrappedEntity....
  199.  
  200.       получим - нормальную картинку - тест проходит
  201.       отдалочные сообщения - показывают - что мы продвигаемся по списку -
  202.       а не вылетаем из цикла на первой же итерации, на которой условие не выполнилось
  203. */
  204. By.cssSelector: #todo-list>li find(ExactText)get wrapped entity
  205. Building iterator...By.cssSelector: #todo-list>li
  206.    check ExactText for element...a
  207.    check ExactText for element...b
  208. By.cssSelector: #todo-list>li find(ExactText)get wrapped entity
  209. Building iterator...By.cssSelector: #todo-list>li
  210.    check ExactText for element...a
  211.    check ExactText for element...b
  212.  
  213. /*
  214.     в результате - в методе fetchWrappedEntity() класса LazyCollectionFoundByConditionElement
  215.     будет вот такой код
  216. */
  217.  
  218.         for (LazyElement element : parentCollection) {
  219.             WebElement wrappedElement = element.getWrappedEntity();
  220.             if (condition.check(wrappedElement)) {
  221.                 return wrappedElement;
  222.             }
  223.         }
  224.         throw new ElementNotFoundException(this.toString());
  225. /*
  226.     и что по факту мы делаем
  227.  
  228.         сначала - заворачиваем каждый вебэлемент списка коллекции (чтобы воспользоваться итератом для нашей коллекции)
  229.         а потом - на каждом шаге - разворачиваем (получаем wrappedElement = element.getWrappedEntity())
  230.  
  231.         т е - делаем таки кучу не нужной работы
  232.         хоть код и красивый, конечно...
  233.  
  234.     правильнее - для оптимизации реально выполняемых действий - отказаться от идеи обхода коллекции таким образом
  235.         for (LazyElement element : parentCollection)
  236.  
  237.     а реализовать вот так
  238.         получить список вебэлементов parentCollection.getWrappedEntity()
  239.         обойти полученный список вебэлементов в цикле
  240.         и применять к вебэлементу - метод check
  241.  
  242.         сэкономим на заворачиваниях-разворачиваниях)
  243.  
  244.     поправь методы fetchWrappedEntity()
  245.          и для LazyCollectionFoundByConditionElement
  246.          и для LazyCollectionFiltered
  247.          
  248.     убедись - что все тесты в проекте работают
  249.          
  250.     красоту с check - наведем после следующего ревью...
  251.          
  252. */
Advertisement
Add Comment
Please, Sign In to add comment