Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class ToDoMVCTest {
- @Test
- public void taskManagement() {
- open("https://todomvc4tasj.herokuapp.com/#/");
- add("1");
- edit("1", "1_edited");
- toggle("1_edited");
- assertTasksAre("1_edited");
- switchFilter("Active");
- assertNoTasks();
- add("2");
- itemsLeftCounter("1");
- cancelEdit("2", "2_edited");
- assertTasksAre("2");
- toggleAll();
- assertNoTasks();
- switchFilter("Completed");
- assertTasksAre("1_edited","2");
- reopen("2");
- clearCompleted();
- assertNoTasks();
- switchFilter("All");
- delete("2");
- assertNoTasks();
- /*
- я бы вот так использовала пропуски строк
- в таком варианте - каждый блок = цепочка действий на одном из фильтров
- сценарий - то что надо, оптимальный
- с проверками тоже все ок
- есть вопросы к реализации переходов по фильтрам
- и к имени метода itemsLeftCounter
- это ниже прокомментирую
- */
- }
- **************************************
- private ElementsCollection tasksList = $$("#todo-list li");
- /*
- достаточно точно и лаконичнее - tasks
- селектор "#todo-list li" - ок, рабочий
- будет точнее "#todo-list>li"
- иногда это важно
- тут, в нашем несложном приложении и твой вариант вполне ок
- */
- ***********************
- private void edit(String taskText, String taskTextEdited) {
- /*
- сотояния было-стало - удобно обозначить old & new / from & to
- oldTaskText & newTaskText
- так наиболее однозначно получится
- */
- tasksList.find(exactText(taskText)).doubleClick();
- $("#todo-list [class~=editing]").$(".edit").setValue(taskTextEdited).pressEnter();
- /*
- вот этот способ получить таску в режиме редактирования - $("#todo-list [class~=editing]")
- да, он рабочий
- но у него есть недостаток - мы используем новый независимый селектор
- лучше придерживаться такого правила
- если у тебя уже используется переменная для коллекции / элемента
- и нужно что-то получить изнутри этой структуры
- то правильнее - доступаться к этому - через уже объявленную переменную
- по сути - что нам нужно
- нам нужен элемент коллекции tasksList
- найденный по классу editing
- это = tasksList.findBy(...)
- в Selenide есть кондишен cssClass
- он в качестве параметра - принимает как раз имя класса
- дальнейшая цепочка действий - ок
- рекомендую вот этот ресурс еще
- https://selenide.gitbooks.io/user-guide/content/ru/
- иносказательно про цсс классы
- Имя элемента и его классы
- в выражении
- <element class=“green bold”>
- element - имя элемента
- class - имя атрибута
- “green bold” - значение атрибута class
- green - цсс класс элемента element
- bold - еще один цсс класс элемента element
- в итоге - вместо - $("#todo-list [class~=editing]").$(".edit").setValue(taskTextEdited).pressEnter();
- получишь tasksList.findBy(...).$(".edit").setValue(taskTextEdited).pressEnter();
- второй вариант лучше
- потому что не используется лишний независимый селектор
- потому что так понятнее - что работаем с таской из списка тасок
- и потому что в случае ошибки - текст ошибки точнее опишет нам причину проблемы
- в общем - советую применять такое правило
- если работаем с коллекцией/элементом через переменную
- и нужно что-то изнутри - то доступаться до этого - через эту переменную
- идя от общего к частному
- список тасок
- таска в режиме редактирования
- внутренний элемент этой таски
- получишь более DRY и более понятный код
- про DRY принцип - почитай в faq
- */
- }
- ************************************
- private void cancelEdit(String taskText, String taskTextEdited) {
- tasksList.find(exactText(taskText)).doubleClick();
- $("#todo-list [class~=editing]").$(".edit").setValue(taskTextEdited).pressEscape();
- }
- /*
- к именам параметров и реализации этого метода - тоже примени выше описанное для edit
- обрати внимание - код этого метода и метода edit - очень похожи
- это можно реализовать более DRY
- реализуй метод xxx который будет возвращать SelenideElement = элемент
- в котором мы указали новый текст
- и потом будешь его переиспользовать как xxx(.....).pressEnter();
- подумай над именем метода
- чтоб оно отражало - что метод делает
- фактически - он лишь начинает/стартует редактирование
- */
- *********************************
- private void switchFilter(String filter) {
- $("#filters").findElementByLinkText(filter).click();
- }
- /*
- тут - поскольку приложение простое - можно проще $(By.linkText(...))
- а в сложных случаях - конечно, стоило конкретизироваться до элемента-контейнера ссылок переходов по фильтрам
- по организации методов перехода по фильтам - попробуй применить вот это
- https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.8bflixemdgfw
- */
- **********************************************
- private void reopen(String taskText) {
- tasksList.find(exactText(taskText)).hover().$(".toggle").click();
- }
- /*
- метод делает то же самое что и toggle(String taskText)
- только еще и лишнее действие = .hover()
- примени reopen к активной таске
- получишь - что таска закомплитится
- т е - имя метода reopen в таком случае не будет описывать корректно - что мы делаем
- а это плохо
- и этого надо избегать
- собственно, наиболее простой метод - использовать метод toggle
- и для закомпличивания таски и для ее переоткрытия
- toggle = переключить
- термин корректный и для закомпличивания таски и для ее переоткрытия
- а если хочется отдельные методы для закомпличивания таски и для ее переоткрытия -
- тогда нужны методы в которых сначала выполняется некая проверка состояния таски
- и лишь затем - действие
- тут проверка - обеспечит верное поведение метода - или выполнится вергое действие или тест упадет
- но - стоит ли так делать в данном случае - еще вопрос)
- вечный баланс между эффективностью и удобством
- допустим - create & reopen - сравнительно легко реализовать в таком ключе
- а вот reopen all & complete all - будет уже посложнее
- (если говорить о реализации, которая даст с одной стороны точность,
- а с другой - не станет ограничивать нас)
- потому - советую работать с toggle & toggleAll
- */
- ***************************************************
- private void itemsLeftCounter(String tasksLeft){
- $("#todo-count > strong").shouldHave(exactText(tasksLeft));
- }
- /*
- "#todo-count > strong" - да, технически все ок
- но я бы применяла "#todo-count>strong"
- т к у пробела - есть свое значение для цсс селектора
- так - "#todo-count>strong" - наиболее однозначно все будет восприниматься
- http://www.w3schools.com/cssref/css_selectors.asp
- мы что проверяем
- мы проверяем количество актывных тасок
- логичнее было бы оперировать параметром-числом
- а не строкой
- а по сути проверки - да, она верная
- чтоб работать с параметром-числом - придется внутри метода число преобразовать к строке
- и далее уже работать также как и сейчас
- вопрос к имени метода -
- https://docs.google.com/document/d/13dNyFGbI7mV22UUhH8E0LJ7SzabAmX7Bw7VCHScYfiU/edit#bookmark=id.sswzyp7qkm9o
- */
- }
Advertisement
Add Comment
Please, Sign In to add comment