julia_v_iluhina

Untitled

Jan 17th, 2017
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.05 KB | None | 0 0
  1. *
  2.         Для поиска элемента внутри элемента - можно использовать find(String cssSelector)
  3.  
  4.             SelenideElement task = tasks.findBy(exactText("task1"));
  5.  
  6.         У такого элемента есть внутренний элемент .toggle
  7.  
  8.         Можно к нему доступиться так
  9.  
  10.         Способ 1 - как мы обычно и делали
  11.         оперируем в селекторе - только терминами внутренней структуры элемента task
  12.             SelenideElement toggle = task.find(".toggle");
  13.             toggle.click();
  14.  
  15.         Способ 2
  16.         оперируем в селекторе - не только термнами внутренней структуры элемента task,
  17.         но и терминами струкруры всех предков - вверх по ветке этой html структуры
  18.  
  19.         важно - этот селектор все равно будет использован для поиска элементов
  20.         только внутри элемента-родителя (task в нашем примере)
  21.  
  22.         пример 1
  23.             SelenideElement toggle = task.find(".completed .toggle");
  24.             toggle.click();
  25.         .completed - это класс, который может быть у предков элемента toggle - у тасок
  26.         и если такого класса у нашей конкретной task не будет - мы не найдем и элемент toggle
  27.  
  28.         пример 2
  29.             SelenideElement toggle = task.find("#todo-list li.completed .toggle");
  30.             toggle.click();
  31.  
  32.         #todo-list li.completed - это селектор вообще для всех закомпличеных тасок
  33.         если наша таска task входит в это множество, то мы и элемент toggle так найдем
  34.         иначе - не найдем
  35.  
  36.         SelenideElement innerElement = element.find(cssSelector);
  37.         выводы - получаем пересечение множеств / выполнение 2-ух условий
  38.         множество 1 = ищем внутренние элементы элемента element
  39.         множество 2 = которые попадают в выборку по селектору cssSelector
  40.         причем cssSelector - может быть написан в терминах всей html-страницы,
  41.         а не только в терминах внутренней структуры element
  42.  
  43.         нам нет причин оперировать в cssSelector чем-то из внешней структуры -
  44.         если нам просто нужно идентифицировать элемент
  45.  
  46.         но - если у нас есть цели с помощью селектора наложить фильтрацию и на эту внешнюю структуру
  47.         (например - чтобы что-то отсечь из рассмотрения)
  48.         - да, мы можем это сделать - если будем оперировать в cssSelector терминами внешней структуры
  49.  
  50.         **************************************************************************
  51.         с учетом выше сказанного  - можно реализовать методы complete и reopen вот таким образом
  52.  
  53.         public void reopen(String taskText) {
  54.                tasks.findBy(exactText(taskText)).find(".completed .toggle").click();
  55.         }
  56.  
  57.         public void complete(String taskText) {
  58.                tasks.findBy(exactText(taskText)).find(".active .toggle").click();
  59.         }
  60.  
  61.         Получается - мы используем тут этот трюк - налагаем с помощью селектора для внутреннего элемента
  62.         условия на внешний элемент - таску.
  63.  
  64.         И, благодаря этому - каждый из этих методов - работает только так, как декларирует в названии
  65.         если вызвать reopen для активной таски
  66.         или complete - для закомпличеной -
  67.         тест упадет, что хорошо - мы или выполнили то, что декларировали, или не выполнили вовсе
  68.  
  69.  
  70.         Что сказать - остроумное решение )
  71.  
  72.         Плюсы решения -
  73.  
  74.             имя метода четко определяет действие
  75.  
  76.             действие конретизировано без задействования дополнительной логики
  77.  
  78.  
  79.         Минусы решения -
  80.  
  81.          не очевидная реализация
  82.          (если вдруг и тебе она не кажется простой теперь - после всех пояснений - может лучше и не используй такой вариант)
  83.  
  84.          был один метод toggle, а теперь будет три (почему 3, а не 2 - ниже поясню)
  85.  
  86.         *********************************************************************************
  87.  
  88.         Почему потребуется не 2 метода, а 3
  89.         Посмотри на реализованные 2
  90.         Реализация - не DRY
  91.         Потому - нужен еще вот такой метод
  92.  
  93.         public void toggle(String taskClass, String taskText) {
  94.                tasks.findBy(exactText(taskText)).find(“.” + taskClass + " .toggle").click();
  95.         }
  96.  
  97.         который уже нужно переиспользовать и в complete, и в reopen
  98.         *********************************************************************************
Advertisement
Add Comment
Please, Sign In to add comment