julia_v_iluhina

Untitled

Nov 4th, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.40 KB | None | 0 0
  1.         <dependency>
  2.             <groupId>ru.yandex.qatools.allure</groupId>
  3.             <artifactId>allure-junit-adaptor</artifactId>
  4.             <version>${allure.version}</version>
  5.         </dependency>
  6. /*
  7.     это в pom - уже не нужно
  8.     ведь аллюр в проекте не импользуешь
  9. */
  10. **********************
  11. public class GoogleSearch {
  12. /*
  13.     на самом деле - можно было пейдж не создавать
  14.  
  15.     т к в задании
  16.      You will do only a smoke coverage and you most probably will not reuse "steps" in other tests.
  17.      (Or you don't know will you reuse or not)
  18. */
  19. ***********************
  20.     public static ElementsCollection links = ...;
  21.     /*
  22.         селектор верный
  23.         но имя переменной - не точное
  24.         это результаты поиска
  25.         да, они содержат линки, но ведь не только линки
  26.  
  27.         results - было бы точнее
  28.     */
  29. *******************************
  30.     public static void navigateToGoogle() {
  31.     /*
  32.         сравни
  33.         navigateToGoogle()
  34.         и
  35.         visit()
  36.  
  37.         поскольку вариантов урлов у нас немного - visit() был бы ок
  38.  
  39.         не настаиваю )
  40.     */
  41. ******************************************
  42.     public static void search(String query) {
  43.         $("...").setValue(query).submit();
  44.     }
  45. /*
  46.     насчет селектора
  47.     можно нагляднее
  48.     обрати внимание на name этого же элемента
  49.     у очень многих продуктов google строка поиска именно такое имя имеет
  50.     от слова query
  51.     http://joxi.ru/823k1x0U6oavV2
  52.  
  53.     имя параметра я бы уточнила до queryText
  54.     не настаиваю)
  55.     просто query у меня ассоциируется с чем-то более техническим
  56.     возможно, это субъективно
  57.  
  58.     насчет submit()
  59.         возможно, ты и так в курсе
  60.         submit() для элемента сработает - только если этот элемент находится внутри элемента form
  61.         и внутри него элемент для submit - задан
  62.  
  63.         https://www.quora.com/What-is-the-difference-between-click-and-submit-in-webdriver
  64.         http://joxi.ru/Vm6QqxphxORZpr
  65.         http://joxi.ru/gmvqJvkHx7dYbr
  66.  
  67.     в данном случае - submit() применим
  68.  
  69. */
  70. *****************************************************
  71.     public static void clickLink(String linkText) {
  72.  
  73.         for (SelenideElement link : links) {
  74.  
  75.             if (link.has(text(linkText))) {
  76.                 link.$("h3>a").click();
  77.                 break;
  78.             }
  79.         }
  80.         $("#promo").should(exist);
  81.     }
  82. /*
  83.     тут сразу много всего
  84.     первое - я бы назвала метод followLink
  85.     больше отражает суть процесса
  86.  
  87.     второй момент
  88.     в задании
  89.     follow the link in 1st result
  90.  
  91.         т е - нужно кликнуть на главной линке первого результата
  92.         а у тебя - идет выбор линки по ее тексту
  93.  
  94.         "h3>a" - хорошее уточнение
  95.         нам нужно
  96.             из списка результатов
  97.             получить самый первый элемент
  98.             в нем - получить главную линку ("h3>a")
  99.             и на ней - кликнуть
  100.  
  101.         верно то, что ты оттолкнулся от переменной для результатов
  102.         и верно, что уточнился до главной линки
  103.  
  104.         у коллекции элементов есть метод get
  105.         он позволяет получить элемент коллекции по его индексу
  106.         как и во всех джава-коллекциях - нумерация с нуля
  107.  
  108.     даже если бы тебе нужно было кликнуть на результате с таким-то текстом
  109.     то никаких циклов для этого - не понадобилось бы
  110.     links.findBy(text(linkText)).$("h3>a").click(); - так точнее, проще и надежнее
  111.  
  112.         наряду с кондишеном exactText есть еще и text - он проверяет, что в тексте єлемента содержится ожидаемый текст
  113.         собственно, ты его тоже в коде использовал)
  114.         только у кода есть недостатки
  115.  
  116.         для вот так полученного элемента - links.findBy(text(linkText)).$("h3>a")
  117.         при клике на нем, или каком-то другом действии на UI - будет выполнено ожидание элемента
  118.         в рамках таймаута
  119.  
  120.         а в реализации SelenideElement link : links - не факт, что на начало такого перебора
  121.         весь список результатов уже загрузился
  122.         допустим, ты можешь возразить - что ранее по коду мы проверили размер списка
  123.         это конечно да)
  124.         тут - соломки мы настелили
  125.         но - получается, что надежность работы метода зависит от контекста его вызова
  126.         что не очень хорошо
  127.  
  128.         link.has(text(linkText)) - has & is - не ждущие методы
  129.         мы проверили, если на момент проверки текст элемента содержит нужный нам текст
  130.         вполне возможно, миллисекундами позже - в том же элементе текст подгрузится
  131.         и такая проверка бы прошла
  132.         а так - мы просто проскакали мимо нужного - только потому - что нужное вовремя не догрузилось
  133.  
  134.         всех этих недостатков лишен вариант
  135.         links.findBy(text(linkText)).$("h3>a").click();
  136.  
  137.         и еще - он более KISS
  138.         никаких циклов и условий
  139.         (они-то конечно есть, но "под капотом", under the hood - про это подробно будет во второй части курса)
  140.  
  141.  
  142.     и последнее
  143.     вот эта проверка
  144.     $("#promo").should(exist);
  145.     она не относится к логике перехода по нужной нам линке
  146.     да и вообще - наш метод позволит кликнуть на совершенно разных линках
  147.     и далеко не факт - что там будет такой элемент - $("#promo")
  148.         во-первых, проверка
  149.         $("#promo").should(exist); - не универсальна, потому в универсальном методе ей не место
  150.  
  151.         во-вторых
  152.         такая проверка не имеет никакого отношения к логике действия - перехода на нужный урл
  153.  
  154.         в-третьих
  155.         такая проверка к пейджу GoogleSearch не имеет никакого отношения
  156.         ведь речь уже про другую веб страницу
  157.  
  158.         в-четрвертых
  159.         не стоит прятать в методах-действиях - проверки
  160.         и в методах-проверках - действия
  161.         да, есть исключения
  162.         мы видели их на курсе
  163.             когда, например, мы покрывали проверку - что кнопка clear completed стала невидимой
  164.             после выполнения этого действия (было в Якова видео про это)
  165.             мы так смогли сделать только потому, что для тест-метода - такая проверка - лишние подробности
  166.             а нам - практически ничего не стоило покрыть это просто по пути - для улусшения покрытия
  167.  
  168.             и еще был пример - проверки для обеспечения надежности предварительных действий
  169.             http://pastebin.com/DcnD6CZe строки 116-135
  170.         в общем случае - проверки - отдельно и действия-отдельно
  171.         и то, и то - должно быть отражено в тест-методе
  172.         и то, и то - часть тестовой логики
  173.  
  174.         ну и последнее)
  175.         $("#promo").should(exist); - не самый наглядный вариант
  176.         сравни
  177.         $("#mainContent>h2").shouldHave(text("What is Selenium?"));
  178.         такая строчка нагляднее нам покажет - что ждали мы какого-то элемента на новой странице
  179.         той, которая про селениум
  180.  
  181.         резюме
  182.         замени  $("#promo").should(exist); на более наглядный вариант
  183.         и вынеси эту строчку прямо в тест-метод
  184. */
  185. *************************
  186.     public static void assertAnswers(int count) {
  187. /*
  188.     тут стоило быть поточнее в имени метода
  189.     уже решили, что список результатов = results
  190.  
  191.     assertResultsCount - точнее
  192.     и мы используем для одного понятия - один термин
  193.  
  194.     что дает нам больше однозначности
  195. */
  196. **********************************
  197.     public static void assertUrl(String url) {
  198.         assertTrue(url().equals(url));
  199.     }
  200. /*
  201.     этот метод к пейджу GoogleSearch не имеет никакого отношения
  202.     да, некий универсальный метод
  203.     если считаешь нужным - для таких универсальных методов создавай класс-контейнер
  204.     и располагай в нем статические универсальные методы
  205.  
  206.     но - см начало ревью про то - что еще неизвестно, будем ли переиспользовать шаги
  207.     и второе - сравни
  208.     assertTrue(url().equals("http://docs.seleniumhq.org/"));
  209.     и
  210.     assertUrl("http://docs.seleniumhq.org/")
  211.  
  212.     код - не намного сложнее
  213.     я бы в таких обстоятельствах не стала создавать метод assertUrl
  214.  
  215.     и еще
  216.     использование assertEquals - в случае ошибки - даст более понятное сообщение об ошибке
  217.     поэкспериментируй)
  218. */
  219. *************************
  220.  
  221. /**
  222.  Automate:
  223.  1 visit http://google.com/ncr
  224.  2 search: “Selenium automates browsers”
  225.  3 check that 10 results are found
  226.  4 check the text “Selenium automates browsers” in 1st result
  227.  5 follow the link in 1st result
  228.  6 check that selenium official page is loaded
  229.  */
  230. public class GoogleE2ETest {
  231. /*
  232.    на уровень тест-класса - не надо выносить информацию о E2E
  233.    если хочется подчеркнуть, что в этом классе будут лишь e2e сценарии для интеграционного тестирования
  234.    так надо тогда что-то про Integration  написать
  235.      
  236.    поскольку это один тест-класс
  237.    то GoogleSearchTest - достаточно точно и лаконично
  238. */
  239.     @Test
  240.     public void testGoogleSearch(){
  241.     /*
  242.         а тут уже можно про Google не повторяться
  243.         в принципе - тут отлично будет и просто перечислить - что мы тестим
  244.         testSearchAndFollowLink
  245.        
  246.         ну или другие идеи в разделе про naming - в faq посмотри)
  247.     */
  248.  
  249.         navigateToGoogle();
  250.  
  251.         search("Selenium automates browsers");
  252.         assertAnswers(10);
  253.  
  254.         clickLink("Selenium automates browsers");
  255.         /*
  256.             до клика - проверь check the text “Selenium automates browsers” in 1st result
  257.             подумай, как такой метод-проверку сделать поуниверсальнее
  258.            
  259.             про то - как реализовать
  260.             5 follow the link in 1st result
  261.             писала выше
  262.         */
  263.         assertUrl("http://docs.seleniumhq.org/");
  264.     }
  265. }
Advertisement
Add Comment
Please, Sign In to add comment