Advertisement
julia_v_iluhina

Untitled

Sep 30th, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.47 KB | None | 0 0
  1. public static <V> V assertThat(WebDriver driver, ExpectedCondition<V> condition)
  2. /*
  3.     все ок реализовал)
  4.     хорошо)
  5.     это был такой, не самый простой момент)
  6.  
  7.     давай еще реализуем более универсальный вариант
  8.     <V> V assertThat(WebDriver driver, ExpectedCondition<V> condition, int timeout)
  9.  
  10.     и после этого - ты спожешь в assertThat(WebDriver driver, ExpectedCondition<V> condition)
  11.     вызывать assertThat(WebDriver driver, ExpectedCondition<V> condition, int timeout)
  12.     чтоб было DRY
  13.  
  14.     цель - зачем нам именно 2 таких метода
  15.     допустим, в целом нам нужны таймауты в 10 секунд
  16.     но есть пара тормозящих проверок - для которых даймаут нужен побольше
  17.  
  18.     мы устанавливаем Configuration.timeout - в 10 секунд
  19.     а в тех тормозящих проверках -
  20.     используем assertThat(WebDriver driver, ExpectedCondition<V> condition, int timeout)
  21.     явно указывая бОльший таймаут
  22.  
  23.     удобно)
  24.  
  25. */
  26.  
  27. *********************
  28.  
  29.  public static WebElement $(WebDriver driver, String cssSelector){
  30.  public static WebElement $(WebDriver driver, By elementLocator){
  31.  /*
  32.     с этими методами - тоже все отлично
  33.     получается - если нам нужно поработать разово с каким-то элементом
  34.     то лучше рецепта и нету - этот метод нам позволит аккуратно код написать
  35.     что ты с успехом и сделал
  36.  */
  37.  ***********************************
  38.   public void assertMail(int  index, String mailHeaderText){
  39.          assertThat(driver, textToBePresentInElementLocated(byCss("[role='main'] .zA:nth-child(" + index + 1 + ")"), mailHeaderText));
  40.   }
  41.  
  42.   public void assertMails(String... mailHeaderText){
  43.           for(String text : mailHeaderText)
  44.               assertThat(driver, textToBePresentInElementLocated(byCss("[role='main'] .zA"), text));
  45.   }
  46.  
  47.   /*
  48.     а в этих 2-ух проверках - мы оперируем списком мейлов
  49.     и вот как раз этот элемент - будем реализовывать как FindBy
  50.  
  51.     посмотри на это же задание, реализованное в Selenide
  52.     там мы использовали пейджи-модули
  53.  
  54.     тут тоже будем использовать пейджи
  55.     но только - объекты
  56.     т к нам в конструктор пейджа - нужно передать вебдрайвер
  57.  
  58.     будем создавать пейджи
  59.     GmailPage gmail = new GmailPage(driver);
  60.  
  61.     и соответственно - благодяря этому - в методах пейджей тебе будет откуда брать вебдрайвер
  62.  
  63.     пересмотри первые видео по селениуму
  64.     обрати внимание - как создавать пейдж - если он  содержит FindBy элементы
  65.  
  66.     для списка мейлов - создай такой элемент
  67.     это тоже в видео есть
  68.         почитать про лейзи прокси
  69.         https://github.com/SeleniumHQ/selenium/wiki/PageFactory
  70.         http://joxi.ru/KAxzGoyu4NGlNm
  71.         http://selenium2advanced.blogspot.com/2013/08/working-with-page-factory-and-webdriver.html
  72.    
  73.    
  74.     кроме того - нам понадобятся 2 новых кондишена
  75.         1 - nthElementHasText - для проверки - такой-то элемент списка содержит такой-то текст
  76.         2 - texts - для проверки -
  77.             элементов в списке = столько же, сколько нам передали текстов
  78.             текст такого-то элемента списка содержит такой-то переданный текст
  79.             (сравниваем попарно - нулевой - с нулевым, первый  - с первым и т д)
  80.  
  81.  
  82.     уже мы писали кондишены, правда попроще
  83.         теперь - усложним задачку
  84.  
  85.         но сначала давай обговорим тип первого параметра
  86.         мы пишем кондишен для лейзи прокси List<WebElement> elements
  87.         (раз список мейлов аннотирован как  FindBy)
  88.  
  89.     для texts - можно заглянуть в реализацию селенидовского кондишена - чтобы использовать
  90.         идеи из логики проверки
  91.    
  92.         давай сначала разберемся с типом кондишена, который будем реализовывать
  93.         можно реализовать ExpectedCondition<Boolean>
  94.         тогда в случае успеха - assertThat - вернет True
  95.         в случае не успеха - тест упадет (как ему и положено)
  96.         а метод apply кондишена - будет возвращать
  97.         True - если проверка пройдена
  98.         False - если она не пройдена
  99.    
  100.         мы можем больше пользы извлечь из ситуации, если такой кондишен будет типа
  101.         ExpectedCondition<List<WebElement>>
  102.         тогда в случае успеха - assertThat вернет List<WebElement>
  103.         и можно будет писать что-то такое - assertThat(sizeOf(elementsList,10)).get(9).click();
  104.         (это если кондишен sizeOf был бы реализован с первым параметром - List<WebElement>)
  105.         а метод apply кондишена - будет возвращать
  106.             List<WebElement> - тот же лейзи прокси список, который получил на входе - если проверка пройдена
  107.             null - если она не пройдена
  108.    
  109.         так
  110.         с типом кондишена определились
  111.         нужен кондишен ExpectedCondition<List<WebElement>>
  112.    
  113.         теперь с параметрами
  114.         проверяем  - лейзи прокси список веб элементов - List<WebElement> elements
  115.         что проверяем у этого списка - текстЫ = String... expectedTexts
  116.    
  117.         Загляни в  селениумский класс ExpectedConditions
  118.         (в коде - зажав ctrl + кликнув на имя любого стандартного селениумского кондишена)
  119.         там можно почерпнуть ряд идей
  120.    
  121.         теперь - давай вспомним - что есть лейзи прокси список вебэлементов
  122.         нам не надо заботиться о том, чтобы он переискался - он это делает самостоятельно
  123.         а нам - в apply кондишена - надо принять решение - в ЭТОМ состоянии - список удовлетворяет условию или нет
  124.         а ЭТО состояние - предполагает - что  оно на протяжении анализа - не меняется)
  125.    
  126.         т е задача номер один = зафиксировать = ЭТО состояние
  127.         используй список строк для того, чтобы сохранить в нем тексты всех элементов нашего лейзи-прокси списка
  128.    
  129.         получили список актуальных текстов
  130.    
  131.         теперь - работаем только с ним - это и есть ЭТО состояние )
  132.         сравни размер списка актуальных текстов и количество переданных ожидаемых текстов
  133.         если количество не равное - уже проверка не прошла
  134.    
  135.         если количество равное - сравнивай тексты
  136.             нулевого актуального текста - с нулевым ожидаемым,
  137.             первого - с первым и т д
  138.             если какой-либо актуальный текст не содержит ожидаемого текста - проверка не прошла
  139.             если тексты всех элементов прошли проверку - вот только в этом случае проверка прошла
  140.    
  141.          вспомни - зачем реализовывали метод toString у кондишена
  142.              когда проверка не проходит - эта информация выводится в описании ошибки
  143.              потому - тут мы должны описать - и актуальное (ЭТО состоняние - которое мы зафиксировали в списке строк)
  144.              и ожидаемое состояние (переданные в кондишен ожидаемые тексты)
  145.    
  146.         тестируй написанный кондишен - используя
  147.              проверку, которая должна пройти (она должна пройти)
  148.              проверку, которая не должна пройти (она не должна пройти + сообщение об ошибке должно быть понятным)
  149.    
  150.     Аналогично рассуждая - реализуй и кондишен nthElementHasText
  151.    
  152.     примени разработанные кондишены в методах
  153.     и проверь их в ситуациях, когда проверка должна падать -
  154.         проверка должна упасть
  155.         сообщение об ошибке должно быть точным и внятным
  156.   */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement