julia_v_iluhina

Untitled

Oct 16th, 2016
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.56 KB | None | 0 0
  1. public class Configuration {
  2.     public static final long TIMEOUT = 10;
  3. }
  4. /*
  5.     тут нам final-переменная не подходит)
  6.  
  7.     мы инициализируем таймаут по умолчанию - неким значением, которое подходит зачастую
  8.     (в Selenide это было 4 с)
  9.  
  10.     и при необходимости - будем в тест-классе - менять это значение
  11.     вспомни - как работа с таймаутом была реализована в селенидовской версии
  12. */
  13. *********************************************************
  14.   public static ExpectedCondition<Boolean> listNthElementHasText(final List<WebElement> elements, final int index, final String expectedText){
  15.   /*
  16.        реализовывая кондишен как ExpectedCondition<Boolean> - мы не получим эффекта
  17.        когда assertThat для этого кондишена вернет нам, например
  18.        вебэлемент, который прошел проверку
  19.  
  20.        для теста gmail - вопрос не принципиальный - мы не используем результат assertThat для этого кондишена
  21.        но вообще - учитывай такие моменты
  22.  
  23.        сейчас - на твое усмотрение - менять или не менять тип кондишена
  24.   */
  25.         return new ExpectedCondition<Boolean>() {
  26.             private int listSize;
  27.             /*
  28.                 мы этой переменной не пользуемся нигде
  29.                 кроме метода apply
  30.                 потому - и объявлять ее стоит там же
  31.             */
  32.             private String elementText;
  33.  
  34.             public Boolean apply(WebDriver driver) {
  35.                 listSize = elements.size();
  36.                 if (listSize >= index+1){
  37.                 /*
  38.                     можно обойтись и без if
  39.  
  40.                     у нас уже есть секция try-catch
  41.                     тут можно ловить и исключение IndexOutOfRangeException
  42.  
  43.                     оно возникает - когда мы получаем элемент списка по индексу за его границами
  44.  
  45.                     т е - просто в try-catch
  46.                     вызываем elements.get(index)
  47.                     и ловим и исключение IndexOutOfRangeException
  48.  
  49.                     про try-catch - еще отдельно напишу
  50.                     тут есть что еще упростить)
  51.  
  52.                     чтобы в одной секции catch ловить несколько исключений
  53.                     http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html
  54.                     http://stackoverflow.com/questions/3495926/can-i-catch-multiple-java-exceptions-in-the-same-catch-clause
  55.                 */
  56.                     try {
  57.                         elementText = elements.get(index).getText();
  58.                         return Boolean.valueOf(elementText.contains(expectedText));
  59.                     } catch (StaleElementReferenceException var3) {
  60.                         return false;
  61.                     }
  62.                 } else return false;
  63.                 /*
  64.                     когда уйдет if - и этот код уйдет
  65.  
  66.                     по конвеншенсам - применять фигурные скобки нужно
  67.                     https://google.github.io/styleguide/javaguide.html#s4.1.1-braces-always-used
  68.                 */
  69.             }
  70.  
  71.             public String toString(){
  72.                 return String.format(index + " element in list " + Arrays.toString(elements.toArray()) + " should have text: " + expectedText + ". While actual text is " + elementText);
  73.             }
  74.             /*
  75.                 вызови проверку для этого кондишена - которая заведомо не пройдет
  76.                 и посмотри на текст об ошибке
  77.  
  78.                 полезная ли информация Arrays.toString(elements.toArray())?
  79.                 будет ли полезной вот такая информация - elements.toString?
  80.  
  81.                 нужно ли в сообщении об ошибке использовать переходы на другую строку?
  82.                 удобно ли читать сообщение?
  83.             */
  84.         };
  85.     }
  86. **********************************************************
  87.  
  88. public static ExpectedCondition<List<WebElement>> textsOf(final List<WebElement> elementList, final String... expectedTexts){
  89.         return new ExpectedCondition<List<WebElement>>(){
  90.             private int listSize;
  91.             /*
  92.                 и в этом случае - нету смысла выносить переменную listSize на уровень класса
  93.                 мы это используем только в методе apply - значит там єто и обїявлять стоит
  94.             */
  95.             private List<String> actualTexts = new ArrayList<String>();
  96.  
  97.             public List<WebElement> apply(WebDriver driver) {
  98.                 listSize = elementList.size();
  99.                 /*
  100.                     не советую вот тут получать размер списка
  101.  
  102.                     elementList - лейзи прокси список
  103.                     и он переискивается - когда мы к нему обращаемся
  104.                     очень может быть - что когда мы соберем actualTexts
  105.                     элементов будет уже больше )
  106.                     и по сообщению об ошибке - будет сложно что-либо понять)
  107.  
  108.                     лучше - собрать actualTexts
  109.                     и уже анализировать только это
  110.                     и в toString оперировать  этим же
  111.  
  112.                     так получится корректнее)
  113.  
  114.                     да и в таком варианте - не понадобится переменная listSize
  115.                     после того, как соберешь массив строк - можно будет сравнить
  116.                     размер этого массива и количество ожидаемых текстов
  117.                 */
  118.                 for (WebElement element : elementList) {
  119.                     actualTexts.add(element.getText());
  120.                 }
  121.                 /*
  122.                     инициализировали мы массив actualTexts - когда объявили эту переменную
  123.                     и тут, в apply - лишь добавляем в масиив данные
  124.  
  125.                     вспомни видео - где рассказываелось - как работает new WebDriverWait(...).until(...)
  126.                     в рамках ждущей проверки - apply может быть вызван несколько раз
  127.                     и мы будем только пополнять actualTexts
  128.  
  129.                     получится ерунда)
  130.                     до цикла - нужно очищать actualTexts
  131.                 */
  132.  
  133.                 if (listSize != expectedTexts.length) {
  134.                     return null;
  135.                 }
  136.  
  137.                 for (int i = 0; i < expectedTexts.length; i++) {
  138.                     String expectedText = expectedTexts[i];
  139.                     if (!actualTexts.get(i).contains(expectedText)) {
  140.                     /*
  141.                         вполне ок будет и в одну строчку
  142.                         if (!actualTexts.get(i).contains(expectedTexts[i]))
  143.  
  144.                         заодно и от переменной лишней избавишься)
  145.                     */
  146.                         return null;
  147.                     }
  148.                 }
  149.                 return elementList;
  150.             }
  151.  
  152.             @Override
  153.             public String toString() {
  154.                 return "Texts in elements is: "
  155.                         + Arrays.toString(actualTexts.toArray())
  156.                         + " Expected: " + Arrays.toString(expectedTexts);
  157.             }
  158.             /*
  159.                 ага, тут ты уже ничего не выводила про список вебэлементов)
  160.                 реши этот вопрос - после эксперимента с прошлым кондишеном -
  161.                 как это лучше выводить и выводить ли
  162.  
  163.                 ну и стоит придерживаться одной схемы вывода информации
  164.                 что проверяем + где проверяем
  165.                 ожидания
  166.                 факты
  167.  
  168.                 например - так)
  169.  
  170.                 в итоге - будет легче ситать информацию
  171.  
  172.                 и тут встрой в сообщение - переходы на новые строки - для более легкого чтения сообщения
  173.             */
  174.         };
  175.  
  176.     }
  177. ************************************************
  178.     https://docs.google.com/document/d/1BiYTLdypDfucSqiY9isv1HCKKQIxelzqYrN-3Ku1RWM/edit?usp=sharing
  179. /*
  180.     почитай и примени кетчер - во всех разработанных кондишенах
  181.  
  182.     тип параметра кетчера можно упростить до ExpectedCondition<V> - как мы это сделали для assertThat
  183.  
  184.     не забудь ловить и IndexOfBoundsException )
  185. */
  186. *********************************************
  187. public void assertNthMail(int index, String mailText){
  188.    assertThat(listNthElementHasText(mails, index, mailText), 10);
  189. }
  190. /*
  191.     тут нам вполне подошел бы вариант assertThat
  192.     который оперирует Configuration.timeout
  193.  
  194.     кстати, советую писать в коде полностью - Configuration.timeout
  195.     а не timeout
  196.     цель - заострить внимание - что это за переменная
  197. */
Advertisement
Add Comment
Please, Sign In to add comment