julia_v_iluhina

Untitled

Nov 24th, 2016
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 30.47 KB | None | 0 0
  1. https://github.com/AleksanderPopov/automicianTask   http://pastebin.com/fqriA6GL
  2.     <build>
  3.         <plugins>
  4.             <plugin>
  5.                 <groupId>org.apache.maven.plugins</groupId>
  6.                 <artifactId>maven-compiler-plugin</artifactId>
  7.                 <configuration>
  8.                     <source>1.8</source>
  9.                     <target>1.8</target>
  10.                 </configuration>
  11.             </plugin>
  12.         </plugins>
  13.     </build>
  14.  
  15.     <dependencies>
  16.         <dependency>
  17.             <groupId>com.codeborne</groupId>
  18.             <artifactId>selenide</artifactId>
  19.             <version>4.0</version>
  20.         </dependency>
  21.         <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
  22.         <dependency>
  23.             <groupId>org.seleniumhq.selenium</groupId>
  24.             <artifactId>selenium-java</artifactId>
  25.             <version>3.0.1</version>
  26.         </dependency>
  27.  
  28.         <!-- https://mvnrepository.com/artifact/org.testng/testng -->
  29.         <dependency>
  30.             <groupId>org.testng</groupId>
  31.             <artifactId>testng</artifactId>
  32.             <version>6.9.13.6</version>
  33.         </dependency>
  34.  
  35.     </dependencies>
  36. /*
  37.     Ну, несколько моментов
  38.  
  39.     логичнее - было релизовать отдельно селенидовский проект и селениусмкий - поскольку pom-ы будут разные
  40.  
  41.     Используй не TestNG, а именно JUnit
  42.           мы на курсе именно JUnit используем
  43.           он лаконичнее и строже, и его фукнкциональности - достаточно
  44.           а поскольку на курсе будем использовать его - то разумнее и тебе на нем остановиться
  45.  
  46.           даже если ты настаиваешь на TestNG - рассчитывай на то, что все вопросы, с ним связанные, мы не будем помогать тебе решать
  47.           Мы не считаем TestNG удачным выбором )
  48.           И все вопросы по TestNG - придется тебе решать самостоятельно - как просто какие-то теоретические, так и практические
  49.           Потому - настойчиво рекомендую для работы на курсе выбрать JUnit
  50.  
  51.       Вот тут Сергей Пирогов - касается вопросов сравнения TestNG & JUnit
  52.       http://automation-remarks.com/budtie-ostorozhny-s-testng-lisienierami/index.html
  53.  
  54.       Вот еще интересное мнение
  55.       http://blog.javafortesters.com/2014/09/faq-should-i-use-junit-or-testng-which.html
  56.       Я согласна с ним в таких вопросах
  57.           I think JUnit is easier for beginners to work with
  58.           JUnit has more online resources to help
  59.           I think the basic JUnit skills you learn are transferrable to TestNG, if you use that on your site
  60.  
  61.           а вот это
  62.           Most of the production teams I have worked with use JUnit
  63.           Я конечно не проверю)
  64.           Но вот нашелся линк
  65.           https://javalibs.com/compare/junit-vs-testng
  66.  
  67.       Вот тут видео Солнцева
  68.       http://sqadays.com/en/talk/25882
  69.       с 25-ой минуты он про это касается
  70.       Да и вообще видео полезное)
  71.  
  72.       У Якова - аргументы похожи на аргументы Солнцева
  73.       JUnit = “православный” = в нем есть только те фичи, которые нужны для написания
  74.       “правильных эффективных тестов”. Такой инструмент загоняет тебя в правильные рамки
  75.       и не позволяет отстрелить себе ногу )
  76.       А TestNG - сборная солянка, с которой очень просто нагородить ужасов, например - зависимые тесты...
  77.       То, что в JUnit есть фичи типа аннотации depends - это уже зло, и делает JUnit-у мегаминус в карму)
  78.  
  79.  
  80. */
  81. *******************************
  82. http://joxi.ru/krDOZldF01g9LA
  83. /*
  84.     Мне не кажется хорошей идея держать в проекте хромдрайвер как ресурс
  85.  
  86.     хромдрайвер и где он расположен - свойство environment-а
  87.     а не проекта как такового
  88.  
  89.     может  - на уровне проекта еще задать путь к хромдрайверу еще ок
  90.     но вот зашить внутрь проекта...
  91.     я бы поспорила)
  92.  
  93.     Можно было пока подключить selenide 3.11 и использовать файрфокс 47.0.1
  94.     ну и селениум 2.53.1 - соответственно
  95.     Тогда не пришлось бы возиться с хромдрайвером)
  96.     и пока нам этой конфигурации - с головой хватило бы
  97.  
  98.     этот материал поможет сориентироваться
  99.     https://docs.google.com/document/d/1fodHkTunrtit-EiMBrb91Mc6rbnQ5LwtBL9rISQveKA/edit
  100.  
  101.     ну то уже сам решай - про версии
  102.     в принципе - познаний у тебя достаточно
  103.     потому - насчет версий сам решай
  104. */
  105. **************************************
  106. http://joxi.ru/E2pdR1lFBd40d2
  107.  
  108. /*
  109.     Насчет пейджа в принципе
  110.         Тут пока применять пейджи - смысла большого не было
  111.         Эта задача эмулирует ситуацию когда мы пишем “драфт тест” - чтобы проверить как вообще автоматизация заходит на этот новый проект -
  112.         такой старт, потому наи пока и не нужны вспомогательные методы пейджа - степы
  113.         особенно - если учесть - что повторений практически нету
  114.  
  115.         единственная причина почему в пейдж в таких обстоятельствах стоит реализовывать - это если сразу же тест будут смотреть мануальщики
  116.         например - для ревью покрытия - и потому уже в этот момент нужно чтоб код был красивый и без технических деталей -
  117.         поиска элементов и всего такого, только чистая наглядная тестовая логика
  118.  
  119.         раз уже пейдж есть - пусть будет
  120.         это объяснения про причины/цели
  121.  
  122.     Ты много сущностей вынес в поля пейджа
  123.         Этим тоже не надо злоупотреблять,т к это не KISS
  124.         https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#heading=h.w4krdzi2dr1j
  125.  
  126.         правильнее создавать сущности - тогда, когда они нужны
  127.         и если какой-то локатор используется только в одном методе - то как правило - там ему и место
  128.  
  129.         и кода меньше будет)
  130.  
  131.         это кстати - тоже одна из проблем @FindBy & PageFactory - что такой подход не позволяет писать экономно код
  132.         правда, в Selenide таки можно - т к есть альтернатива, в отличие от Selenium
  133.  
  134.  
  135.     Для проекта, написанного на Selenide - никаких аннотаций @FindBy элементов не нужно
  136.  
  137.         SelenideElement element = $(....);
  138.         будет и переискиваться - при работе с ним
  139.         и еще - сам дожидаться - что работать с элементом можно (клик  - сначала подождет видимости элемента, например)
  140.  
  141.             не
  142.             @FindBy(xpath = ".//ul[@id='todo-list']//li")
  143.             private ElementsCollection tasksContainers;
  144.  
  145.             а
  146.  
  147.             private ElementsCollection tasks = $$(....);
  148.  
  149.     для пейджа Selenide - решения
  150.         переходи на полноценное использование
  151.         SelenideElement и ElementsCollection
  152.         в смысле - не нужны тебе никакие @FindBy аннотации тут
  153.  
  154.         видео Якова достаточно - чтоб сориентироваться
  155.         вот тебе еще на почитать
  156.         http://selenide.org/documentation.html
  157.  
  158.     для пейджа Selenium-решения -
  159.         вариант без @FindBy - тоже предпочтительнее
  160.         вот почему:
  161.         - гораздо менее лаконичный и менее читабельный
  162.         - магичный и не ооп-шный  - не консистентный со всем другим кодом создания прокси элементов, и вообще классов в проекте -
  163.           а значит ньюкамерам сложнее въехать
  164.         - Page Factory в принципе зло.
  165.           Этого Яков касается в докладе https://www.youtube.com/watch?v=Hi6EYEkSvrk
  166.           Page Factory вся наша тусовка кстати - считает злом.
  167.                 И Пирогов
  168.                 И Солнцев
  169.                 и главное - Баранцев (коммиттер в селениум) .
  170.           Есть планы ее выкинуть с Селениума вообще
  171.  
  172.     Про использование xPath
  173.     Тебе он тоже не нужен )
  174.     css Selector-ов - почти всегда достаточно
  175.     В этом проекте - xPath-ы тебе точно не понадобятся
  176.  
  177.     Привожу тебе наш диалог с другим струдентом)
  178.  
  179.         Почему грамотнее предпочитать cssSelectors xpath-выражениям
  180.  
  181.         student: а маска может быть написана через xpath?
  182.         Julia Iluhina: может
  183.         Julia Iluhina: но лучше используй цсс селектор - если есть такая возможность
  184.  
  185.         Julia Iluhina: http://stackoverflow.com/questions/16788310/what-is-the-difference-between-css-selector-xpath-which-is-betteraccording-t
  186.         Julia Iluhina: http://elementalselenium.com/tips/32-xpath-vs-css
  187.         Julia Iluhina: Некоторые вещи невозможно сделать без xpath
  188.         Julia Iluhina: там конечно он пригодится)
  189.         ...
  190.         Iakiv Kramarenko: а если по делу - то икспасы ЗЛО, потому что громоздкие и плохо поддерживаемые
  191.         и их стоит использовать очень редко, только когда цсс-ов не хватает
  192.  
  193.         единственное место где тебе нужны будут знания икспасов - это интервью
  194.         потому что большинство автоматизаторов - плохие автоматизаторы) и почему то думают что икспасы это круто :)
  195.  
  196.         так вот… когда нужно будет пройти интервью - тогда и выучишь икспасы - а сейчас нечего дурным голову забивать
  197.         Iakiv Kramarenko: On 7/26/16, at 3:27 PM, student wrote:
  198.         > Может для икспаса другой синтаксис
  199.  
  200.         у икспаса конечно другой синтаксис
  201.  
  202.         и если ты хочешь найти элемент по икспасу нужно явно передавать в долар икспас
  203.         так
  204.         $(By.xpath(…))
  205.         либо так
  206.         $(byXpath(…))
  207.  
  208.         вот здесь я пишу об этом более подробно:
  209.         http://automated-testing.info/t/pomogite-razobratsya-s-problemoj-czikla-v-selenide/10467/8
  210. */
  211. *********************************************
  212.     private SelenideElement getTask(String text) {
  213.         for (SelenideElement taskContainer : tasksContainers) {
  214.             if (taskContainer != null && taskContainer.$(By.xpath(".//label")).getText().equalsIgnoreCase(text))
  215.                 return taskContainer;
  216.         }
  217.         throw new IllegalArgumentException();
  218.     }
  219.  /*
  220.     Это можно проще делать
  221.     у ElementsCollection - есть метод findBy
  222.     который в качестве параметра получает Condition
  223.  
  224.     есть такой - exactText - который как раз найдет элемент с точно таким текстом
  225.  
  226.     в общем - все очень упростится
  227.  
  228.     в статье по выше приведенной линке - есть пример как раз
  229.  
  230.         $$("#todo-list li").findBy(exactText("4")).find(".destroy").click()
  231.         против
  232.         $(By.xpath("//*[@id='todo-list']//li[.//text()='4']//*[@class='destroy']").click()
  233.  
  234.     посмотри на нее)
  235.  
  236.  */
  237. ****************************************
  238. public class TodoTests {
  239. /*
  240.     почитай по неймингу вот это
  241.     https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#heading=h.c6yq8ne03bpo
  242.  
  243.     и согласно прочитанному - подправь имя тест-класса и тест-метода
  244. */
  245.     @Test
  246.     public void endToEndTest() throws InterruptedException {
  247.         System.setProperty("webdriver.chrome.driver", ".//src//main//java//com//resources//chromedriver_2_25.exe");
  248.         System.setProperty("selenide.browser", "chrome");
  249.         /*
  250.             браузер можно задавать и попроще
  251.             Configuration.browser = "chrome";
  252.             см http://selenide.org/faq.html
  253.  
  254.             про хромдрайвер писала - его в проекте держать не стоит вообще -
  255.             т к это не часть реализации проекта, а свойство environment-а
  256.             дальше на курсе будет - и как задать путь к хромдрайверу на уровне pom
  257.             и как извне задать его при запуске проекта из командной строки
  258.             пока ок - сама строчка System.setProperty("webdriver.chrome.driver"...
  259.  
  260.             самое важное - что нужно подправить для настроек
  261.             такие настройки - правильнее делать ДО запуска тест-метода
  262.             это - не тестовая логика
  263.             это - предварительные действия
  264.             если у тебя тесты ранятся в одном потоке - надо это задать перед запуском всех тест-методов
  265.             если в разных - перед запуском каждого тест-метода
  266.             в данном случае - в BeforeClass-методе было бы ОК настройки делать
  267.             http://junit.sourceforge.net/javadoc/org/junit/BeforeClass.html
  268.  
  269.             а если вернуться к варианту selenide 3.11 и использовать файрфокс 47.0.1
  270.             этого просто не придется делать
  271.         */
  272.  
  273.         MainPage page = open("https://todomvc4tasj.herokuapp.com", MainPage.class);
  274.         /*
  275.             не знаю, стоило ли объединять создание пейджа и открытие урла
  276.             мне это кажется перебором
  277.             допускаю, что это личные предпочтения
  278.             но все же)
  279.  
  280.             создание пейджа - я бы делала вне тест-метода
  281.             из тех же соображений - создание пейджа - еще не тестовая логика сценария
  282.             а подготовка инструментов = дело тест-класса в общем, а не тест-метода в частности
  283.  
  284.             а вот открытие урла - уже реализация самого сценария, и этот шаг точно должен происходить внутри тест-метода
  285.             по крайней мере пока)
  286.             пока у нас нет повода выносить открытие урла например в @Before-метод - для случая, если все тест-методы класса
  287.             начинают свою работу с открытия этого урла
  288.  
  289.             допускаю - что вот это мое решение - все же субъективно
  290.             тут не настаиваю
  291.         */
  292.  
  293.         page.waitForAjaxComplete();
  294.         /*
  295.             вот это решение - очень интересное
  296.             сама идея ждать таким образом пока для страницы все что нужно догрузится - она бесспорно хороша)
  297.  
  298.             кстати, ты с этой проблемой - даже и не столкнулся бы, используй ты конфигурацию selenide 3.11 и файрфокс 47.0.1 )
  299.  
  300.             хром - достаточно быстр по сравнению с файрфоксом,
  301.             и как результат - в хроме, бывает проявляется этот момент для https://todomvc4tasj.herokuapp.com
  302.             что элементы доступны чуть раньше - чем JavaScript подгрузится
  303.             и когда начинают выполняться действия раньше этого момента - получаем проблемы
  304.  
  305.             такое ожидание - это, фактически, вызов селениумского new WebDriverWait(...).until
  306.             для тобой разработанного кондишена
  307.  
  308.             по идее такая проверка - это не логика пейджа, и даже не логика предка пейджа
  309.             т к в общем - по своей сути - вещь сравнительно универсальная и применимая в разных обстоятельствах
  310.  
  311.             я бы такие вещи рекомендовала реализовывать так
  312.             http://joxi.ru/brRlV57uQwBEj2 - организовала специальный класс для хранения нами разработаных ExpectedCondition
  313.                 обрати внимание
  314.                     где в проекте располагается этот класс  (ветка проекта src\main - т к вещь это = универсальная)
  315.                     в кондишене - реализован метод toString() - обеспечивающий нормальное сообщение в случае
  316.                     если  new WebDriverWait(...).until не дождется положительного результата - http://joxi.ru/vAW36KgskY3vgA
  317.                     можно взять за основу и твое подробное сообщение - Ajax is not completed ($.active!=0)
  318.  
  319.             http://joxi.ru/Q2KpJYOs9zO6LA - класс для различных универсальных методов
  320.                     тоже - расположен там же (ветка проекта src\main)
  321.                     фактически - тут как раз вызываем наш кондишен в  new WebDriverWait(...).until
  322.             этот метод - нам подойдет для использования и в селенидовской версии, и в селениумской
  323.                     получим
  324.             для Selenide
  325.                 Helpers.waitForAjaxIsLoaded(getWebDriver(), Configuration.timeout);
  326.             для Selenium
  327.                 Helpers.waitForAjaxIsLoaded(driver, ...);
  328.  
  329.             и throws InterruptedException - для тест-метода уже не понадобится
  330.  
  331.             Чем такой подход лучше
  332.                 почитай про Single Responsibility principle
  333.                 каждый класс - должен решать свои задачи
  334.                 при таком подходе код будет проще, понятнее, однозначнее
  335.  
  336.                 у нас будут классы
  337.                     пейдж - отвечает за инструменты для работы с конкретно такой-то страницей
  338.                     контейнер кондишенов - только содержит реализованные нами кондишены
  339.                     (которые реализуем максимально универсально - без привязки к контекстам нашего приложения)
  340.                     контейнер универсальных методов - которые можно использовать как в пейджах, так и в тест-методах
  341.  
  342.                     и каждый будет заниматься своим делом)
  343.  
  344.                     в результате - нам не понадобится в пейдже для решения на Selenide - использовать предка
  345.                     да и вебдрайвер пейджу не нужно передавать)
  346.  
  347.                     Для селениумского предка пейджа - тоже многое изменится
  348.                     не факт - что при таких раскладах он нужен вообще
  349.  
  350.                         метод waitUntilVisible(WebElement element) - тоже вещь универсальная, на самом деле
  351.                         потому держать это в предке пейджа  - тоже нарушение Single Responsibility Principle
  352.  
  353.                     Еще момент по пейджам
  354.                     public static int DEFAULT_TIMEOUT_SEC = 10;
  355.                         Это - настройка, касающаяся не пейджа, а самого теста
  356.                         все настроечные вещи - лучше держать или в тест-классе, или его предке
  357.                         (это зависит от того -
  358.                         что будет переиспользоваться/что нет
  359.                         что есть смысл прятать из самого тест-класса/что нет)
  360.  
  361.                         Лучше выносить в предка тест-класса aka "test config"  -
  362.                         чтоб не светить в тесте техничекими деталями
  363.                         ЕСЛИ - это какие-то униварсальые настройки
  364.         */
  365.  
  366.         page.addTask("new task1")
  367.                 .addTask("new task2")
  368.                 .addTask("new task3")
  369.                 .addTask("new task4")
  370.                 .deleteTask("new task2")
  371.                 .markTaskAsCompleted("new task4")
  372.                 .clearCompletedTasks()
  373.                 .markAllTasksAsCompleted()
  374.                 .clearCompletedTasks();
  375.         /*
  376.             все чудесно и красиво
  377.             но где проверки?
  378.  
  379.             нам нужно было реализовать ТЕСТ на базе сценария
  380.             а ТЕСТ в принципе включает шаги плюс проверки
  381.  
  382.             каждое действие должно быть проверено сразу
  383.             иногда можно отложить проверки
  384.             но для этого должны быть причины и/или цели
  385.             про это - вставлю кусок текста ниже
  386.  
  387.             таки посмотри Якова видео
  388.                 реализуй пока ТОЛЬКО версию для Selenide
  389.                 подправь работу с SelenideElement & ElementsCollection
  390.                 перейди на использование JUnit
  391.                 избавься от xPath
  392.                 убери из проектов chromedriver_2_25.exe
  393.                 добавь проверки)
  394.  
  395.             Видно - что навыков много
  396.             но к их применению есть вопросы)
  397.  
  398.             раздели проекты на 2 - для Selenium & Selenide
  399.             в pom.xml обоих проектов - не держи лишнего
  400.             да и вообще пока Selenium - пока отложи
  401.             закончим с Селенидовской версией сначала
  402.  
  403.  
  404.         */
  405.     }
  406. ********************************************************************
  407.  
  408.  driver.close();
  409.  driver.quit();
  410. /*
  411.     это по пути
  412.     http://stackoverflow.com/questions/15067107/difference-between-webdriver-dispose-close-and-quit
  413.         http://www.testingdiaries.com/driver-close-and-driver-quit/
  414.         http://internetka.in.ua/selenium-webdriver-quit-or-close/
  415. */
  416. ************************************
  417. /*
  418.  
  419. когда стоит или можно откладывать проверку, не делать ее сразу после действия
  420.  
  421.     в целом = правило такое = каждое действие должно быть проверено сразу
  422.  
  423.         это нужно для того, чтобы знать не только, что действие выполнено
  424.         но и то, что действие (каждое) выполнено с ожидаемым нами результатом
  425.  
  426.         и если тест упал - нам важно знать
  427.         какая конкретно операция этому была виной
  428.  
  429.     суть проверки - не только проверить сущность, над которой выполнялось действие
  430.     но и общую картину
  431.         в нашем случае могло быть так
  432.         добавляем таску - а добавляется 2 одинаковые
  433.         проверка - что перава таска имеет такой-то текст - пройдет
  434.         и об ошибке мы не узнаем
  435.  
  436.         а это плохо)
  437.         потому правильнее - проверять общую картину
  438.         а не состояние сущности, над которой было совершено действие
  439.         если это возможно, конечно)
  440.         и если мы оперируем именно списком однотипных сущностей
  441.  
  442.     почему и когда мы можем отложить проверку
  443.         первый пример - проверить первый раз список тасок уже после добавления   всех 4-ех тасок
  444.         т к операции однотипные в общем-то
  445.  
  446.           можно быть чуть точнее
  447.           проверить список тасок после добавления первой таски и после добавления последней таски
  448.           если посчитать - что это 2 разные ситуации = добавление первой и добавление последующих тасок
  449.  
  450.         второй пример - не делать проверки списка тасок после закомпличивания одной или всех тасок
  451.         а уже делать проверку после следующей операции - clear completed
  452.  
  453.           тут логика следующая
  454.             после закомпличивания таска все равно отображается в списке
  455.             и то, что она закомпличена - мы поймем уже после выполнения clear completed
  456.  
  457.             но, с другой стороны,
  458.             то, что закомпличивания таска все равно отображается в списке - это
  459.             как раз часть логики....
  460.             и из этих соображений - стоило бы тут добавить проверку
  461.  
  462.               пример - при закомпличивании таска удаляется
  463.               если проверим аж после clear completed -
  464.               такую ошибку не поймаем
  465.  
  466.           так что по поводу проверки после закомпличивания -
  467.           ее нужно использовать, если операция закомпличивания нестабильна
  468.           или ее можно отложить - если мы не ждем сюрпризов от этой операции
  469.  
  470.           такой баланс - эффективность vs точность
  471.  
  472. */
Advertisement
Add Comment
Please, Sign In to add comment