julia_v_iluhina

Untitled

Sep 1st, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.54 KB | None | 0 0
  1.  
  2.  public By byCss(String cssSelector) {
  3.      return By.cssSelector(cssSelector);
  4.  }
  5.  
  6.  public By by(String cssSelector) {
  7.      return byCss(cssSelector);
  8.  }
  9. /*
  10.     зачем тебе 2 метода с одинаковой функциональостью?
  11.  
  12.     byCss - более точное имя, его и используй
  13.  
  14.     метод - by(String cssSelector) - удали
  15. */
  16. *************************************************************
  17.  
  18.     public By ById(String cssSelector) {
  19.         return ById(cssSelector);
  20.     }
  21. /*
  22.     сомневаюсь, что используешь это метод)
  23.     да и вопрос, нужен ли подобный метод, ведь можно так написать byCss("#id") вместо ByID("id")
  24.     не менее понятно)
  25.  
  26.     как думаешь - какого эффекта достигнешь, используя метод с такой реализацией?
  27.     )) расскажи мне про это в слеке )
  28.  
  29.     не забывай - имена методов начинаются с маленькой буквы
  30. */
  31. *********************************************
  32.  
  33.    public <V> V assertThat(Function<? super WebDriver, V> condition) {
  34. /*
  35.     реализация верная, можно чуть упростить - использовать параметр типа ExpectedCondition<V> condition
  36.     вместо Function<? super WebDriver, V> condition
  37.     про это - ниже поямню подробнее
  38.  
  39.     реализуй также вариант
  40.     public static <V> V assertThat(ExpectedCondition<V> condition, WebDriver driver, int timeout)
  41.     с такой же функциональностью - но таймаут  - передаем как параметр
  42.     такой вариант  - более универсальный и позволяет для какого-то единственного тормозящего элемента -
  43.     выполнить проверку с таймаутом, который отличается от Configuration.timeout
  44.  
  45.     а как реализуешь вариант
  46.     public static <V> V assertThat(ExpectedCondition<V> condition, WebDriver driver, int timeout)
  47.     используй в public <V> V assertThat(Function<? super WebDriver, V> condition)
  48.     вызов этого  более универсального метода - получишь DRY код
  49. */
  50.  
  51.     /*
  52.         можно было бы реализовать метод assertThat с параметрами попроще -
  53.             public static <V> V assertThat(ExpectedCondition<V> condition, WebDriver driver, int timeout)
  54.         а не
  55.             public static <V> V assertThat(Function<? super WebDriver, V> condition, WebDriver driver, int timeout)
  56.  
  57.         если зажав ctrl кликнешь на until - то увидишь его реализацию и сигнатуру
  58.         а сингатура - public <V> V until(Function<? super T, V> isTrue)
  59.         т е - наш кондишен типа ExpectedCondition<V> может быть приведен в типу Function<? super T, V> (edited)
  60.         а если точно также зажав ctrl кликнуть на ExpectedCondition - то увидишь
  61.     */
  62.     /**
  63.      * Models a condition that might reasonably be expected to eventually evaluate to something that is
  64.      * neither null nor false. Examples would include determining if a web page has loaded or that an
  65.      * element is visible.
  66.      * <p>
  67.      * Note that it is expected that ExpectedConditions are idempotent. They will be called in a loop by
  68.      * the {@link WebDriverWait} and any modification of the state of the application under test may
  69.      * have unexpected side-effects.
  70.      *
  71.      * @param <T> The return type
  72.      */
  73.     public interface ExpectedCondition<T> extends Function<WebDriver, T> {}
  74.  
  75.     /*
  76.         т е - мы можем выполнить такое приведение типов - т к это предок для ExpectedCondition
  77.         (это довольно грубое пояснение, но пока достаточное, чтоб не лезть в дебри -
  78.         на самом деле Function - это интерфейс, который имплементирован в классе ExpectedConditions,
  79.         про интерфейсы поговорим, но позже и подробнее))
  80.  
  81.         можешь и чуть далее углубиться - на Function кликнуть с ctrl
  82.         это интерфейс, объявленный в com.google.common.base;
  83.     */
  84.     /**
  85.      * Determines an output value based on an input value.
  86.      *
  87.      * <p>The {@link Functions} class provides common functions and related utilites.
  88.      *
  89.      * <p>See the Guava User Guide article on <a href=
  90.      * "https://github.com/google/guava/wiki/FunctionalExplained">the use of {@code
  91.      * Function}</a>.
  92.      *
  93.      * @author Kevin Bourrillion
  94.      * @since 2.0
  95.      */
  96.     @GwtCompatible
  97.     public interface Function<F, T> {
  98.     /*
  99.         Сейчас - пока достаточно общего поинмания - что есть что
  100.         а в assertThat - можно упростить сигнатуру до  -
  101.             public static <V> V assertThat(ExpectedCondition<V> condition, WebDriver driver, int timeout)
  102.         это - надо хорошо понимать
  103.         ну и про предка ExpectedCondition - что он Function.... (посмотри - из какого пекеджа)
  104.         пока  - этого понимания будет достаточно
  105.     */
  106.  
  107. ********************************************************************************************************
  108. http://joxi.ru/krDOZldF0Db9NA
  109.  
  110. /*
  111.     перенеси пейджи на уроверь выше
  112.     пейджи к core  - не относятся
  113.     да, пейджи  тоже можно переиспользовать
  114.  
  115.     но - core - это не привязанные к какому-то тестируемому приложению инструменты
  116.     полностью универсальные
  117.  
  118.     pages - униварсальные в рамках тестов определенного приложения
  119. */
  120. ******************************************
  121. public class Base extends ConciseAPI {
  122.  
  123. /*
  124.     реализация пейджа-предка = ок
  125.     и она  - как раз универсальная = не привязанный к какому-то тестируемому приложению инструмент
  126.     перенеси этот класс в core
  127.  
  128.     а теперь вспомни
  129.     какие отличия в нейминге классов - для пейджей-объектов и пейджей-модулей
  130.     и поправь имена классов пейджей и их предка)
  131. */
  132. ********************************************************
  133. $(By.id("Email"))
  134.  
  135. /*
  136.     ага, избегаешь метод ById использовать)))
  137.     права)
  138.  
  139.     сравни
  140.     $(By.id("Email"))
  141.     vs
  142.     $("#Email")
  143.     мне кажется - второй вариант куда приятнее)
  144. */
  145. *********************************************
  146.  
  147.     public void searchMails(String text) {
  148.         $(By.id("gbqfq")).sendKeys(text, Keys.ENTER);
  149.     }
  150. /*
  151.     ты понагляднее вариант для локатора этого поля использовала в селенидовской версии
  152.     загляни туда
  153. */
  154. ***********************************************
  155. /*
  156.     ок, пока делаем версию с лейзи-прокси элементами
  157.  
  158.     и у нас первая задача - реализовать проверку, аналогичную селенидовской
  159. */
  160.     public static void assertMails(String... mailTexts) {
  161.         mails.shouldHave(texts(mailTexts));
  162.     }
  163. /*
  164.     Мы использовали кондишен для коллекции элементов - texts
  165.  
  166.     в селениуме - такого кондишена нету
  167.     и мы его напишем и разместим в CustomConditions
  168.  
  169.     можно заглянуть в реализацию селенидовского кондишена - чтобы использовать
  170.     идеи из логики проверки
  171.  
  172.     давай сначала разберемся с типом кондишена, который будем реализовывать
  173.     можно реализовать ExpectedCondition<Boolean>
  174.     тогда в случае успеха - assertThat - вернет True
  175.     в случае не успеха - тест упадет (как ему и положено)
  176.     а метод apply кондишена - будет возвращать
  177.     True - если проверка пройдена
  178.     False - если она не пройдена
  179.  
  180.     мы можем больше пользы извлечь из ситуации, если такой кондишен будет типа
  181.     ExpectedCondition<List<WebElement>>
  182.     тогда в случае успеха - assertThat вернет List<WebElement>
  183.     и можно будет писать что-то такое - assertThat(sizeOf(elementsList,10)).get(9).click();
  184.     (это если кондишен sizeOf был бы реализован с первым параметром - List<WebElement>)
  185.     а метод apply кондишена - будет возвращать
  186.         List<WebElement> - тот же лейзи прокси список, который получил на входе - если проверка пройдена
  187.         null - если она не пройдена
  188.  
  189.     так
  190.     с типом кондишена определились
  191.     нужен кондишен ExpectedCondition<List<WebElement>>
  192.  
  193.     теперь с параметрами
  194.     проверяем  - лейзи прокси список веб элементов - List<WebElement> elements
  195.     что проверяем у этого списка - текстЫ = String... expectedTexts
  196.  
  197.     Загляни в  селениумский класс ExpectedConditions
  198.     (в коде - зажав ctrl + кликнув на имя любого стандартного селениумского кондишена)
  199.     там можно почерпнуть ряд идей
  200.  
  201.     теперь - давай вспомним - что есть лейзи прокси список вебэлементов
  202.     нам не надо заботиться о том, чтобы он переискался - он это делает самостоятельно
  203.     а нам - в apply кондишена - надо принять решение - в ЭТОМ состоянии - список удовлетворяет условию или нет
  204.     а ЭТО состояние - предполагает - что  оно на протяжении анализа - не меняется)
  205.  
  206.     т е задача номер один = зафиксировать = ЭТО состояние
  207.     используй список строк для того, чтобы сохранить в нем тексты всех элементов ашего лейзи-прокси списка
  208.  
  209.     получили список актуальных текстов
  210.  
  211.     теперь - работаем только с ним - этто и есть ЭТО состояние )
  212.     сравни размер списка актуальных текстов и количество переданных ожидаемых текстов
  213.     если количество не равное - уже проверка не прошла
  214.  
  215.     если количество равное - сравнивай тексты
  216.         нулевого актуального текста - с нулевым ожидаемым,
  217.         первого - с первым и т д
  218.         если какой-либо актуальный текст не содержит ожидаемого текста - проверка не прошла
  219.         если тексты всех элементов прошли проверку - вот только в этом случае проверка прошла
  220.  
  221.      вспомни - зачем реализовывали метод toString у кондишена
  222.          когда проверка не проходит - эта информация выводится в описании ошибки
  223.          потому - тут мы должны описать - и актуальное (ЭТО состоняние - которое мы зафиксировали в списке строк)
  224.          и ожидаемое состояние (переданные в кондишен ожидаемые тексты)
  225.  
  226.     тестируй написанный кондишен - используя
  227.          проверку, которая должна пройти (она должна пройти)
  228.          проверку, которая не должна пройти (она не должна пройти + сообщение об ошибке должно быть понятным)
  229.  
  230. */
  231. **********************************
  232.  
  233. /*
  234.     есть еще одна проверка, которую хорошо бы реализовать
  235.     чтобы избавиться от
  236.      @FindBy(css = "[role = 'main'] .zA:nth-child(1)")
  237.         public WebElement firstMail;
  238.  
  239.     если бы у нас был кондишен, который для лейзи прокси списка вебэлементов
  240.     проверял текст элемента списка с индексом таким-то
  241.  
  242.     то у нас получилась бы - удобная универсальная проверка
  243. */
  244.     public void assertMail(int index, String mailText) {
  245.         assertThat(nthElementHasText(mails, index, mailText));
  246.     }
  247. /*
  248.     следующая цель - реализовать кондишен nthElementHasText
  249.     и удаление уже ненужного лейзи прокси firstMail
  250.    
  251.     если разберешься с кондишеном texts - попробуй реализовать и этот
  252.    
  253.     будет сложно с texts - отложи этот кусок
  254.     реализуем позже
  255.     как все вопросы по texts решим
  256. */
Advertisement
Add Comment
Please, Sign In to add comment