Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- *
- Для поиска элемента внутри элемента - можно использовать find(String cssSelector)
- SelenideElement task = tasks.findBy(exactText("task1"));
- У такого элемента есть внутренний элемент .toggle
- Можно к нему доступиться так
- Способ 1 - как мы обычно и делали
- оперируем в селекторе - только терминами внутренней структуры элемента task
- SelenideElement toggle = task.find(".toggle");
- toggle.click();
- Способ 2
- оперируем в селекторе - не только термнами внутренней структуры элемента task,
- но и терминами струкруры всех предков - вверх по ветке этой html структуры
- важно - этот селектор все равно будет использован для поиска элементов
- только внутри элемента-родителя (task в нашем примере)
- пример 1
- SelenideElement toggle = task.find(".completed .toggle");
- toggle.click();
- .completed - это класс, который может быть у предков элемента toggle - у тасок
- и если такого класса у нашей конкретной task не будет - мы не найдем и элемент toggle
- пример 2
- SelenideElement toggle = task.find("#todo-list li.completed .toggle");
- toggle.click();
- #todo-list li.completed - это селектор вообще для всех закомпличеных тасок
- если наша таска task входит в это множество, то мы и элемент toggle так найдем
- иначе - не найдем
- SelenideElement innerElement = element.find(cssSelector);
- выводы - получаем пересечение множеств / выполнение 2-ух условий
- множество 1 = ищем внутренние элементы элемента element
- множество 2 = которые попадают в выборку по селектору cssSelector
- причем cssSelector - может быть написан в терминах всей html-страницы,
- а не только в терминах внутренней структуры element
- нам нет причин оперировать в cssSelector чем-то из внешней структуры -
- если нам просто нужно идентифицировать элемент
- но - если у нас есть цели с помощью селектора наложить фильтрацию и на эту внешнюю структуру
- (например - чтобы что-то отсечь из рассмотрения)
- - да, мы можем это сделать - если будем оперировать в cssSelector терминами внешней структуры
- **************************************************************************
- с учетом выше сказанного - можно реализовать методы complete и reopen вот таким образом
- public void reopen(String taskText) {
- tasks.findBy(exactText(taskText)).find(".completed .toggle").click();
- }
- public void complete(String taskText) {
- tasks.findBy(exactText(taskText)).find(".active .toggle").click();
- }
- Получается - мы используем тут этот трюк - налагаем с помощью селектора для внутреннего элемента
- условия на внешний элемент - таску.
- И, благодаря этому - каждый из этих методов - работает только так, как декларирует в названии
- если вызвать reopen для активной таски
- или complete - для закомпличеной -
- тест упадет, что хорошо - мы или выполнили то, что декларировали, или не выполнили вовсе
- Что сказать - остроумное решение )
- Плюсы решения -
- имя метода четко определяет действие
- действие конретизировано без задействования дополнительной логики
- Минусы решения -
- не очевидная реализация
- (если вдруг и тебе она не кажется простой теперь - после всех пояснений - может лучше и не используй такой вариант)
- был один метод toggle, а теперь будет три (почему 3, а не 2 - ниже поясню)
- *********************************************************************************
- Почему потребуется не 2 метода, а 3
- Посмотри на реализованные 2
- Реализация - не DRY
- Потому - нужен еще вот такой метод
- public void toggle(String taskClass, String taskText) {
- tasks.findBy(exactText(taskText)).find(“.” + taskClass + " .toggle").click();
- }
- который уже нужно переиспользовать и в complete, и в reopen
- *********************************************************************************
Advertisement
Add Comment
Please, Sign In to add comment