julia_v_iluhina

Untitled

Dec 1st, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.77 KB | None | 0 0
  1. public class TodoMvcTest {
  2. /*
  3.     название тест-класса - ок
  4.     и согласно conventions
  5.     и отражает - что мы тестируем
  6. */
  7.  
  8.     @Test
  9.     public void todoMvcTest(){
  10.     /*
  11.         а в имени тест-метода - мы ничего нового не добавили и conventions - не выдержали
  12.         посмотри в faq раздел по naming-у
  13.         https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#heading=h.2zj10n877t2p
  14.  
  15.         обрати внимание на вот этот момент
  16.         https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#bookmark=id.txqig9rkgybo
  17.     */
  18.         System.setProperty("webdriver.chrome.driver","E:\\Projects\\chromedriver.exe");
  19.         Configuration.browser = "chrome";
  20.         /*
  21.             ну, я бы тебе на первых порах советовала обойтись без хрома
  22.             там есть свои нюансы, и лучше с ними разбираться чуть попозже
  23.             когда немного освоишься
  24.  
  25.                 Советую пока подключить selenide 3.11 и использовать файрфокс 47.0.1
  26.                 не забудь у файрфокса отключить опцию - автоматического обновления
  27.                 Тогда не пришлось бы возиться с хромдрайвером)
  28.                 и пока нам этой конфигурации - с головой хватило бы
  29.  
  30.             вот тут есть про это подробнее
  31.             https://docs.google.com/document/d/1fodHkTunrtit-EiMBrb91Mc6rbnQ5LwtBL9rISQveKA/edit?usp=sharing
  32.  
  33.             ну и немного забегая наперед - настроечные действия
  34.             лучше делать не в тест-методах
  35.             как и где - разберем на курсе далее)
  36.             а в тест-методе - стоит держать лишь тестовую логику
  37.         */
  38.  
  39.         open("https://todomvc4tasj.herokuapp.com");
  40.         /*
  41.             используй пропуски строк
  42.             как разделители кода на блоки
  43.  
  44.             каждый блок = своя цель, законченная мысль
  45.  
  46.             вот тут - стоит строку пропустить
  47.         */
  48.         $("#todoapp #new-todo").clear();
  49.         /*
  50.             про селектор "#todoapp #new-todo"
  51.             да, он точный, что хорошо)
  52.  
  53.             но - его можно сделать и лаконичнее - без потери точности
  54.  
  55.             более в приложении элементов с ид = new-todo - нету
  56.  
  57.             значит - нам достаточно для идентификации нужного нам элемента  - #new-todo
  58.  
  59.             и здесь и далее - можно для этого элемента использовать именно #new-todo селектор
  60.  
  61.             как работает setValue
  62.             происходит clear + ввод нового текста
  63.  
  64.             вывод - строки $("#todoapp #new-todo").clear();
  65.             вообще не нужно
  66.         */
  67.         $("#todoapp #new-todo").setValue("task1").pressEnter();
  68.         $("#todoapp #new-todo").setValue("task2").pressEnter();
  69.         $("#todoapp #new-todo").setValue("task3").pressEnter();
  70.         $("#todoapp #new-todo").setValue("task4").pressEnter();
  71.         $$("#todo-list li").shouldHave(size(4));
  72.         $$("#todo-list li").shouldHave(exactTexts("task1", "task2", "task3", "task4")); //check number and order
  73.         /*
  74.             а вот для списка тасок - ты прав - селектор как раз и нужен такой "#todo-list li"
  75.             сокращать селектор до "li" - будет слишком, даже если в приложении больше элементов "li" нигде нет
  76.             т к так будет уж слишком неопределенно
  77.             а уточнив ид родительского элемента - получаем уже нужную нам точность, ну и пока по-прежнему - лаконично)
  78.  
  79.             в общем - первая цель - конечно точность)
  80.             но не забывай и о других - лаконичность и наглядность
  81.             дальше еще поясню это
  82.  
  83.             "#todo-list li" = уже ок
  84.             можно еще точнее
  85.             "#todo-list>li"
  86.             тут оба варианта ок
  87.             но в приложениях посложнее такая разница может оказаться существенной
  88.  
  89.             что касается проверок
  90.             достаточно проверки shouldHave(exactTexts("t1", "t2", "t3", "t4"))
  91.                         как осуществяется проверка по кондишену exactTexts
  92.                         сверяется количество, порядок и тексты
  93.                             количество элементов коллекции должно быть равно количеству переданных текстов
  94.                             иначе - проверка не прошла
  95.                             и далее - по порядку сверяются текст элемента и переданный текст
  96.                             нулевой - с нулевым
  97.                             первый с первым
  98.                             и  т д
  99.                         таким образом - уже не нужно проверять размер списка
  100.                         раз уже проверили  exactTexts
  101.  
  102.             что касается комментария  //check number and order
  103.             когда код вполне читаем и из него ясно - что мы делаем
  104.             мы не будем писать комментарии)
  105.             их надо читать - а ничего нового мы не сказали
  106.             и их надо поддерживать в процессе - а это время
  107.             будем и этому на курсе учиться - как не делать лишнего, вплоть до того, как экономить на комментариях )
  108.         */
  109.  
  110.         //Delete
  111.         //$(By.xpath(".//*[@id='todo-list']/li[2] //button[@class='destroy']")).doubleClick();
  112.         //$(By.xpath(".//*[@id='todo-list']/li[4]/div/input ")).click();
  113.         /*
  114.             ну, тут тебе точно не понадобится xPath )
  115.             избегай их применения
  116.             https://gist.github.com/yashaka/4810feb446e82c5566ba26a0996c1023
  117.             http://automated-testing.info/t/pomogite-razobratsya-s-problemoj-czikla-v-selenide/10467/8
  118.  
  119.             ну и еще диалог на эту тему до кучи)
  120.                     Почему грамотнее предпочитать cssSelectors xpath-выражениям
  121.  
  122.                     student: а маска может быть написана через xpath?
  123.                     Julia Iluhina: может
  124.                     Julia Iluhina: но лучше используй цсс селектор - если есть такая возможность
  125.  
  126.                     Julia Iluhina: http://stackoverflow.com/questions/16788310/what-is-the-difference-between-css-selector-xpath-which-is-betteraccording-t
  127.                     Julia Iluhina: http://elementalselenium.com/tips/32-xpath-vs-css
  128.                     Julia Iluhina: Некоторые вещи невозможно сделать без xpath
  129.                     Julia Iluhina: там конечно он пригодится)
  130.                     ...
  131.                     Iakiv Kramarenko: а если по делу - то икспасы ЗЛО, потому что громоздкие и плохо поддерживаемые
  132.                     и их стоит использовать очень редко, только когда цсс-ов не хватает
  133.  
  134.                     единственное место где тебе нужны будут знания икспасов - это интервью
  135.                     потому что большинство автоматизаторов - плохие автоматизаторы) и почему то думают что икспасы это круто :)
  136.  
  137.                     так вот… когда нужно будет пройти интервью - тогда и выучишь икспасы - а сейчас нечего дурным голову забивать
  138.                     Iakiv Kramarenko: On 7/26/16, at 3:27 PM, student wrote:
  139.                     > Может для икспаса другой синтаксис
  140.  
  141.                     у икспаса конечно другой синтаксис
  142.  
  143.                     и если ты хочешь найти элемент по икспасу нужно явно передавать в долар икспас
  144.                     так
  145.                     $(By.xpath(…))
  146.                     либо так
  147.                     $(byXpath(…))
  148.  
  149.         */
  150.  
  151.         //$("todo-list .active:nth-child(2)").click();
  152.         /*
  153.             ну селектор #todo-list .active:nth-child(2) - был бы ок (пропустил # вначале)
  154.  
  155.             но он  может быть лучше)
  156.  
  157.             мы уже для коллекции тасок в списке использовали  #todo-list li
  158.             а теперь - нам нужен такой-то элемент из коллекции
  159.             так нес тоит придумывать каких-то новых вариантов селекторов - оттолкнись от того же  - #todo-list li
  160.             и получишь #todo-list li:nth-child(2)
  161.  
  162.             если человек раобрался - что есть #todo-list li
  163.             то понять - что есть #todo-list li:nth-child(2) - уже значительно проще, согласись
  164.  
  165.             дальше мы увидим больше пользы от правила - применять по максимуму те селекторы, которые уже используются,
  166.             не добавлять различные селекторы бездумно
  167.  
  168.             это что касается селектора
  169.  
  170.             теперь по действию
  171.             нам ведь для того чтоб таску удалить - не нужно кликать на ней
  172.             нам нужно навести на нее курсор мыши = hover()
  173.  
  174.             и после этого - кнопка удаления таски станет видимой
  175.             и тогда уже - можно реализовать и клик по ней (кликнуть можно только на видимом элементе)
  176.  
  177.             тоже - посмотри раздел в faq
  178.             https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#heading=h.b4yp1e5rssa5
  179.         */
  180.         //$("#todo-list :nth-child(2) .destroy").click();
  181.         /*
  182.             те же претензии к селектору
  183.  
  184.             если уже для получения такой-то таски - используем #todo-list li:nth-child(2)
  185.             то и тут будем
  186.             а далее - нам надо уточнить - получить у нашей таски - ее внутренний элемент .destroy
  187.  
  188.             .destroy - это ты удачный селектор для кнопки подобрал (точный, наглядный, лаконичный)
  189.             как ты можешь догадаться - есть и другие менее наглядные варианты
  190.             стоит выбирать наглядный)
  191.  
  192.             про проверки
  193.                       тест - это не только нужные действия
  194.                        это еще и проверки результатов действий
  195.                        и правильнее - не откладывать проверки
  196.                        а делать их сразу после действий
  197.                        т к именно это позволит нам понять - что конкретно работает не так как нужно
  198.  
  199.                        и как писала выше - проверки должны касаться не только таски, с которой мы непосредственно работали
  200.                        а всех тасок в списке
  201.                        ведь ошибка может проявляться и так - после работы с одной таской - состояние другой(или других) тасок тоже как-то портиться
  202.  
  203.                        есть причины и/или цели
  204.                        по которым мы можем отложить проверку на несколько шагов
  205.                        вот, например выше - мы выполнили проверку после добавления всех 4-ех тасок
  206.                        даже если тест упал бы на той проверке - мы бы могли быстро понять - с чем у нас проблема - с добавлением тасок
  207.                        т е - точности мы не потеряли, проверив состояние списка тасок аж после добавления 4-ой таски
  208.                        пока - принимая решение - делать ли проверку или ее отложить - руководствуйся вот такими соображениями
  209.                        но в целом правило такое - проверки нужно делать сразу
  210.  
  211.                        после удаления таски - нужна проверка
  212.  
  213.         */
  214.  
  215.  
  216.         //Mark completed
  217.         //$("#todo-list .active:nth-child(4) input").click();
  218.         /*
  219.             тут - аналогично описанному выше - получи такую-то таску в списке
  220.             оперируя селектором, построенным по уже выше используемому принципу
  221.  
  222.             что до селектора для чекбокса input - как раз пример не наглядного селектора)
  223.             посмотри для этого элемента - на другие его атрибуты
  224.             и подумай - что нам даст более специфичный селектор
  225.             чтоб мы поняли - что речь про переключение статуса таски
  226.         */
  227.         //$("#new-todo").setValue("task5").click();
  228.         /*
  229.             а вот этого - согласно задания не требовалось
  230.             следующее действие - clead completed = нажатие вот на эту кнопку http://joxi.ru/52akqzoUG6LYpr
  231.            
  232.             не забывай про проверки
  233.            
  234.             далее - пошла импровизация)
  235.             вернись к заданию
  236.              https://docs.google.com/document/d/1yvUML7eXyEyDh5asUIL7M88RStlE1RZmgUOJZSXjMVo/edit?usp=sharing
  237.             именно эти шаги нужно выполнить в сценарии
  238.             ну и конечно - нужно их проверить)
  239.            
  240.         */
  241.  
  242.  
  243.        //  $("#todo-list >li[class='active']:nth-child(2) >div[class='view']>button[class='destroy']").pressEnter();
  244.        //$$("#todo-list li").shouldHave(exactTexts("task1","task3","task4"));
  245.        // $$("#todoapp").shouldHave(size(3));
  246.  
  247.        // $$("#ires li.g").shouldHave(size(10));
  248.        // $("#ires li.g").shouldHave(text(" Selenide "));
  249.  
  250.  
  251.     }
  252.  
  253. }
Advertisement
Add Comment
Please, Sign In to add comment