Advertisement
julia_v_iluhina

Untitled

Feb 2nd, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.06 KB | None | 0 0
  1. public static Actions action() { return new Actions(getDriver()); }
  2. /*
  3.     объект класса Actions - логично именовать actions() (а не action())
  4.  
  5.     реформатируй код - сейчас не стандартное форматирование
  6. */
  7. *****************************
  8. public static ExpectedCondition<WebElement> elementHasText(final By elementsLocator, final String elementText) {
  9. /*
  10.     версия рабочая
  11.     ниже приведу свою - поясню - что я реализовала бы не так и почему
  12. */
  13. public static ExpectedCondition<WebElement> elementHasText(final By elementsLocator, final String expectedText) {
  14. /*
  15.     имя параметра expectedText - точнее отражает - что за текст
  16.     а то, что это текст для элемента - из имени кондишена ясно
  17. */
  18.        return elementExceptionsCatcher(new ExpectedCondition<WebElement>() {
  19.  
  20.             private List<String> actualTexts;
  21.             /*
  22.                 на уровне класса объявляю лишь то, что будет нужно в разных методах класса
  23.                 остальное - лишь там, где используется
  24.  
  25.                 имя actualTexts - тоже для кондишена четче обозначает - что за тексты
  26.             */
  27.  
  28.             public WebElement apply(WebDriver driver) {
  29.  
  30.                 List<WebElement> elements = driver.findElements(elementsLocator);
  31.                 /*
  32.                     elements - используется только внутри apply
  33.                     потому и объявляем переменную в apply
  34.                 */
  35.                 actualTexts = getTexts(elements);
  36.                 /*
  37.                     получение текстов тасок - будет нужно и в других кондишенах
  38.                     я бы вынесла это в отдельный метод и переиспользовала
  39.                 */
  40.  
  41.                 for (int i=0; i<actualTexts.size(); i++) {
  42.                     if (actualTexts.get(i).equals(expectedText)) {
  43.                         return elements.get(i);
  44.                         /*
  45.                             можно обойтись и без создания специальной переменной
  46.                         */
  47.                     }
  48.                 }
  49.                 return null;
  50.             }
  51.  
  52.             public String toString() {
  53.                 return String.format("\nList located by - %s"
  54.                                 + "\nContains element with exact Text: %s"
  55.                                 + "\nActual texts of list elements are: %s\n"
  56.                         , elementsLocator.toString()
  57.                         , expectedText
  58.                         , actualTexts.toString()
  59.                 /*
  60.                     подправила фразу немного
  61.                     и обрати внимание - насколько четче с терминами expectedText  и actualTexts
  62.                 */
  63.                 );
  64.             }
  65.         });
  66.     }
  67. /*
  68.     на изменениях не настаиваю
  69.     но рекомендую)
  70.  
  71.     эти же советы стоит применить и к реализации других кондишенов)
  72. */
  73. *****************************************************************
  74.     public static ExpectedCondition<WebElement> elementHasCssClass(final By elementsLocator, final String cssClass) {
  75.      ...
  76.                     classOfElements.add(element.getAttribute("class"));
  77.                     if (element.getAttribute("class").contains(cssClass)) {
  78.                     /*
  79.                         строчкой выше - уже получил element.getAttribute("class")
  80.                         второй раз получать - как-то излишне, можно оптимальнее
  81.  
  82.                         и проверка .contains(cssClass) - не достаточна
  83.                         пример
  84.                         в атрибуте class = "active editing"
  85.                         делаем проверку для класса "edit"
  86.                         и она пройдет
  87.                         а не должна)
  88.  
  89.                         надо разбить строку-значение атрибута class на слова - по пробелам
  90.                         (например - "active editing" на  "active" и "editing"
  91.                         и потом  - если среди этих слов - встречается равное cssClass
  92.                         тогда ок, класс содержится
  93.                     */
  94. **************************************************************************
  95. public static ExpectedCondition<List<WebElement>> exactTextsOfVisible(final By elementsLocator, final String... texts) {
  96. ....
  97.             public String toString() {
  98.                 return String.format("\nList found with locator - %s"
  99.                                 + "\nshould contain text(s): %s"
  100.                                 + "\nwhile actual text(s): %s\n"
  101.                         , elementsLocator.toString()
  102.                         , Arrays.toString(texts)
  103.                         , textsOfVisible.toString()
  104.                 );
  105.             }
  106.         /*
  107.             я бы сказала - should have
  108.             т к это точнее описывает проверку
  109.  
  110.             мне кажется contain=содержит= может быть что-то еще кроме
  111.  
  112.             субъективно)
  113.             не обязательно исправлять
  114.         */
  115. ************************************************************
  116. public static ExpectedCondition<Boolean> sizeOfVisible(final By locator, final int sizeOfVisibleToBe) {
  117. /*
  118.     пользы от реализации кондишена как ExpectedCondition<Boolean>
  119.     меньше
  120.     по сравнению с вариантом ExpectedCondition<List<WebElement>>
  121.  
  122.     обрати внимание на имя первого параметра
  123.     подправь - чтоб придерживался одной линии с другими кондишенами
  124.  
  125.     однозначность - всегда полезна)
  126. */
  127. *****************************************
  128. public static List<String> getTextsOfVisible(List<WebElement> elements) {
  129. public static List<WebElement> getVisibleElements(List<WebElement> elements) {
  130. /*
  131.     я бы реализовала набор методов getTexts и getVisibleElements
  132.     более универсальный
  133.     и их можно комбинировать - для получения текстов только видимых элементов = getTexts(getVisibleElements(elements))
  134.  
  135.     понятно - что твой вариант эффективнее
  136.     т к один цикл вместо 2-ух
  137.  
  138.     но мой вариант - более DRY
  139.  
  140.     не настаиваю на изменениях
  141. */
  142. ******************************************
  143. package com.todomvcse.page;
  144. ...
  145. public class TaskManagerPage {
  146. /*
  147.     имя пекеджа для пейджей - лучше pages
  148.     даже если пейдж один
  149.     возможно - он пока один) (в том смысле - что их будет больше)
  150. */
  151. *******************************************
  152.     public void assertItemsLeft(int itemsLeft) {
  153.         assertThat(visibilityOfElementLocated(By.cssSelector("#todo-count>strong")), itemsLeft);
  154.     }
  155. /*
  156.     ты вызываешь вот этот метод
  157.     assertThat(ExpectedCondition<V> condition, int timeout)
  158.  
  159.     т е - itemsLeft - передаешь в качестве таймаута
  160.  
  161.     странно)
  162.     зачем так?
  163.    
  164.     как считаешь - что мы проверили?
  165. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement