julia_v_iluhina

Untitled

Nov 24th, 2016
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 26.35 KB | None | 0 0
  1. https://github.com/AleksanderPopov/automicianTask   http://pastebin.com/QeunkYx4
  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.     Для проекта, написанного на Selenide - никаких аннотаций @FindBy элементов не нужно
  110.  
  111.     SelenideElement element = $(....);
  112.     будет и переискиваться - при работе с ним
  113.     и еще - сам дожидаться - что работать с элементом можно (клик  - сначала подождет видимости элемента, например)
  114.  
  115.         не
  116.         @FindBy(xpath = ".//ul[@id='todo-list']//li")
  117.         private ElementsCollection tasksContainers;
  118.  
  119.         а
  120.  
  121.         private ElementsCollection tasks = $$(....);
  122.  
  123.     переходи на полноценное использование
  124.     SelenideElement и ElementsCollection
  125.     в смысле - не нужны тебе никакие @FindBy аннотации тут
  126.  
  127.     видео Якова достаточно - чтоб сориентироваться
  128.     вот тебе еще на почитать
  129.     http://selenide.org/documentation.html
  130.  
  131.     Про использование xPath
  132.     Тебе он тоже не нужен )
  133.     css Selector-ов - почти всегда достаточно
  134.     В этом проекте - xPath-ы тебе точно не понадобятся
  135.  
  136.     Привожу тебе наш диалог с другим струдентом)
  137.  
  138.         Почему грамотнее предпочитать cssSelectors xpath-выражениям
  139.  
  140.         student: а маска может быть написана через xpath?
  141.         Julia Iluhina: может
  142.         Julia Iluhina: но лучше используй цсс селектор - если есть такая возможность
  143.  
  144.         Julia Iluhina: http://stackoverflow.com/questions/16788310/what-is-the-difference-between-css-selector-xpath-which-is-betteraccording-t
  145.         Julia Iluhina: http://elementalselenium.com/tips/32-xpath-vs-css
  146.         Julia Iluhina: Некоторые вещи невозможно сделать без xpath
  147.         Julia Iluhina: там конечно он пригодится)
  148.         ...
  149.         Iakiv Kramarenko: а если по делу - то икспасы ЗЛО, потому что громоздкие и плохо поддерживаемые
  150.         и их стоит использовать очень редко, только когда цсс-ов не хватает
  151.  
  152.         единственное место где тебе нужны будут знания икспасов - это интервью
  153.         потому что большинство автоматизаторов - плохие автоматизаторы) и почему то думают что икспасы это круто :)
  154.  
  155.         так вот… когда нужно будет пройти интервью - тогда и выучишь икспасы - а сейчас нечего дурным голову забивать
  156.         Iakiv Kramarenko: On 7/26/16, at 3:27 PM, student wrote:
  157.         > Может для икспаса другой синтаксис
  158.  
  159.         у икспаса конечно другой синтаксис
  160.  
  161.         и если ты хочешь найти элемент по икспасу нужно явно передавать в долар икспас
  162.         так
  163.         $(By.xpath(…))
  164.         либо так
  165.         $(byXpath(…))
  166.  
  167.         вот здесь я пишу об этом более подробно:
  168.         http://automated-testing.info/t/pomogite-razobratsya-s-problemoj-czikla-v-selenide/10467/8
  169. */
  170. *********************************************
  171.     private SelenideElement getTask(String text) {
  172.         for (SelenideElement taskContainer : tasksContainers) {
  173.             if (taskContainer != null && taskContainer.$(By.xpath(".//label")).getText().equalsIgnoreCase(text))
  174.                 return taskContainer;
  175.         }
  176.         throw new IllegalArgumentException();
  177.     }
  178.  /*
  179.     Это можно проще делать
  180.     у ElementsCollection - есть метод findBy
  181.     который в качестве параметра получает Condition
  182.  
  183.     есть такой - exactText - который как раз найдет элемент с точно таким текстом
  184.  
  185.     в общем - все очень упростится
  186.  
  187.     в статье по выше приведенной линке - есть пример как раз
  188.  
  189.         $$("#todo-list li").findBy(exactText("4")).find(".destroy").click()
  190.         против
  191.         $(By.xpath("//*[@id='todo-list']//li[.//text()='4']//*[@class='destroy']").click()
  192.  
  193.     посмотри на нее)
  194.  
  195.  */
  196. ****************************************
  197. public class TodoTests {
  198. /*
  199.     почитай по неймингу вот это
  200.     https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#
  201.  
  202.     и согласно прочитанному - подправь имя тест-класса и тест-метода
  203. */
  204.     @Test
  205.     public void endToEndTest() throws InterruptedException {
  206.         System.setProperty("webdriver.chrome.driver", ".//src//main//java//com//resources//chromedriver_2_25.exe");
  207.         System.setProperty("selenide.browser", "chrome");
  208.         /*
  209.             браузер можно задавать и попроще
  210.             Configuration.browser = "chrome";
  211.             см http://selenide.org/faq.html
  212.  
  213.             про хромдрайвер писала - его в проекте держать не стоит вообще -
  214.             т к это не часть реализации проекта, а свойство environment-а
  215.             дальше на курсе будет - и как задать путь к хромдрайверу на уровне pom
  216.             и как извне задать его при запуске проекта из командной строки
  217.             пока ок - сама строчка System.setProperty("webdriver.chrome.driver"...
  218.  
  219.             самое важное - что нужно подправить для настроек
  220.             такие настройки - правильнее делать ДО запуска тест-метода
  221.             это - не тестовая логика
  222.             это - предварительные действия
  223.             если у тебя тесты ранятся в одном потоке - надо это задать перед запуском всех тест-методов
  224.             если в разных - перед запуском каждого тест-метода
  225.             в данном случае - в BeforeClass-методе было бы ОК настройки делать
  226.             http://junit.sourceforge.net/javadoc/org/junit/BeforeClass.html
  227.  
  228.             а если вернуться к варианту selenide 3.11 и использовать файрфокс 47.0.1
  229.             этого просто не придется делать
  230.         */
  231.  
  232.         MainPage page = open("https://todomvc4tasj.herokuapp.com", MainPage.class);
  233.         /*
  234.             не знаю, стоило ли объединять создание пейджа и открытие урла
  235.             мне это кажется перебором
  236.             допускаю, что это личные предпочтения
  237.             но все же)
  238.  
  239.             создание пейджа - я бы делала вне тест-метода
  240.             из тех же соображений - создание пейджа - еще не тестовая логика сценария
  241.             а подготовка инструментов = дело тест-класса в общем, а не тест-метода в частности
  242.  
  243.             а вот открытие урла - уже реализация самого сценария, и этот шаг точно должен происходить внутри тест-метода
  244.             по крайней мере пока)
  245.             пока у нас нет повода выносить открытие урла например в @Before-метод - для случая, если все тест-методы класса
  246.             начинают свою работу с открытия этого урла
  247.  
  248.             допускаю - что вот это мое решение - все же субъективно
  249.             тут не настаиваю
  250.         */
  251.  
  252.         page.waitForAjaxComplete();
  253.         /*
  254.             вот это решение - очень интересное
  255.             сама идея ждать таким образом пока для страницы все что нужно догрузится - она бесспорно хороша)
  256.  
  257.             кстати, ты с этой проблемой - даже и не столкнулся бы, используй ты конфигурацию selenide 3.11 и файрфокс 47.0.1 )
  258.  
  259.             хром - достаточно быстр по сравнению с файрфоксом,
  260.             и как результат - в хроме, бывает проявляется этот момент для https://todomvc4tasj.herokuapp.com
  261.             что элементы доступны чуть раньше - чем JavaScript подгрузится
  262.             и когда начинают выполняться действия раньше этого момента - получаем проблемы
  263.  
  264.             такое ожидание - это, фактически, вызов селениумского new WebDriverWait(...).until
  265.             для тобой разработанного кондишена
  266.  
  267.             по идее такая проверка - это не логика пейджа, и даже не логика предка пейджа
  268.             т к в общем - по своей сути - вещь сравнительно универсальная и применимая в разных обстоятельствах
  269.  
  270.             я бы такие вещи рекомендовала реализовывать так
  271.             http://joxi.ru/brRlV57uQwBEj2 - организовала специальный класс для хранения нами разработаных ExpectedCondition
  272.                 обрати внимание
  273.                     где в проекте располагается этот класс  (ветка проекта src\main - т к вещь это = универсальная)
  274.                     в кондишене - реализован метод toString() - обеспечивающий нормальное сообщение в случае
  275.                     если  new WebDriverWait(...).until не дождется положительного результата
  276.                     можно взять за основу и твое подробное сообщение - Ajax is not completed ($.active!=0)
  277.  
  278.             http://joxi.ru/Q2KpJYOs9zO6LA - класс для различных универсальных методов
  279.                     тоже - расположен там же (ветка проекта src\main)
  280.                     фактически - тут как раз вызываем наш кондишен в  new WebDriverWait(...).until
  281.             этот метод - нам подойдет для использования и в селенидовской версии, и в селениумской
  282.                     получим
  283.             для Selenide
  284.                 Helpers.waitForAjaxIsLoaded(getWebDriver(), Configuration.timeout);
  285.             для Selenium
  286.                 Helpers.waitForAjaxIsLoaded(driver, ...);
  287.  
  288.             и throws InterruptedException - для тест-метода уже не понадобится
  289.  
  290.             Чем такой подход лучше
  291.                 почитай про Single Responsibility principle
  292.                 каждый класс - должен решать свои задачи
  293.                 при таком подходе код будет проще, понятнее, однозначнее
  294.  
  295.                 у нас будут классы
  296.                     пейдж - отвечает за инструменты для работы с конкретно такой-то страницей
  297.                     контейнер кондишенов - только содержит реализованные нами кондишены
  298.                     (которые реализуем максимально универсально - без привязки к контекстам нашего приложения)
  299.                     контейнер универсальных методов - которые можно использовать как в пейджах, так и в тест-методах
  300.  
  301.                     и каждый будет заниматься своим делом)
  302.  
  303.                     в результате - нам не понадобится в пейдже для решения на Selenide - использовать предка
  304.                     да и вебдрайвер пейджу не нужно передавать)
  305.  
  306.                     Для селениумского предка пейджа - тоже многое изменится
  307.                     не факт - что при таких раскладах он нужен вообще
  308.  
  309.                         метод waitUntilVisible(WebElement element) - тоже вещь универсальная, на самом деле
  310.                         потому держать это в предке пейджа  - тоже нарушение Single Responsibility Principle
  311.  
  312.                     Еще момент по пейджам
  313.                     public static int DEFAULT_TIMEOUT_SEC = 10;
  314.                         Это - настройка, касающаяся не пейджа, а самого теста
  315.                         все настроечные вещи - лучше держать или в тест-классе, или его предке
  316.                         (это зависит от того -
  317.                         что будет переиспользоваться/что нет
  318.                         что есть смысл прятать из самого тест-класса/что нет)
  319.         */
  320.  
  321.         page.addTask("new task1")
  322.                 .addTask("new task2")
  323.                 .addTask("new task3")
  324.                 .addTask("new task4")
  325.                 .deleteTask("new task2")
  326.                 .markTaskAsCompleted("new task4")
  327.                 .clearCompletedTasks()
  328.                 .markAllTasksAsCompleted()
  329.                 .clearCompletedTasks();
  330.         /*
  331.             все чудесно и красиво
  332.             но где проверки?
  333.  
  334.             каждое действие должно быть проверено сразу
  335.             иногда можно отложить проверки
  336.             но для этого должны быть причины и/или цели
  337.             про это - вставлю кусок текста ниже
  338.  
  339.             таки посмотри Якова видео
  340.                 реализуй пока ТОЛЬКО версию для Selenide
  341.                 подправь работу с SelenideElement & ElementsCollection
  342.                 перейди на использование JUnit
  343.                 избавься от xPath
  344.                 убери из проектов chromedriver_2_25.exe
  345.                 добавь проверки)
  346.  
  347.             Видно - что навыков много
  348.             но к их применению есть вопросы)
  349.  
  350.             раздели проекты на 2 - для Selenium & Selenide
  351.             в pom.xml обоих проектов - не держи лишнего
  352.             да и вообще пока Selenium - стоит отложить
  353.         */
  354.     }
  355. ********************************************************************
  356.  
  357.  driver.close();
  358.  driver.quit();
  359. /*
  360.     это по пути
  361.     http://stackoverflow.com/questions/15067107/difference-between-webdriver-dispose-close-and-quit
  362.         http://www.testingdiaries.com/driver-close-and-driver-quit/
  363.         http://internetka.in.ua/selenium-webdriver-quit-or-close/
  364. */
  365. ************************************
  366. /*
  367.  
  368. когда стоит или можно откладывать проверку, не делать ее сразу после действия
  369.  
  370.     в целом = правило такое = каждое действие должно быть проверено сразу
  371.  
  372.         это нужно для того, чтобы знать не только, что действие выполнено
  373.         но и то, что действие (каждое) выполнено с ожидаемым нами результатом
  374.  
  375.         и если тест упал - нам важно знать
  376.         какая конкретно операция этому была виной
  377.  
  378.     суть проверки - не только проверить сущность, над которой выполнялось действие
  379.     но и общую картину
  380.         в нашем случае могло быть так
  381.         добавляем таску - а добавляется 2 одинаковые
  382.         проверка - что перава таска имеет такой-то текст - пройдет
  383.         и об ошибке мы не узнаем
  384.  
  385.         а это плохо)
  386.         потому правильнее - проверять общую картину
  387.         а не состояние сущности, над которой было совершено действие
  388.         если это возможно, конечно)
  389.         и если мы оперируем именно списком однотипных сущностей
  390.  
  391.     почему и когда мы можем отложить проверку
  392.         первый пример - проверить первый раз список тасок уже после добавления   всех 4-ех тасок
  393.         т к операции однотипные в общем-то
  394.  
  395.           можно быть чуть точнее
  396.           проверить список тасок после добавления первой таски и после добавления последней таски
  397.           если посчитать - что это 2 разные ситуации = добавление первой и добавление последующих тасок
  398.  
  399.         второй пример - не делать проверки списка тасок после закомпличивания одной или всех тасок
  400.         а уже делать проверку после следующей операции - clear completed
  401.  
  402.           тут логика следующая
  403.             после закомпличивания таска все равно отображается в списке
  404.             и то, что она закомпличена - мы поймем уже после выполнения clear completed
  405.  
  406.             но, с другой стороны,
  407.             то, что закомпличивания таска все равно отображается в списке - это
  408.             как раз часть логики....
  409.             и из этих соображений - стоило бы тут добавить проверку
  410.  
  411.               пример - при закомпличивании таска удаляется
  412.               если проверим аж после clear completed -
  413.               такую ошибку не поймаем
  414.  
  415.           так что по поводу проверки после закомпличивания -
  416.           ее нужно использовать, если операция закомпличивания нестабильна
  417.           или ее можно отложить - если мы не ждем сюрпризов от этой операции
  418.  
  419.           такой баланс - эффективность vs точность
  420.  
  421. */
Advertisement
Add Comment
Please, Sign In to add comment