julia_v_iluhina

Untitled

Aug 29th, 2016
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.75 KB | None | 0 0
  1. /*
  2.     переходи уже на селениум 2.53.1 )
  3.     с фф 46.0.1 все ок работает
  4. */
  5. ***********************************
  6. public class Configuration {
  7.     public static long timeout = 15;
  8. }
  9. /*
  10.     по умолчанию оставляй 4 секунды (не зря в Selenide именно такое значение - как правило - его хватает)
  11.     заметь - тут - в отличие от Selenide - меряем в секундах
  12.  
  13.     посмотри на описание параметров конструктора WebDriverWait
  14.     new WebDriverWait(getWebDriver(), timeout)
  15.     зажав секд наведи курсор мыши на WebDriverWait и почитай во всплывающей подсказке
  16.     что за сигнатура у конструктора
  17.     увидишь - что ждем число секунд
  18. */
  19. ***************************************
  20.     @BeforeClass
  21.     public static void timeout() {
  22.         Configuration.timeout = 20000;
  23.     }
  24. /*
  25.     потому и тут - тоже должны быть секунды
  26.     20 секунд достаточно)
  27. */
  28. ********************************************
  29. /*
  30.     в прошлом ревью писала тебе - строки 141-150
  31.  
  32.     убивай класс ByText
  33.     и просто возвращай
  34.     By.xpath(".//*/text()[normalize-space(.) = " + Quotes.escape(elementText) + "]/parent::*");
  35.  
  36.    если приведенная выше метаморфоза - не понятна - спроси
  37.    фактически - вынесла преобразование из ByText
  38.  
  39.    тут никаких профитов от класса ByText - не будет
  40. */
  41. *********************************************
  42. public static By byTitle(String title)
  43. /*
  44.    тут интереснее)
  45.    да, ты верно перенесла код из selenide)
  46.  
  47.    код из byAttribute (а именно этот код мы и вызываем в byTitle)
  48.    подразумевает проверку атрибута на равенство
  49.  
  50.    http://joxi.ru/YmEnRaLFZR6BQ2
  51.    у меня к примеру - 88 непрочитанных писем)
  52.    и текст атрибута - не Inbox, а Inbox(88)
  53.  
  54.    странно, что раньше это не вылезло)
  55.    как вариант - в Selenide мы проскакивали мимо такой ошибки
  56.    из-за того что в инбоксе были все письма прочитанные?
  57.  
  58.    предлагаю
  59.        переименовать метод byAttribute - в byAttributeExactText (именно это он и делает)
  60.  
  61.        реализовать метод byAttributeText - который будет искать текст по вхождению в значение атрибута
  62.        полезный материал по xpath
  63.        https://drive.google.com/file/d/0B2UFaKOpHq_MdXF4OUhPODVETUU/view?usp=sharing
  64.        вот этот вариант тебе нужен - http://joxi.ru/vAW36KgskdElbA
  65.        отладь этот xpath в FireFinder или FirePath
  66.  
  67.    а после этого реализовать
  68.        byTitle  - по вхождению (используя byAttributeText)
  69.        byExactTitle - по равенству (используя byAttributeExactText)
  70.  
  71.    и вот  - тебе - подойдет именно byTitle  - в такой реализации (когда по вхождению в title ищется элемент)
  72.  
  73. */
  74. ************************************************
  75. /*
  76.    тем не менее, есть вопрос - почему же не подошел вариант с byText )
  77.    это пишу - просто для того, чтоб ты сама такое могла распутывать
  78.  
  79.    вариант 1
  80.        на этот вопрос - можно получить ответ в отладке)
  81.        http://joxi.ru/E2pdR1lFB3exM2
  82.  
  83.        вот мы узнали подробности о найденном элементе
  84.        класс у него - av
  85.  
  86.        а потом - сходили и сами посмотрели - что это за зверь
  87.        http://joxi.ru/krDOZldF0D537A
  88.  
  89.    вариант 2
  90.         что у тебя находится по byText - кстати тоже можно проверить
  91.         http://joxi.ru/Q2KpJYOs9BaWXA (тут, кстати FirePath оказался лучшим инструментом)
  92.  
  93.    нам точно нужны не они)
  94.    так что - по title будеи искать)
  95.  
  96.    то же касается и других вариантов, фактически сводящихся к определению элемента по xPath
  97.    берешь xPath выражение из метода и отлаживаешься
  98. */
  99. **************************************************
  100. public void switchToInbox() {
  101. ...
  102.        assertThat(urlMatches("https://mail.google.com/mail/u/0/#inbox"));
  103.  }
  104. /*
  105.     эта проверка уже не нужна)
  106.     ты проконтролировала переход на Inbox
  107.  
  108.     прибивай ее
  109. */
  110.  
  111. **************************************************
  112.  
  113. public class BaseTest extends ConciseAPI {
  114.  
  115.  ....
  116.     public WebDriverWait wait = new WebDriverWait(driver, 4);
  117.  ....
  118. /*
  119.     вот это - уже не нужно
  120.     т к у тебя есть assertThat - этой переменной wait уже не пользуешься
  121.     убивай)
  122. */
  123. ********************************************************
  124. http://joxi.ru/eAO7pYkt4BndgA
  125. /*
  126.     для порядку перенеси пекедж pages в src/main
  127. */
  128. ****************************************************
  129. public class GmailTest extends BaseTest {
  130.  
  131.     String subject = "my new mail " + new Date().toString();
  132.     /*
  133.         эта переменная - нужна только для тест-метода testLoginSendAndSearchMail()
  134.         фактически - это тестовые данные для метода testLoginSendAndSearchMail()
  135.         и ничто не предвещает - что это в других тест-методах этого класса
  136.         будет востребовано
  137.         потому - перенеси объявление и инициализацию переменной внутрь метода testLoginSendAndSearchMail()
  138.     */
  139. ...
  140.     @Test
  141.     public void testLoginSendAndSearchMail() {
  142.  
  143.         GmailPage page = new GmailPage(driver);
  144.     /*
  145.         А вот с page - ситуация обратная
  146.         page - может пригодиться и в других тест-методах класса
  147.         это инструмент для тест-класса, а не конкретного тест-метода
  148.  
  149.         разумно объявить page - как переменную класса
  150.             если объявишь как статическую - инициализируй в @BeforeClass тест-класса
  151.             в @BeforeClass предка - создали вебдрайвер
  152.             @BeforeClass потомка - вызовется позже и нормально инициализируем page
  153.  
  154.             если объявишь как не статическую - можно инициализировать при объявлении
  155.             т к на момент выполнения этого кода уже вебдрайвер будет создан
  156.  
  157.     */
  158. ***********************************************************************
  159.  
  160.     public void assertMail(String text) {
  161.         listNthElementHasText(mails, 0, text);
  162.     }
  163.  
  164.     public void assertMails(String... texts) {
  165.         textsOf(mails, texts);
  166.     }
  167. /*
  168.     еще раз почитай в прошлом ревью строки 262 - 292
  169.  
  170.     вместо
  171.         listNthElementHasText(mails, 0, text)
  172.     нам нужен
  173.         assertThat(listNthElementHasText(mails, 0, text))
  174.  
  175.     вместо
  176.         textsOf(mails, texts)
  177.     нам нужен
  178.         assertThat(textsOf(mails, texts))
  179.  
  180.     т к - мы делаем проверки, а не просто хотим получить значение типа ExpectedCondition
  181.  
  182.     значение типа ExpectedCondition - это по сути - правило - как проверить, но не сама проверка
  183.  
  184.     сама проверка = new WebDriverWait(...).until(condition) = assertThat(condition)
  185.         new WebDriverWait(...).until = assertThat = что сделать
  186.         condition - как именно сделать
  187.  
  188.     мы тут просто получили - как нам это сделать
  189.     а делать - не стали)
  190.  
  191. */
  192. ********************************************
  193.  
  194. http://joxi.ru/p275M9zs0wp6Kr
  195.  
  196. /*
  197.     красивая ошибка)
  198.  
  199.     1 - если то-то
  200.     2 - то делать - тото (делать - точку с запятой)
  201.     3 - это в любом случае уже делаем
  202.  
  203.     не зря в стандартах гугла - фигурные скобки предписано использовать в обязательном порядке
  204.     https://google.github.io/styleguide/javaguide.html#s4.1.1-braces-always-used
  205.  
  206.     это еще не все)
  207.     пока не проверяй)
  208. */
  209. ***************************************
  210. http://joxi.ru/Vrwqg81HK6dYR2
  211.  
  212. /*
  213.     1 - давай применим elementExceptionsCatcher
  214.     цель - избавиться от try-catch в самом apply
  215.  
  216.     это нам надо для того, чтобы упростить логику apply, увидеть ее без лищней мишуры
  217.     научи elementExceptionsCatcher ловить и IndexOutOfBoundsException
  218.  
  219.     кстати - обрати внимание - как ты уже тут ловила несколько видов исключений в одной catch-секции
  220.     так можно и в кетчере это сделать)
  221.  
  222.     Ты задала очень правильный вопрос в слеке
  223.     если return elements.get(index); - список же может опять переискаться? и вылезет что-то другое... ((
  224.     ага... может)
  225.  
  226.     как выкручиваемся
  227.         2 - сохраняем актуальный текст нужного нам элемента в этой переменной
  228.         3 - сначала получаем сам элемент (он уже не переискивается - он не лейзи прокси)
  229.         4 - у него получаем текст
  230.         5 - сверяем полученный текст
  231.         6 - возвращаем элемент из пункта 3 (не заново ищем в списке, а возвращаем тот же, по которому делали выводы)
  232.         7 - в тексте ошибки оперируем только актуальным текстом, который мы получили в пункте 4 (заново не получаем)
  233.  
  234.     при таких раскладах - нам действительно не стоит получать все тексты
  235.     когда будем переписывать  - избавляться от лейзи прокси элементов
  236.     то сможешь получить тексты элементов и вывести их все в toString
  237.  
  238.     тут - с лейзи прокси - чтобы также реализовать - придется глубже в дебри залезть
  239.     не хочется)
  240.  
  241.     выводы
  242.         8 - возвращаем ровно тот же элемент, текст которого проверяли
  243.         9 - описываем проверенный в apply текст
  244. */
  245. ****************************************************************
  246.  
  247. http://joxi.ru/bmoWZzahMJ0q4m
  248.  
  249. /*
  250.     кетчер у нас теперь вот такой
  251.     1 - упростили параметр (помнишь - для вейт антила упрощали, тут - то же самое)
  252.     2 - одна catch-секция
  253. */
  254. *****************************************************************
  255. http://joxi.ru/ZrJX8Y3f14Zoz2
  256. /*
  257.     1-2-3 - этот кондишен делаем как ExpectedCondition<List<WebElement>>
  258.  
  259.     4 - переменную actualTexts объявляем внутри анонимного класса, а не просто в методе
  260.      причины - только внутри реализации кондишена actualTexts и нужна
  261.  
  262.     5 - actualTexts - всегда инициализируем вначале apply
  263.     причина - каждый вызов  apply - проверка заново
  264.     надооперировать свежими данными
  265.  
  266.     6 - у нас ExpectedCondition<List<WebElement>>
  267.     когда проверка прошла - в случае успеха мы возвращаем тот же лейзи-прокси список
  268.  
  269.     7 - когда проверка не прошла - возвращаем нулл
  270.  
  271.     8 - в toString() - используем тот же список текстов, что сохранили в actualTexts
  272.     apply - когда принимали решение - проверка прошла или нет
  273. */
  274. ************************************************
  275. /*
  276.     надеюсь, многое прояснилось)
  277.  
  278.     следующее задание - ты фактически его же реализовала
  279.  
  280.     в нем мы добавим - избавимся от лейзи прокси
  281.         это значит
  282.             кондишены - оперируют локатором By
  283.             при создании пейджа - не надо  PageFactory.initElements
  284.  
  285.     т е  - по большому счету - поработаещь плотненько с кондишенами)
  286.    
  287.     еще в этом же задании - проверь - как выводится сообщение - что проверка не прошла
  288.     достаточно задавать  в тест-методе в методах assertMail / assertMails - невыполнимые условия
  289.     исходи из обычного здравого смысла - как бы ты хотела видеть сообщение про ошибку
  290.     такие мелочи, как уместный переход на новую строку - сильно облегчит понимание
  291. */
Advertisement
Add Comment
Please, Sign In to add comment