julia_v_iluhina

Untitled

Dec 4th, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.64 KB | None | 0 0
  1.     @Override
  2.     public boolean is(Condition<WebElement> condition) {
  3.         try {
  4.             return condition.check(getWrappedEntity());
  5.         } catch (WebDriverException ex) {
  6.             throw new ElementNotFoundException(this.toString());
  7.         }
  8.     }
  9. /*
  10.     В даном случае - мы отвечаем на вопрос - выполняется кондишен или нет -  да/нет
  11.  
  12.     и даже если мы словили эксепшен - не надо бросать новый
  13.     это значит - нет, кондишен не выполняется
  14.     не важно, какая причина
  15.     нас тут не о том спрашивали)
  16.  
  17.     проверки, которые падают в случае неуспеха - это другая история)
  18.  
  19.     тут - мы просто отвечаем на вопрос - выполняется кондишен или нет
  20.     мы ничего не ждем и повторно не проверяем
  21.     но и рассчитываем только на да/нет
  22. */
  23. *****************
  24. public class CssClass extends AbstractCondition<WebElement> {
  25.  
  26.     public Boolean actualState;
  27.    ...
  28.    /*
  29.         эта переменная уже не нужна
  30.    */
  31.  
  32.  
  33.     @Override
  34.     public boolean check(WebElement element) {
  35.         ...
  36.         actualState = isElementHasCssClass(actualClass, expectedClass);
  37.         return actualState;
  38.         /*
  39.             тут можно проще - return isElementHasCssClass(actualClass, expectedClass);
  40.         */
  41.     }
  42.  
  43. *****************************************************************************
  44. public class ExactTexts extends Texts {
  45. /*
  46.     за счет наследования от Texts - тут можно реализовать лишь метод check
  47.     на тот же MinimumSize посмотри)
  48.  
  49.     еще момент
  50.     списки строк на равенство можно сверить в одну строку - actualTexts.equals(expectedTexts);
  51.     http://www.java2s.com/Tutorial/Java/0140__Collections/CheckingforEquality.htm
  52. */
  53. ***********************************************
  54.     public class WithWaitFor<V> {
  55.  
  56.     ...
  57.  
  58.         public V run(final Command<V> command){
  59. /*
  60.     реализаци класса - ок
  61.     и его использование  - тоже
  62.  
  63.     можно чуть изменить - не на уровне класса объявлять дженерик-класс <V>
  64.     а на уровне метода run
  65.     ведь только  в это методе мы оперируем командой типа Command<V>
  66.     и только в этом методе - получаем результат типа <V>
  67.  
  68.     тогда сможешь при вызовах писать
  69.     не return new WithWaitFor<String>(this, visible()).run(new Command<String>() ....
  70.     а  return new WithWaitFor(this, visible()).run(new Command<String>() ....
  71.  
  72.     а если еще в WithWaitFor - реализуешь статический метод withWaitFor
  73.     то return withWaitFor(this, visible()).run(new Command<String>() ....
  74.  
  75.     вот это поправь
  76.  
  77.     и еще
  78.     если мы оперируем дженерик-типом, объявленным на уровне метода и используемым как тип возвращаемого значения - используй <V>
  79.     а если оперируем дженерик-типом, обхявленным на уровне класса - используй <T>
  80.  
  81.      http://stackoverflow.com/questions/6008241/java-generics-e-and-t-what-is-the-difference
  82.  
  83.         когда типизируешь generic-типом класс - то T (T is meant to be a Type)
  84.  
  85.         а когда речь идет о типизации значения, возвращаемого методом -  V (V is Value (as a return value or mapped value))
  86.  
  87.         т е - тут = T is meant to be a Type
  88.  
  89.         а вот в   public <V> V run(Command<V> command) - как раз V правильно
  90.         т к V - это тип возвращаемого значения
  91.  
  92.      тут, после изменений - будем работать с методом
  93.      public <V> V run(final Command<V> command)
  94.       и дженерик-типа на уровне класса - объявлять не будем
  95.      а раз так - то тут -  используем <V>
  96.  
  97.      а вот для Command - грамотнее оперировать <T>
  98.  
  99.      просмотри весь код на этот предмет
  100. */
  101. *******************************
  102. public String getTagName() {
  103. /*
  104.     тут достаточно ждать present()
  105. */
  106. ************************
  107. public boolean isSelected() {
  108. /*
  109.     а тут лучше ждать видимости
  110.     только для видимых элементов это важно - isSelected()
  111. */
  112. ******************************
  113. public class ElementNotFoundException extends WebDriverException {
  114.     public ElementNotFoundException() {
  115. }
  116. /*
  117.     Мы не используем конструкторы эксепшенов без параметров
  118.  
  119.     предлагаю такие конструкторы удалить)
  120.  
  121.     касается всех реализованных эксепшенов
  122. */
  123.  
  124. *****************************
  125. public abstract class Load<T, V> {
  126. /*
  127.     класс можно убирать из проекта
  128. */
  129. ******************************
  130. LazyCollection tasks = $("#todo-list").findAll("li");
  131. /*
  132.     в конечной версии - используй $$("#todo-list>li");
  133.  
  134.     проверили findAll - и ок )
  135.  
  136. */
  137. *****************************
  138.     private void toggle(String taskClass, String taskText) {
  139.         $$(taskClass).find(text(taskText)).$(".toggle").click();
  140.     }
  141. /*
  142.     реализация в твоей селенидовской работе - была лучше
  143.     т к мы отталкивались от tasks - были точнее и однозначнее
  144.     предлагаю и тут также реализовать
  145.  
  146.     и придется подправить вызовы в
  147.     complete и activate
  148. */
  149.     private void toggle(String taskClass, String taskText){
  150.         tasks.filterBy(cssClass(taskClass)).findBy(exactText(taskText)).$(".toggle").click();
  151.     }
  152. ********************************
  153.     public void edit(String oldTaskText, String newTaskText) {
  154.     public void cancelEdit(String oldTaskText, String newTaskText) {
  155. /*
  156.     в этих методах - нам не нужно sendKeys(newTaskText + ...);
  157.  
  158.     только вызвать - pressEnter()  / pressEscape()
  159. */
  160. ********************************
  161. tasks.shouldHave(size(0));
  162. /*
  163.     полезно реализовать кондишен empty()
  164.     c реализацией size(0)
  165.  
  166.     и использовать его в пейдже
  167. */
  168. **********************************************
  169.     public static <V> V assertThat(ExpectedCondition<V> condition) {
  170.         return (new WebDriverWait(getDriver(), Configuration.timeout)).until(condition);
  171.     }
  172. /*
  173.     WebDriverWait - принимает таймаут в секундах
  174.  
  175.     у нас - таймаут в миллисекундах
  176.  
  177.     передавай таймаут, пересчитанный в секунды
  178. */
  179. ************************************
  180. /*
  181.     еще момент
  182.     у меня например - это проявлялось
  183.     скорее всего - у тебя тоже
  184.     тесты для todoMVC - нестабильно работают
  185.  
  186.     после выполнения предварительных действий
  187.     насинает работать рест - и используемые элементы еще работают не так как обычно
  188.  
  189.     есть такая проблемка в приложении
  190.     после открытия страницы или рефреша
  191.     элементы уже доступны, но еще не все JavaScripts загрузились
  192.     и если в этот момент мы начинаем работать с элементами - то возникают такого рода проблемы
  193.  
  194.     хорошо от этого помогает если в гивен-методе после refresh();
  195.     сверить размер коллекции с количеством переданных тасок
  196.     $$("#todo-list>li").shouldHave(size(tasks.lengt));
  197.     фактически - такая проверка выполняет роль ожидания - что страница готова к работе
  198.  
  199.     если б гивены жили в том же пейдже - вообще красиво бы получилось
  200.     а так  - в GivenHelpers придется вот такой код вставить
  201.     не DRY получается
  202.  
  203.     я сейчас работаю над материалом - как такие вещи ждать более универсально
  204.     надеюсь на неделе отдать
  205.     пока предлагаю - вставить вот такую не DRY проверку
  206.     а я потороплюсь)
  207.  
  208.     по итогу - уже чистим проект окончательно
  209.     убедись  - что все работает
  210.     что нет ничего лишнего
  211.     лишних рабочих каких-то комментариев
  212.     форматирование, пропуски ...
  213.     ну и чтоб тесты бегали)
  214. */
Advertisement
Add Comment
Please, Sign In to add comment