Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static <T> T assertThat(WebDriver driver, ExpectedCondition<T> condition)
- /*
- Тут согласно conventions - надо использовать имя дженерик-типа - V
- http://stackoverflow.com/questions/6008241/java-generics-e-and-t-what-is-the-difference
- когда типизируешь generic-типом класс - то T (T is meant to be a Type)
- а когда речь идет о типизации значения, возвращаемого методом - V (V is Value (as a return value or mapped value))
- Метод реализован ОК
- Только давай немного разовьем функциональность
- реализуй
- public static <T> T assertThat(WebDriver driver, ExpectedCondition<T> condition, int timeout)
- чтоб явно задавать таймаут - с помошью параметра
- и затем - реализуй
- public static <T> T assertThat(WebDriver driver, ExpectedCondition<T> condition)
- в котором вызовешь предыдущий assertThat и в качестве параметра укажешь Configuration.timeout
- так ты получишь более гибкий функционал
- бывает - что практически для всех проверок нужен один таймаут, а вот для небольшого количества проверок -
- нужен таймаут побольше
- 2 таких метода полностью закроют проблему
- */
- ************************
- public static WebElement $(WebDriver driver, WebElement proxyElement) {
- /*
- тут - также вызывай разработанный assertThat
- код станет проще
- visibilityOf(proxyElement) - это то, что передащь в качестве значения кондишена
- */
- *******************************
- public static ExpectedCondition<WebElement> nthProxyElementHasText(final List<WebElement> elements
- , final int index
- , final String expectedText) {
- .....
- public String toString() {
- return String.format(.....
- , elements.get(index).getText());
- /*
- с прокси-списками какая история (с прокси-элементами - тоже)
- при каждом обращении к ним - они переискиваются
- и когда ты получаешь в toString() - elements.get(index).getText()) -
- ты можешь получить уже что-то новое
- т е - выводы ты делал опираясь на одно значение, а описал - другое
- вряд ли такое соообщение в случае ошибки - поможет разобраться - что ж там было
- а кроме того - у тебя и тут может возникнуть IndexOfBoundsException - ведь никто не гарантирует
- что для elements.get(index).getText() - достаточно элементов в списке
- потому
- - объяви на уровне класса - переменную String actualText
- - в apply - инициализируй ее значением elements.get(index).getText()
- - в apply - делай выводы на основании значения actualText
- - в toString - выводи actualText
- так ты добъешься ситуации
- когда и выводы и сообщение - базируются на одних данных
- и в toString - уже не будет никаких новых вычислений и/или сложной логики, что тоже важно
- toString должен быть максимально простым
- это касается любого кондишена
- */
- ************************************************
- public static ExpectedCondition<List<WebElement>> texts(final List<WebElement> elements, final String... texts) {
- return new ExpectedCondition<List<WebElement>>(){
- final List<String> proxyTexts = new ArrayList<String>();
- /*
- actualTexts - в данном случае более точное название
- тексты элементов - все же не прокси)
- при обращении к текстам - тексты не будут переискиваться )
- */
- final List<WebElement> returnedProxyElements = new ArrayList<WebElement>();
- /*
- а это тебе вообще не нужно
- в случае успеха - вернем elements = список, который получили в качестве параметра
- */
- public List<WebElement> apply(WebDriver webDriver) {
- for (WebElement proxyElement : elements) {
- proxyTexts.add(proxyElement.getText());
- }
- /*
- вспомни схему вызова кондишена в wait.until
- apply одного кондишена может вызываться многократно
- и получишь - что список proxyTexts при каждом вызове apply
- все пополняется и пополняется
- очищай список proxyTexts перед циклом
- тебе каждый apply = нужен новый вариант текстов списка веб элементов
- */
- for (int i = 0; i < proxyTexts.size(); i++) {
- if (proxyTexts.get(i).contains(texts[i])) {
- returnedProxyElements.add(elements.get(i));
- }
- /*
- тут проще применить такую логику
- если не содержит
- значит вернем нулл - т к уже не выполнили уловие
- */
- }
- return elements.size() == returnedProxyElements.size() ? returnedProxyElements : null;
- /*
- не то сравниваешь
- размеры не тех сущностей
- нужно сравнить proxyTexts и texts
- proxyTexts - уже отражает фактический размер списка на момент сравнения
- elements.size() - мы можем опять что-то новое получить, у нас же список переискивается
- на протяжении работы apply - правильно оперировать одним состоянием списка
- вот мы зафиксировали это состояние - получили proxyTexts
- и дальше его анализируем
- сравнение размеров списка - грамотнее сделать до цикла for (int i = 0; i < proxyTexts.size(); i++)
- если размеры не совпадают - нету смысла делать сравнение текстов -
- да и в случае несовпадения размеров - при таком цикле есть вероятность получить IndexOfBoundsException
- а переставив проверку размера выше цикла for (int i = 0; i < proxyTexts.size(); i++)
- ты уйдешь от такой проблемы
- если размеры не совпадают (размеры proxyTexts и texts) - то просто верни нулл
- а после цикла - если мы добрались до этой строки - значит проверки на каждой итерации цикла выполнены успешно
- значит в целом проверка выполнена успешно
- значит можно вернуть elements
- */
- }
- public String toString(){
- // TODO: 03.01.2017
- return String.format("");
- }
- /*
- что проверяем
- для чего проверяем
- ожидаемый результат
- фактический результат
- Texts of list elements .....
- should contain .....
- while actual texts ....
- обязательно проверь - в режиме - когда проверка будет падать
- чтобы сообщение об ошибке было корректным и наглядным
- */
- *******************************
- public class Configuration {
- public static int timeout = 10;
- }
- /*
- Правильнее значение по умолчанию устанавливать таким
- которого хватает как правило
- предлагала тебе 4 секунды - кк у Selenide сделать
- а уже в самом тест-классе - установи таймаут в нужное тебе значение
- посмотри на свое Selenide
- */
- ***************************************
- public class GmailTest {
- ...
- private static WebDriver driver = new FirefoxDriver();
- ...
- @AfterClass
- public void tearDown() {
- driver.quit();
- }
- }
- /*
- вместо того чтоб решить вопрос с предком тест-класса - ты от него избавился)
- я не про это писала)
- еще раз перечитай http://pastebin.com/q4zuVus2
- строки 148-160
- подсказываю - как выкрутиться - чтобы не было описанной в http://pastebin.com/q4zuVus2 проблемы
- в предке тест-класса
- - объяви статическую переменную driver
- - инициализируй ее в BeforeClass - создавай веб-драйвер
- - закрывай вебдрайвер - в @AfterClass
- */
- *******************
- public void send(String emailAddress, String subjectOfLetter) {
- $(driver, compose).click();
- $(driver, to).sendKeys(emailAddress);
- subject.sendKeys(subjectOfLetter);
- send.click();
- }
- /*
- не рискуй
- ко всем элементам через $(driver, ...) обращайся
- надежность теста будет повыше
- */
- *************************
- assertThat(driver, nthProxyElementHasText(page.emails, 0, subject));
- assertThat(driver, texts(page.emails, subject));
- /*
- реализуй в пейдже методы для этих проверок
- подсмотри у себя же - как они в селеидовской версии этой работы назывались
- чтоб уже с неймингом не ходить кругами
- */
Advertisement
Add Comment
Please, Sign In to add comment