julia_v_iluhina

Untitled

Jul 24th, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.29 KB | None | 0 0
  1. public class ToDoMVCTest
  2.  
  3. /*
  4.     Я бы все равно вынесла в пейдж-модуль все вспомогательное)
  5.     это мелочь)
  6.     по заданию этого не требовалось, но код от этого выиграл бы
  7.    
  8.     можешь это уже в конце выполнить
  9. */  
  10. *******************************************
  11.    @After
  12.     public void clearData() {
  13.         JavascriptExecutor js = (JavascriptExecutor)getDriver();
  14.         js.executeScript("localStorage.clear()");
  15.     }
  16. /*
  17.     реализуй в ConciseAPI - метод executeJavaScript
  18.     а тут его просто используй
  19. */
  20. ****************************************
  21.  
  22.   public static ExpectedCondition<WebElement> listElementWithText(List<WebElement> elements, String text) {//<-----------------1
  23.         return new ExpectedCondition<WebElement>() {
  24.  
  25.             WebElement element;
  26.             @Override
  27.             public WebElement apply(WebDriver driver) {
  28.                 for (WebElement e : elements) {
  29.                     if (e.getText().equals(text)) {
  30.                         element = e;
  31.                     }
  32.                 }
  33.                 if (element == null) {//<-------------------2
  34.                     throw new NullPointerException();
  35.                 }
  36.                 return element;
  37.             }
  38.         };
  39.     }
  40.  
  41. /*
  42.     1
  43.     почему этот кондишен реализовал с первым параметром - List<WebElement> elements?
  44.     вспомни - для каких списков вебэлементов можно применять ждущие проверки кондишенов?
  45.     почему мы в предыдущем задании кондишены реализовывали с параметром By locator ?
  46.     как мы смогли отказаться от  использования пейджей-модулей, которые создавали через PageFactory.initElements?
  47.    
  48.     2
  49.     Не ясно, для чего тебе вызывать NullPointerException)
  50.     вспомни, что должен вернуть кондишен типа ExpectedCondition<WebElement>
  51.     если проверка не прошла?
  52.     а что должен вернуть - если проверка прошла?
  53.    
  54.     тут вызывать эксепшены ни к чему
  55.     почитай вот это http://stackoverflow.com/questions/4715492/best-practise-in-catching-and-throwing-nullpointerexception
  56.     чтоб просто разобраться
  57.     чуть далее эту тему будем глубже разбирать
  58.     пока просто чуть почитай)
  59.     не страшно - если пока вопросы останутся
  60.    
  61.     и в принципе по алгоритму в apply
  62.     мы в рамках прошлого задания достаточно долго равняли кондишен  textsOf(By locator, String... texts)
  63.     сначала в apply - собирали тексты всех элементов
  64.     затем  - работали именно с ними
  65.     а в toString - выводили информацию о фактических текстах списка и ожидаемых текстах
  66.     тут - задача очень похожа
  67.    
  68.     нужно этот кондишен привести в порядок)
  69. */
  70. *******************************************
  71.   еще по кондишенам
  72.   http://joxi.ru/82QYoQyI1GQOM2
  73.  
  74.   у тебя таких проблем нет?
  75.   если есть - так объяви параметры метода как final
  76.    
  77.   если нет, то уточни - какую версию java SDK используешь
  78.  
  79.   https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
  80.     раздел Accessing Local Variables of the Enclosing Scope, and Declaring and Accessing Members of the Anonymous Class
  81.      
  82.   http://blog.brendanlacanette.com/2015/08/variable-is-accessed-within-inner-class.html    
  83. ******************************************  
  84.  
  85.     private void toggle(String taskText) {
  86.         $(findTaskByText(taskText), ".toggle").click();
  87.     }
  88.  
  89.     private ExpectedCondition<WebElement> findTaskByText(String taskName) {
  90.         return listElementWithText(tasks(), taskName);
  91.     }
  92. /*
  93.     а для чего тебе метод findTaskByText?
  94.    
  95.     сравни
  96.     $(findTaskByText(taskText), ".toggle").click();
  97.     и
  98.     $(listNthElementHasText(tasks, taskText), ".toggle").click();
  99.     где tasks = By.cssSelector("#todo-list>li");
  100.    
  101.     это как раз пример - когда не стоило реализовывать метод
  102.     без него - код проще
  103.     с ним - нет выигрыша
  104.     лишь дольше придется разбирать - что на чем стояло )
  105.    
  106.     сам кондишен listElementWithText - как писала выше - требует доработки
  107. */
  108.  
  109. ******************************************  
  110.  
  111.   public static ExpectedCondition<List<WebElement>> conditionToWaitElements(By locator) {
  112.   ...
  113.    
  114.     public static List<WebElement> $$(String cssSelector) {
  115.         return assertThat(conditionToWaitElements(By.cssSelector(cssSelector)));
  116.     }  
  117.    
  118. /*
  119.     такой кондишен conditionToWaitElements тебе не нужен точно)
  120.    
  121.     еще раз посмотри на вот этот кусочек задания
  122.     http://joxi.ru/BA0p30gsBjyy6A
  123.    
  124.     там даны подсказки - как реализовать метод и какие у него должны быть параметры
  125.    
  126.     что до самой реализации conditionToWaitElements
  127.     чтобы условие кондишена было успешно віполнено - достаточно чтобы список элементов был не пуст
  128.     но - это совершенно не значит - что так мы обеспечим надежное ожидание момента - что список догрузился...
  129.     это уже так... по пути )
  130.     тебе не нужен такой кондишен)
  131.    
  132.     а кроме того - в этом задании тебе не нужен он вообще)
  133.     так что пока можно вообще этот метод не реализовывать - чтоб он тебя не смущал )
  134. */
  135. **********************************************************
  136.  
  137.   public static ExpectedCondition<List<WebElement>> textsOf(By locator, String... texts) {
  138.  
  139.   http://joxi.ru/5md7jYwtvBj8Vr
  140.  
  141.   /*
  142.     для реализации assertVisibleTasks - нужен кондишен, аналогичный textsOf, но который работает только с видимыми элементами списка
  143.    
  144.     как реализуешь и убедишься в работоспособности - сразу вернись к коду и подумай - как можно было бы сделать код более DRY
  145.    
  146.   */
  147. **********************************************************  
  148.   public static ExpectedCondition<Boolean> empty(List<WebElement> list) {
  149.         return new ExpectedCondition<Boolean>() {
  150.  
  151.             @Override
  152.             public Boolean apply(WebDriver driver) {
  153.                 for (WebElement e : list) {
  154.                     if (e.isDisplayed()) {
  155.                         return false;
  156.                     }
  157.                 }
  158.                 return true;
  159.             }
  160.         };
  161.     }
  162.  
  163.   /*
  164.     тоже самое - про параметр List<WebElement> list
  165.    
  166.     кроме того - название кондишена и его реализация - вообще о разном
  167.     в реализации - работаешь с видимыми элементами
  168.     а в имени кондишена - это не уточняешь
  169.    
  170.     ты ранее уже реализовывал кондишен  sizeOf
  171.     https://bitbucket.org/markony647/sditpart
  172.    
  173.     перенеси его сюда
  174.     доработай - чтобы кондишен этот был не ExpectedCondition<Boolean>
  175.     а ExpectedCondition<List<WebElement>>
  176.    
  177.     так будет точно универсальнее
  178.    
  179.     а затем реализуй в рамках CustomConditions - статический метод ExpectedCondition<List<WebElement>> empty()
  180.     в котором переиспользуй ранее реализованный sizeOf
  181.     что-то такого плана
  182.     public static ExpectedCondition<List<WebElement>> empty(final By elementsLocator) {
  183.         return sizeOf(elementsLocator, 0);
  184.     }
  185.    
  186.     это раз
  187.    
  188.     далее - тебе нужна такая же пара, но которая оперирует не всеми элементами списка
  189.     а только видимыми элементами
  190.    
  191.     для этого реализуй sizeOfVisible и метод listOfVisibleIsEmpty
  192.    
  193.     а чтобы была одна логика в именах - лучше переименовать empty() в listIsEmpty
  194.    
  195.     так ты сможешь реализовать
  196.     assertNoTasks()  & assertNoVisibleTasks()
  197.    
  198.    
  199.   */
  200. **********************************************************  
  201.   public WebElement hover(WebElement element) {
  202. /*
  203.     метод вынеси в ConciseAPI - он универсальный
  204. */
  205. ******************************************************
  206. Выложил пока что костыльный вариант, он пока что:
  207. - неполный (только енд ту енд часть);
  208. /*
  209.     в связи с реализацией остального - возникнут новые потребности
  210.    
  211.     например вот это
  212.     tasks.find(cssClass("editing")).find(".edit").setValue(newTaskText)
  213.    
  214.     тебе понадобится кондишен listElementWithCssClass
  215.     который в случае успешной проверки вернет элемент списка с ожидаемым классом
  216.     и тебе понадобится метод setValue
  217.    
  218.     фактически - мы с помошью такого кондишена и метода
  219.     $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementCssSelector)
  220.     реализуем вот это tasks.find(cssClass("editing")).find(".edit")
  221.    
  222.     а для реализации tasks.find(exactText(oldTaskText)).doubleClick(); - понадобится метод doubleClick
  223.    
  224. */  
  225. - черновой вариант, который нужно рефакторить (имена методов/ добавить сообщения об ошибках/ добавить перехватчик ошибок и пр);
  226.   /*
  227.     да, тут нужно будет поработать)
  228.    
  229.     не держи в тест-классе вспомогательных методов
  230.    
  231.     универсальное - в ConciseAPI
  232.     вспомогательное для тестирования именно этого приложения - в пейдж
  233.   */
  234. - есть костыльные моменты типа вызова tasks(), в некторых случаях и он не прокатывает, поэтому использую driver.findElements() ;
  235.   /*
  236.     и tasks(), и driver.findElements() - тебе категорически не нужны
  237.    
  238.     ты не учел кое-что очень важное )
  239.    
  240.     выше я намекала тебе на это
  241.    
  242.     если не догадаешься - приходи в слек, обсудим)
  243.   */
  244. Детальное ревью в данном случае не нужно.
  245. Просто хочу понимать в верном ли направлении двигаюсь или концептуально все нужно переделывать :)
  246. /*
  247.     Собственно, многие проблемы именно из-за того, что ты не учел это кое-что важное)
  248. */
Advertisement
Add Comment
Please, Sign In to add comment