julia_v_iluhina

Untitled

Nov 1st, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.19 KB | None | 0 0
  1. public class SmartFilteredByConditionCollection extends AbstractSmartCollection {
  2.  
  3.   ...
  4.  
  5.     @Override
  6.     public List<WebElement> getWrappedEntity() {
  7.         List<WebElement> unfilteredCollection = collection.getWrappedEntity();
  8.         List<WebElement> filteredCollection = new ArrayList<>();
  9.  
  10. /*
  11.     тут переделал
  12.     это ок
  13.  
  14.     а аналогичное место - SmartCollectionFoundByConditionElement?
  15. */
  16. ***********************
  17.     @Override
  18.     public boolean is(Condition<WebElement> condition) {
  19.         try {
  20.             condition.apply(this);
  21.         } catch (WebDriverException e) {
  22.             return false;
  23.         }
  24.         return true;
  25.     }
  26. /*
  27.     с матчером - все ок получилось
  28.     теперь учти это и здесь
  29.  
  30.     используй метод кондишена check
  31.     try-catch - не убирай
  32.     мы по-прежнему должны вылавливать все исключения-наследники WebDriverException
  33.  
  34.     подумай - как использоватьграмотно то, что вернет check
  35.  
  36.     с check более правильно - т к тут метод - лишь для определения - да/нет для кондишена
  37.     и у кондишена метод check - про то же
  38.     результат apply - нам по большому счету и не нужен
  39. */
  40. *************************************
  41. public class SmartInnerElementCollectionByLocator extends AbstractSmartCollection {
  42. /*
  43.     чтоб и это имя класса оставалось в той же схеме, что и остальные
  44.     SmartElementInnerCollection - вот так будет лучше
  45.  
  46.     для полей класса - лучше явно пропиши модификатор доступа (access modifier)
  47. */
  48. ...
  49.  
  50.     @Override
  51.     public List<WebElement> getWrappedEntity() {
  52.         return element.findElements(innerlocator);
  53.     }
  54. /*
  55.     в element.findElements - уже сидит внутри ожидание видимости
  56.  
  57.     а все getWrappedEntity() - не должны в себе содержать ожиданий
  58.     они же сами используются в ждущей проверке
  59.  
  60.     сначала - у родителького элемента получи вебэлемент и затем у него уже вызывай findElements
  61. */
  62.  
  63.     @Override
  64.     public String toString() {
  65.         return "Inner collection from parentElement = " + element + ", by locator " + innerlocator;
  66.     }
  67. /*
  68.     лаконичность тут не помешает)
  69.     element.toString() + " findAll(" + innerLocator + ")"
  70.  
  71.     кстати
  72.     не innerlocator
  73.     а  innerLocator
  74.  
  75. */
  76. *********************************
  77. public class SmartFilteredByConditionCollection extends AbstractSmartCollection
  78. /*
  79.     где toString()?
  80. */
  81. **********************************
  82. SmartCollectionFoundByConditionElement
  83. /*
  84.     toString - перепиши лаконичнее (понятно, без потери точности, но слов многовато сейчас)
  85.     parentCollection.toString() + " find(" + condition.getClass().getSimpleName() + ")"
  86.  
  87.     как-то бессистемно пока у тебя
  88.     про родительские сущности - ты то уточняешься - parent
  89.     то не уточняешься
  90.  
  91.     лучше - везде уточняйся
  92. */
  93. *********************************
  94. SmartCollectionIndexElement
  95. /*
  96.     название класса - SmartCollectionNthElement  ?
  97.     мне кажется - так лучше
  98.     или SmartCollectionFoundByIndexElement - наверное так даже лучше
  99.  
  100.     toString - parentCollection.toString() + "[" + index + "]"
  101. */
  102. **************************
  103. SmartElementInnerElement
  104. /*
  105.     toString - parentElement.toString() + " find(" + innerLocator + ")";
  106. */
  107. ****************************
  108. public interface SmartEntity<V> extends DescribesEntity {
  109.  
  110.     V getWrappedEntity();
  111. }
  112. ...
  113. public abstract class AbstractCondition<V>  implements Condition<V>, DescribesResult
  114. ...
  115. public <V> V run(Command<V> command)
  116. ...
  117. public class WaitFor<V>
  118. /*
  119.     <V> vs <T> ?
  120.  
  121.     конвеншенсы )
  122. */
  123. ***************************
  124. public abstract class CollectionCondition extends AbstractCondition<List<WebElement>> {
  125.  
  126. }
  127. /*
  128.     от ElementCondition - избавился
  129.     а от этого класса чего не избавился? )
  130. */
  131. *********************************
  132. $$(byCss("[role=main] .zA"));
  133. vs
  134. $$("[role=main] .zA");
  135. **********************************
  136. $(byCss("#Email"))
  137. vs
  138. $("#Email")
  139. ***********************
  140. clearComplited
  141. vs
  142. clearCompleted
  143. ***********************
  144. (JavascriptExecutor) getDriver()).executeScript("localStorage.clear()")
  145. /*
  146.   в ConciseAPI реализуй метод executeJavaScript
  147. */
  148. ************************
  149.     public void delete(String text) {
  150.         tasks.find(exactText(text)).hover();
  151.         tasks.find(exactText(text)).find(By.cssSelector(".destroy")).click();
  152.     }
  153. /*
  154.     можно переписать в одну строчку
  155.     tasks.find(exactText(text)).hover().find(".destroy").click()
  156.  
  157.     дореализуй
  158.     SmartElement find(String innerCssSelector);
  159.  
  160.     насчет лаконичных вызовов - $ $$ find - пройдись по коду
  161. */
  162. *****************************
  163.  public void addTask(String text) {
  164.  public void delete(String text)
  165. /*
  166.     в именах методов - не надо про Task писать - т к все действия делаем над тасками
  167.     а вот в именах параметров - стоит уточнить до taskText
  168.  
  169.     во всех методах пейджа пройдись
  170. */
  171. *********************************
  172. public void checkTodoCount(int count)
  173. /*
  174.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.sswzyp7qkm9o
  175. */
  176. **********************************
  177. page.tasks.shouldHave(exactTexts("task 1", "task 2", "task 3", "task 4"));
  178. page.tasks.shouldBe(empty());
  179.  
  180. page.tasks.filter(visible()).shouldHave(exactTexts("task 1"));
  181. page.tasks.filter(visible()).shouldHave(exactTexts("task 1", "task 4"));
  182. /*
  183.     реализуй в пейдже
  184.  
  185.     assertTasks
  186.     assertNoTasks
  187.  
  188.     assertVisibleTasks
  189.     assertNoVisibleTasks
  190.  
  191.     и их используй в тестах
  192.  
  193.     также уже вдогонку
  194.     посмотри видео Якова про это - https://drive.google.com/file/d/0B8hgIBw8-V-AdGxxU1R3enl1RzQ/view?ts=567ab8d7
  195.  
  196.     поясняю)
  197.     мы можем быть максимально точными и держать 4 проверки
  198.         2 -
  199.             в списке = такси с такими-то текстами
  200.             в списке = пусто
  201.         и еще 2 -
  202.             в отфильтрованном по visible списке = таски с такими-то текстами
  203.             в отфильтрованном по visible списке = пусто
  204.         И за точность будем платить  тем - что надо думать - когда какую проверку вызвать правильнее
  205.         и если это делать бездумно - то при небольших изменениях сценариев - могут тесты падать на проверках,
  206.         или второй вариант - не будем нормально пользоваться полученной точностью...
  207.  
  208.         мы можем исходить из того, что ошибку, когда невидимые таски копятся в списке - мы тестим на более низком уровне,
  209.         и на UI уровне - нам не нужно до этого уточняться. Поэтому - мы будем держать всего 2 проверки
  210.               в отфильтрованном по visible списке = таски с такими-то текстами
  211.               в отфильтрованном по visible списке = пусто
  212.         В таком случае - каждый раз понятно - какую проверку вызывать - получаем более KISS картину
  213.         правда, платим за это точностью) Но - возможно - если мы уже отдельно это в тестах покрыли -
  214.         что у нас не копятся невидимые таски - так мы и не платим ) И - тогда - все проще в написании тестов,
  215.         и в их сопровождении.
  216.         Тогда - поскольку обе проверки реализованы одинаково и других нету - можно из имен проверок скрыть этот нюанс
  217.         и назвать их assertTasks и assertNoTasks (хотя в них работаем с отфильтрованным по visible списком тасок)
  218. */
Advertisement
Add Comment
Please, Sign In to add comment