Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class Configuration {
- public static final long TIMEOUT = 10;
- }
- /*
- тут нам final-переменная не подходит)
- мы инициализируем таймаут по умолчанию - неким значением, которое подходит зачастую
- (в Selenide это было 4 с)
- и при необходимости - будем в тест-классе - менять это значение
- вспомни - как работа с таймаутом была реализована в селенидовской версии
- */
- *********************************************************
- public static ExpectedCondition<Boolean> listNthElementHasText(final List<WebElement> elements, final int index, final String expectedText){
- /*
- реализовывая кондишен как ExpectedCondition<Boolean> - мы не получим эффекта
- когда assertThat для этого кондишена вернет нам, например
- вебэлемент, который прошел проверку
- для теста gmail - вопрос не принципиальный - мы не используем результат assertThat для этого кондишена
- но вообще - учитывай такие моменты
- сейчас - на твое усмотрение - менять или не менять тип кондишена
- */
- return new ExpectedCondition<Boolean>() {
- private int listSize;
- /*
- мы этой переменной не пользуемся нигде
- кроме метода apply
- потому - и объявлять ее стоит там же
- */
- private String elementText;
- public Boolean apply(WebDriver driver) {
- listSize = elements.size();
- if (listSize >= index+1){
- /*
- можно обойтись и без if
- у нас уже есть секция try-catch
- тут можно ловить и исключение IndexOutOfRangeException
- оно возникает - когда мы получаем элемент списка по индексу за его границами
- т е - просто в try-catch
- вызываем elements.get(index)
- и ловим и исключение IndexOutOfRangeException
- про try-catch - еще отдельно напишу
- тут есть что еще упростить)
- чтобы в одной секции catch ловить несколько исключений
- http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html
- http://stackoverflow.com/questions/3495926/can-i-catch-multiple-java-exceptions-in-the-same-catch-clause
- */
- try {
- elementText = elements.get(index).getText();
- return Boolean.valueOf(elementText.contains(expectedText));
- } catch (StaleElementReferenceException var3) {
- return false;
- }
- } else return false;
- /*
- когда уйдет if - и этот код уйдет
- по конвеншенсам - применять фигурные скобки нужно
- https://google.github.io/styleguide/javaguide.html#s4.1.1-braces-always-used
- */
- }
- public String toString(){
- return String.format(index + " element in list " + Arrays.toString(elements.toArray()) + " should have text: " + expectedText + ". While actual text is " + elementText);
- }
- /*
- вызови проверку для этого кондишена - которая заведомо не пройдет
- и посмотри на текст об ошибке
- полезная ли информация Arrays.toString(elements.toArray())?
- будет ли полезной вот такая информация - elements.toString?
- нужно ли в сообщении об ошибке использовать переходы на другую строку?
- удобно ли читать сообщение?
- */
- };
- }
- **********************************************************
- public static ExpectedCondition<List<WebElement>> textsOf(final List<WebElement> elementList, final String... expectedTexts){
- return new ExpectedCondition<List<WebElement>>(){
- private int listSize;
- /*
- и в этом случае - нету смысла выносить переменную listSize на уровень класса
- мы это используем только в методе apply - значит там єто и обїявлять стоит
- */
- private List<String> actualTexts = new ArrayList<String>();
- public List<WebElement> apply(WebDriver driver) {
- listSize = elementList.size();
- /*
- не советую вот тут получать размер списка
- elementList - лейзи прокси список
- и он переискивается - когда мы к нему обращаемся
- очень может быть - что когда мы соберем actualTexts
- элементов будет уже больше )
- и по сообщению об ошибке - будет сложно что-либо понять)
- лучше - собрать actualTexts
- и уже анализировать только это
- и в toString оперировать этим же
- так получится корректнее)
- да и в таком варианте - не понадобится переменная listSize
- после того, как соберешь массив строк - можно будет сравнить
- размер этого массива и количество ожидаемых текстов
- */
- for (WebElement element : elementList) {
- actualTexts.add(element.getText());
- }
- /*
- инициализировали мы массив actualTexts - когда объявили эту переменную
- и тут, в apply - лишь добавляем в масиив данные
- вспомни видео - где рассказываелось - как работает new WebDriverWait(...).until(...)
- в рамках ждущей проверки - apply может быть вызван несколько раз
- и мы будем только пополнять actualTexts
- получится ерунда)
- до цикла - нужно очищать actualTexts
- */
- if (listSize != expectedTexts.length) {
- return null;
- }
- for (int i = 0; i < expectedTexts.length; i++) {
- String expectedText = expectedTexts[i];
- if (!actualTexts.get(i).contains(expectedText)) {
- /*
- вполне ок будет и в одну строчку
- if (!actualTexts.get(i).contains(expectedTexts[i]))
- заодно и от переменной лишней избавишься)
- */
- return null;
- }
- }
- return elementList;
- }
- @Override
- public String toString() {
- return "Texts in elements is: "
- + Arrays.toString(actualTexts.toArray())
- + " Expected: " + Arrays.toString(expectedTexts);
- }
- /*
- ага, тут ты уже ничего не выводила про список вебэлементов)
- реши этот вопрос - после эксперимента с прошлым кондишеном -
- как это лучше выводить и выводить ли
- ну и стоит придерживаться одной схемы вывода информации
- что проверяем + где проверяем
- ожидания
- факты
- например - так)
- в итоге - будет легче ситать информацию
- и тут встрой в сообщение - переходы на новые строки - для более легкого чтения сообщения
- */
- };
- }
- ************************************************
- https://docs.google.com/document/d/1BiYTLdypDfucSqiY9isv1HCKKQIxelzqYrN-3Ku1RWM/edit?usp=sharing
- /*
- почитай и примени кетчер - во всех разработанных кондишенах
- тип параметра кетчера можно упростить до ExpectedCondition<V> - как мы это сделали для assertThat
- не забудь ловить и IndexOfBoundsException )
- */
- *********************************************
- public void assertNthMail(int index, String mailText){
- assertThat(listNthElementHasText(mails, index, mailText), 10);
- }
- /*
- тут нам вполне подошел бы вариант assertThat
- который оперирует Configuration.timeout
- кстати, советую писать в коде полностью - Configuration.timeout
- а не timeout
- цель - заострить внимание - что это за переменная
- */
Advertisement
Add Comment
Please, Sign In to add comment