Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class TodoMvcTest {
- /*
- название тест-класса - ок
- и согласно conventions
- и отражает - что мы тестируем
- */
- @Test
- public void todoMvcTest(){
- /*
- а в имени тест-метода - мы ничего нового не добавили и conventions - не выдержали
- посмотри в faq раздел по naming-у
- https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#heading=h.2zj10n877t2p
- обрати внимание на вот этот момент
- https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#bookmark=id.txqig9rkgybo
- */
- System.setProperty("webdriver.chrome.driver","E:\\Projects\\chromedriver.exe");
- Configuration.browser = "chrome";
- /*
- ну, я бы тебе на первых порах советовала обойтись без хрома
- там есть свои нюансы, и лучше с ними разбираться чуть попозже
- когда немного освоишься
- Советую пока подключить selenide 3.11 и использовать файрфокс 47.0.1
- не забудь у файрфокса отключить опцию - автоматического обновления
- Тогда не пришлось бы возиться с хромдрайвером)
- и пока нам этой конфигурации - с головой хватило бы
- вот тут есть про это подробнее
- https://docs.google.com/document/d/1fodHkTunrtit-EiMBrb91Mc6rbnQ5LwtBL9rISQveKA/edit?usp=sharing
- ну и немного забегая наперед - настроечные действия
- лучше делать не в тест-методах
- как и где - разберем на курсе далее)
- а в тест-методе - стоит держать лишь тестовую логику
- */
- open("https://todomvc4tasj.herokuapp.com");
- /*
- используй пропуски строк
- как разделители кода на блоки
- каждый блок = своя цель, законченная мысль
- вот тут - стоит строку пропустить
- */
- $("#todoapp #new-todo").clear();
- /*
- про селектор "#todoapp #new-todo"
- да, он точный, что хорошо)
- но - его можно сделать и лаконичнее - без потери точности
- более в приложении элементов с ид = new-todo - нету
- значит - нам достаточно для идентификации нужного нам элемента - #new-todo
- и здесь и далее - можно для этого элемента использовать именно #new-todo селектор
- как работает setValue
- происходит clear + ввод нового текста
- вывод - строки $("#todoapp #new-todo").clear();
- вообще не нужно
- */
- $("#todoapp #new-todo").setValue("task1").pressEnter();
- $("#todoapp #new-todo").setValue("task2").pressEnter();
- $("#todoapp #new-todo").setValue("task3").pressEnter();
- $("#todoapp #new-todo").setValue("task4").pressEnter();
- $$("#todo-list li").shouldHave(size(4));
- $$("#todo-list li").shouldHave(exactTexts("task1", "task2", "task3", "task4")); //check number and order
- /*
- а вот для списка тасок - ты прав - селектор как раз и нужен такой "#todo-list li"
- сокращать селектор до "li" - будет слишком, даже если в приложении больше элементов "li" нигде нет
- т к так будет уж слишком неопределенно
- а уточнив ид родительского элемента - получаем уже нужную нам точность, ну и пока по-прежнему - лаконично)
- в общем - первая цель - конечно точность)
- но не забывай и о других - лаконичность и наглядность
- дальше еще поясню это
- "#todo-list li" = уже ок
- можно еще точнее
- "#todo-list>li"
- тут оба варианта ок
- но в приложениях посложнее такая разница может оказаться существенной
- что касается проверок
- достаточно проверки shouldHave(exactTexts("t1", "t2", "t3", "t4"))
- как осуществяется проверка по кондишену exactTexts
- сверяется количество, порядок и тексты
- количество элементов коллекции должно быть равно количеству переданных текстов
- иначе - проверка не прошла
- и далее - по порядку сверяются текст элемента и переданный текст
- нулевой - с нулевым
- первый с первым
- и т д
- таким образом - уже не нужно проверять размер списка
- раз уже проверили exactTexts
- что касается комментария //check number and order
- когда код вполне читаем и из него ясно - что мы делаем
- мы не будем писать комментарии)
- их надо читать - а ничего нового мы не сказали
- и их надо поддерживать в процессе - а это время
- будем и этому на курсе учиться - как не делать лишнего, вплоть до того, как экономить на комментариях )
- */
- //Delete
- //$(By.xpath(".//*[@id='todo-list']/li[2] //button[@class='destroy']")).doubleClick();
- //$(By.xpath(".//*[@id='todo-list']/li[4]/div/input ")).click();
- /*
- ну, тут тебе точно не понадобится xPath )
- избегай их применения
- https://gist.github.com/yashaka/4810feb446e82c5566ba26a0996c1023
- http://automated-testing.info/t/pomogite-razobratsya-s-problemoj-czikla-v-selenide/10467/8
- ну и еще диалог на эту тему до кучи)
- Почему грамотнее предпочитать cssSelectors xpath-выражениям
- student: а маска может быть написана через xpath?
- Julia Iluhina: может
- Julia Iluhina: но лучше используй цсс селектор - если есть такая возможность
- Julia Iluhina: http://stackoverflow.com/questions/16788310/what-is-the-difference-between-css-selector-xpath-which-is-betteraccording-t
- Julia Iluhina: http://elementalselenium.com/tips/32-xpath-vs-css
- Julia Iluhina: Некоторые вещи невозможно сделать без xpath
- Julia Iluhina: там конечно он пригодится)
- ...
- Iakiv Kramarenko: а если по делу - то икспасы ЗЛО, потому что громоздкие и плохо поддерживаемые
- и их стоит использовать очень редко, только когда цсс-ов не хватает
- единственное место где тебе нужны будут знания икспасов - это интервью
- потому что большинство автоматизаторов - плохие автоматизаторы) и почему то думают что икспасы это круто :)
- так вот… когда нужно будет пройти интервью - тогда и выучишь икспасы - а сейчас нечего дурным голову забивать
- Iakiv Kramarenko: On 7/26/16, at 3:27 PM, student wrote:
- > Может для икспаса другой синтаксис
- у икспаса конечно другой синтаксис
- и если ты хочешь найти элемент по икспасу нужно явно передавать в долар икспас
- так
- $(By.xpath(…))
- либо так
- $(byXpath(…))
- */
- //$("todo-list .active:nth-child(2)").click();
- /*
- ну селектор #todo-list .active:nth-child(2) - был бы ок (пропустил # вначале)
- но он может быть лучше)
- мы уже для коллекции тасок в списке использовали #todo-list li
- а теперь - нам нужен такой-то элемент из коллекции
- так нес тоит придумывать каких-то новых вариантов селекторов - оттолкнись от того же - #todo-list li
- и получишь #todo-list li:nth-child(2)
- если человек раобрался - что есть #todo-list li
- то понять - что есть #todo-list li:nth-child(2) - уже значительно проще, согласись
- дальше мы увидим больше пользы от правила - применять по максимуму те селекторы, которые уже используются,
- не добавлять различные селекторы бездумно
- это что касается селектора
- теперь по действию
- нам ведь для того чтоб таску удалить - не нужно кликать на ней
- нам нужно навести на нее курсор мыши = hover()
- и после этого - кнопка удаления таски станет видимой
- и тогда уже - можно реализовать и клик по ней (кликнуть можно только на видимом элементе)
- тоже - посмотри раздел в faq
- https://docs.google.com/document/d/10qSwWTQ6pGfVZSwOes-1QSmdflMiGD2U_y53VHq2m20/edit#heading=h.b4yp1e5rssa5
- */
- //$("#todo-list :nth-child(2) .destroy").click();
- /*
- те же претензии к селектору
- если уже для получения такой-то таски - используем #todo-list li:nth-child(2)
- то и тут будем
- а далее - нам надо уточнить - получить у нашей таски - ее внутренний элемент .destroy
- .destroy - это ты удачный селектор для кнопки подобрал (точный, наглядный, лаконичный)
- как ты можешь догадаться - есть и другие менее наглядные варианты
- стоит выбирать наглядный)
- про проверки
- тест - это не только нужные действия
- это еще и проверки результатов действий
- и правильнее - не откладывать проверки
- а делать их сразу после действий
- т к именно это позволит нам понять - что конкретно работает не так как нужно
- и как писала выше - проверки должны касаться не только таски, с которой мы непосредственно работали
- а всех тасок в списке
- ведь ошибка может проявляться и так - после работы с одной таской - состояние другой(или других) тасок тоже как-то портиться
- есть причины и/или цели
- по которым мы можем отложить проверку на несколько шагов
- вот, например выше - мы выполнили проверку после добавления всех 4-ех тасок
- даже если тест упал бы на той проверке - мы бы могли быстро понять - с чем у нас проблема - с добавлением тасок
- т е - точности мы не потеряли, проверив состояние списка тасок аж после добавления 4-ой таски
- пока - принимая решение - делать ли проверку или ее отложить - руководствуйся вот такими соображениями
- но в целом правило такое - проверки нужно делать сразу
- после удаления таски - нужна проверка
- */
- //Mark completed
- //$("#todo-list .active:nth-child(4) input").click();
- /*
- тут - аналогично описанному выше - получи такую-то таску в списке
- оперируя селектором, построенным по уже выше используемому принципу
- что до селектора для чекбокса input - как раз пример не наглядного селектора)
- посмотри для этого элемента - на другие его атрибуты
- и подумай - что нам даст более специфичный селектор
- чтоб мы поняли - что речь про переключение статуса таски
- */
- //$("#new-todo").setValue("task5").click();
- /*
- а вот этого - согласно задания не требовалось
- следующее действие - clead completed = нажатие вот на эту кнопку http://joxi.ru/52akqzoUG6LYpr
- не забывай про проверки
- далее - пошла импровизация)
- вернись к заданию
- https://docs.google.com/document/d/1yvUML7eXyEyDh5asUIL7M88RStlE1RZmgUOJZSXjMVo/edit?usp=sharing
- именно эти шаги нужно выполнить в сценарии
- ну и конечно - нужно их проверить)
- */
- // $("#todo-list >li[class='active']:nth-child(2) >div[class='view']>button[class='destroy']").pressEnter();
- //$$("#todo-list li").shouldHave(exactTexts("task1","task3","task4"));
- // $$("#todoapp").shouldHave(size(3));
- // $$("#ires li.g").shouldHave(size(10));
- // $("#ires li.g").shouldHave(text(" Selenide "));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment