Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static <V> V assertThat(WebDriver driver, ExpectedCondition<V> condition)
- /*
- все ок реализовал)
- хорошо)
- это был такой, не самый простой момент)
- давай еще реализуем более универсальный вариант
- <V> V assertThat(WebDriver driver, ExpectedCondition<V> condition, int timeout)
- и после этого - ты спожешь в assertThat(WebDriver driver, ExpectedCondition<V> condition)
- вызывать assertThat(WebDriver driver, ExpectedCondition<V> condition, int timeout)
- чтоб было DRY
- цель - зачем нам именно 2 таких метода
- допустим, в целом нам нужны таймауты в 10 секунд
- но есть пара тормозящих проверок - для которых даймаут нужен побольше
- мы устанавливаем Configuration.timeout - в 10 секунд
- а в тех тормозящих проверках -
- используем assertThat(WebDriver driver, ExpectedCondition<V> condition, int timeout)
- явно указывая бОльший таймаут
- удобно)
- */
- *********************
- public static WebElement $(WebDriver driver, String cssSelector){
- public static WebElement $(WebDriver driver, By elementLocator){
- /*
- с этими методами - тоже все отлично
- получается - если нам нужно поработать разово с каким-то элементом
- то лучше рецепта и нету - этот метод нам позволит аккуратно код написать
- что ты с успехом и сделал
- */
- ***********************************
- public void assertMail(int index, String mailHeaderText){
- assertThat(driver, textToBePresentInElementLocated(byCss("[role='main'] .zA:nth-child(" + index + 1 + ")"), mailHeaderText));
- }
- public void assertMails(String... mailHeaderText){
- for(String text : mailHeaderText)
- assertThat(driver, textToBePresentInElementLocated(byCss("[role='main'] .zA"), text));
- }
- /*
- а в этих 2-ух проверках - мы оперируем списком мейлов
- и вот как раз этот элемент - будем реализовывать как FindBy
- посмотри на это же задание, реализованное в Selenide
- там мы использовали пейджи-модули
- тут тоже будем использовать пейджи
- но только - объекты
- т к нам в конструктор пейджа - нужно передать вебдрайвер
- будем создавать пейджи
- GmailPage gmail = new GmailPage(driver);
- и соответственно - благодяря этому - в методах пейджей тебе будет откуда брать вебдрайвер
- пересмотри первые видео по селениуму
- обрати внимание - как создавать пейдж - если он содержит FindBy элементы
- для списка мейлов - создай такой элемент
- это тоже в видео есть
- почитать про лейзи прокси
- https://github.com/SeleniumHQ/selenium/wiki/PageFactory
- http://joxi.ru/KAxzGoyu4NGlNm
- http://selenium2advanced.blogspot.com/2013/08/working-with-page-factory-and-webdriver.html
- кроме того - нам понадобятся 2 новых кондишена
- 1 - nthElementHasText - для проверки - такой-то элемент списка содержит такой-то текст
- 2 - texts - для проверки -
- элементов в списке = столько же, сколько нам передали текстов
- текст такого-то элемента списка содержит такой-то переданный текст
- (сравниваем попарно - нулевой - с нулевым, первый - с первым и т д)
- уже мы писали кондишены, правда попроще
- теперь - усложним задачку
- но сначала давай обговорим тип первого параметра
- мы пишем кондишен для лейзи прокси List<WebElement> elements
- (раз список мейлов аннотирован как FindBy)
- для texts - можно заглянуть в реализацию селенидовского кондишена - чтобы использовать
- идеи из логики проверки
- давай сначала разберемся с типом кондишена, который будем реализовывать
- можно реализовать ExpectedCondition<Boolean>
- тогда в случае успеха - assertThat - вернет True
- в случае не успеха - тест упадет (как ему и положено)
- а метод apply кондишена - будет возвращать
- True - если проверка пройдена
- False - если она не пройдена
- мы можем больше пользы извлечь из ситуации, если такой кондишен будет типа
- ExpectedCondition<List<WebElement>>
- тогда в случае успеха - assertThat вернет List<WebElement>
- и можно будет писать что-то такое - assertThat(sizeOf(elementsList,10)).get(9).click();
- (это если кондишен sizeOf был бы реализован с первым параметром - List<WebElement>)
- а метод apply кондишена - будет возвращать
- List<WebElement> - тот же лейзи прокси список, который получил на входе - если проверка пройдена
- null - если она не пройдена
- так
- с типом кондишена определились
- нужен кондишен ExpectedCondition<List<WebElement>>
- теперь с параметрами
- проверяем - лейзи прокси список веб элементов - List<WebElement> elements
- что проверяем у этого списка - текстЫ = String... expectedTexts
- Загляни в селениумский класс ExpectedConditions
- (в коде - зажав ctrl + кликнув на имя любого стандартного селениумского кондишена)
- там можно почерпнуть ряд идей
- теперь - давай вспомним - что есть лейзи прокси список вебэлементов
- нам не надо заботиться о том, чтобы он переискался - он это делает самостоятельно
- а нам - в apply кондишена - надо принять решение - в ЭТОМ состоянии - список удовлетворяет условию или нет
- а ЭТО состояние - предполагает - что оно на протяжении анализа - не меняется)
- т е задача номер один = зафиксировать = ЭТО состояние
- используй список строк для того, чтобы сохранить в нем тексты всех элементов нашего лейзи-прокси списка
- получили список актуальных текстов
- теперь - работаем только с ним - это и есть ЭТО состояние )
- сравни размер списка актуальных текстов и количество переданных ожидаемых текстов
- если количество не равное - уже проверка не прошла
- если количество равное - сравнивай тексты
- нулевого актуального текста - с нулевым ожидаемым,
- первого - с первым и т д
- если какой-либо актуальный текст не содержит ожидаемого текста - проверка не прошла
- если тексты всех элементов прошли проверку - вот только в этом случае проверка прошла
- вспомни - зачем реализовывали метод toString у кондишена
- когда проверка не проходит - эта информация выводится в описании ошибки
- потому - тут мы должны описать - и актуальное (ЭТО состоняние - которое мы зафиксировали в списке строк)
- и ожидаемое состояние (переданные в кондишен ожидаемые тексты)
- тестируй написанный кондишен - используя
- проверку, которая должна пройти (она должна пройти)
- проверку, которая не должна пройти (она не должна пройти + сообщение об ошибке должно быть понятным)
- Аналогично рассуждая - реализуй и кондишен nthElementHasText
- примени разработанные кондишены в методах
- и проверь их в ситуациях, когда проверка должна падать -
- проверка должна упасть
- сообщение об ошибке должно быть точным и внятным
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement