Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @Override
- public WebElement getWrappedEntity() {
- WebElement element = fetchWrappedEntity();
- if (element == null) {
- throw new ElementNotFoundException();
- /*
- тут лучше в качестве параметра для ElementNotFoundException -
- передать toString() этого же лейзи-элемента
- чтобы было яснее - какой элемент не найден
- см раздел ниже - ответы на вопросы (тут же в ревью)
- */
- }
- else return element;
- /*
- тут и без else будет ок
- если нулл - мы уже вышли по эксепшену)
- дальше - просто возвращай element
- */
- }
- ***********************************
- @Override
- public WebElement fetchWrappedEntity() {
- for (LazyElement lazyElement: parentCollection) {
- if (lazyElement.is(condition)) {
- return lazyElement.getWrappedEntity();
- }
- }
- return null;
- }
- /*
- мы договорились - сами нулл нигде не возвращаем)
- тут - вместо return null;
- тоже бросай ElementNotFoundException
- */
- ************************************************
- public abstract class AbstractCondition<T> implements Condition<T>, DescribesResult{
- protected LazyEntity entity;
- /*
- тут можно объявить LazyEntity<T> entity
- тогда можно будет не приводить тип
- вместо - check((T) entity.getWrappedEntity())
- будет - check(entity.getWrappedEntity())
- */
- public abstract T check(T wrappedEntity);
- /*
- давай check - доработаем
- пусть он возвращает boolean
- */
- public T apply(LazyEntity entity) {
- this.entity = entity;
- T result = check((T) entity.getWrappedEntity());
- /*
- тут - мы сначала в переменную типа T wrappedEntity
- поместим entity.getWrappedEntity()
- далее вызовем check
- и если он вернет true - мы вернем wrappedEntity
- иначе - вызовем исключение WebDriverAssertionException
- и в качестве параметра WebDriverAssertionException() - передадим toString()
- кондишена
- так мы в коде всех конецных кондишенов - уберем работу с нуллом
- метод check - будет говорить - да/нет
- и уже лишь на уровне apply - мы будем возвращать wrappedEntity, если
- */
- ********************************************
- public LazyElement startEdit(String oldTask, String newTask) {
- tasks.find(exactText(oldTask)).find("label").doubleClick();
- //return tasks.find(exactText(oldTask)).find("label").doubleClick().find(".editing").find(".edit").setValue(newTask);
- return tasks.find(exactText(oldTask)).find("editing").find(".edit").setValue(newTask);
- }
- плюс падает тест на редактирования таска в тудумвс, хотелось бы обсудить
- /*
- вторая строчка - изначально была не такой)
- подними селенидовские тесты)
- было - return tasks.find(cssClass("editing").find(".edit").setValue(newTask);
- после даблклика -
- внутри таски становится видимым элемент .edit
- у самой таски появляется класс editing
- и теперь таску - мы не пожен найти по тексту, но можем - по классу editing
- нужно разработать новый кондишен cssClass - потомок AbstractElementCondition
- который для элемента определит - есть ли у элемента такой класс
- в предыдущих работах по селениуму было что-то такое, только посложнее
- возьми идеи оттуда
- */
- ********************************
- ******ответы на вопросы**************
- *************************
- когда мы пишем WebDriverAssertionException, что должно быть в его теле?
- Надо как-то подробнее выводить прчину ошибки?
- /*
- все верно
- у всех тобой реализованных кондишенов - реализуй конструктор с одним параметром String message
- в котором вызывай super(message);
- http://developer.alexanderklimov.ru/android/java/extends.php
- http://metanit.com/java/tutorial/3.5.php
- https://docs.oracle.com/javase/tutorial/java/IandI/super.html
- и в качестве параметров для конструкторов этих эксепшенов - передавай toString() того объекта
- с которым работаем
- выше писала про это
- */
- ********************************
- “Дорабатываем наши кондишены
- метод check - у нас уже возвращает значение типа boolean (прошла/не прошла проверка)”
- но я смотрю на метод например у кондишена Text
- public WebElement check(WebElement element) {
- actualText = element.getText();
- return actualText.contains(expectedText)?element:null;
- }
- и я там возвращаю нулл, если проверка не прошла. Мы когда-то сделали так, чтобы возвращать элемент, а не булеан.
- /*
- это выше расписала
- мы получается - отделяем логику проверки
- которая суть - да или нет
- и логику apply - который возвращает нужный нам объект в случае успеха
- */
- ***************************
- и еще: я в AbstractLazyElement объявила абстрактный метод fetchWrappedEntity, использовала его в новом методе getWrappedEntity():
- public WebElement getWrappedEntity() {
- WebElement element = fetchWrappedEntity();
- if (element == null) {
- throw new ElementNotFoundException();
- }
- else return element;
- }
- и теепрь мне надо реализовать этот fetch для каждого вида lazy entity
- т.е. я просто переименовываю в каждом классе для entity метод getWrappedEnitty на fetchWrappedEntity?
- и получается вот так:
- @Override
- public WebElement fetchWrappedEntity() {
- for (LazyElement lazyElement: parentCollection) {
- if (lazyElement.is(condition)) {
- return lazyElement.getWrappedEntity();
- }
- }
- return null;
- /*
- все верно ты сделала
- только null возвращать мы не будем - сразу исключение кинем
- выше есть про это
- */
- ***********************************************
- /*
- в fetchWrappedEntity()
- для классов
- LazyCollectionFoundByConditionElement
- и
- LazyCollectionFiltered
- вариант обхода
- for (LazyElement lazyElement: parentCollection)
- с применением метода is
- конечно, дает наиболее аккуратный код
- тут я с тобой соглашусь)
- что по факту мы делаем
- сначала - заворачиваем каждый вебэлемент списка коллекции
- (чтобы воспользоваться итератором для нашей лейзи-коллекции)
- а потом - на каждом шаге - разворачиваем
- (внутри проверки is - получаем wrappedElement = element.getWrappedEntity())
- т е - делаем таки кучу ненужной работы - заворачиваем и разворачиваем
- хоть код и красивый, конечно...
- правильнее - для оптимизации реально выполняемых действий -
- отказаться от идеи обхода коллекции таким образом
- for (LazyElement lazyElement: parentCollection)
- а реализовать вот так
- получить список вебэлементов parentCollection.getWrappedEntity()
- обойти полученный список вебэлементов в цикле
- и применять к вебэлементу - метод check
- (как раз - у него параметр = вебэлемент, соотвественно
- никаких дополнительных ужимок и прыжков делать не надо)
- сэкономим на заворачиваниях-разворачиваниях)
- пока метод check нам не доступен... - мы не можем вызвать метод check кондишена
- т к у интерфейса кондишена такой метод не объявлен.
- поступим пока не красиво - объявим на уровне интерфейса Condition - метод check
- тогда для метода check - придется поправить во всех реализованных кондишенах - модификатор доступа -
- protected на public
- про красоту - чуть позже побеспокоимся )
- сейчас про функциональность
- раз у нас будет метод check объявлен на уровне интерфейса - значит мы сможем его использовать
- в варианте condition.check(...)
- пока не настаиваю
- но разумнее прислушаться к моему совету)
- и поправить методы fetchWrappedEntity()
- и для LazyCollectionFoundByConditionElement
- и для LazyCollectionFiltered
- важно - чтобы fetchWrappedEntity() максимально шустро работали
- оптимизировать скорость - уже на следующем шаге придется)
- */
- **************************************************
- /*
- еще немного challenge )
- в интерфейсе LazyElement
- объяви методы
- LazyCollection findAll(By innerLocator);
- LazyCollection findAll(String innerCssSelector);
- и реализуй их в AbstractLazyElement
- этот метод позволит у элемента - по селектору или локатору - получить коллекцию внутренних элементов
- отладиться можно - используя
- LazyCollection tasks = $("#todo-list").findAll("li");
- или
- LazyCollectionLazyCollection emails = $("[role='main']").findAll(".zA");
- Иногда такой метод findAll будет очень полезным
- принципы - те же
- как ты до этого реализовывала методы get, find, filter ...
- так сказать - для закрепления результатов)
- */
Advertisement
Add Comment
Please, Sign In to add comment