Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @Override
- public LazyElement pressEnter() {
- waitFor(this).until(visible());
- this.sendKeys(Keys.ENTER);
- return this;
- }
- @Override
- public LazyElement pressEscape() {
- waitFor(this).until(visible());
- // getWrappedEntity().sendKeys(Keys.ESCAPE);
- this.sendKeys(Keys.ESCAPE);
- return this;
- }
- /*
- внутри this.sendKeys - уже есть ожидание видимости
- тут - не надо еще раз делать waitFor(this).until(visible());
- */
- ***************************************
- public Iterator<LazyElement> iterator()
- /*
- этому методу тоже аннотацию @Override поставь - реализуем же метод интерфейса Iterable
- */
- ******************************************
- @Override
- public LazyElement findElement(int index, String locator) {
- return new LazyCollectionFindElement(this, locator, index);
- }
- /*
- Таки усложнила )
- Давай разбираться
- была цель - сделать вот такой find
- $$(...).get(...).find(innerLocator)
- у какой сущности вызываем find - у $$(...).get(...)
- а это - элемент (не коллекция)
- поэтому
- в LazyElement - объявляй методы
- LazyElement find(By innerLocator)
- LazyElement find(String innerCssSelector)
- можно и методы - $ - с такой же сигнатурой
- это по желанию - если кажется удобным использовать $
- и в AbstractLazyElement - реализуй их
- сначала find(By innerLocator)
- а в find(String innerCssSelector) (или $) - просто его переиспользуешь
- релизуй - аналогично тому - как делала для get
- */
- ******************************
- public abstract class AbstractLazyCollection implements LazyCollection {
- @Override
- public LazyElement findElement(int index, String locator) {
- return new LazyCollectionFindElement(this, locator, index);
- }
- @Override
- public LazyElement $(int index, By innerLocator) {
- return new LazyCollectionFindElement$ByLocator(this, innerLocator, index);
- }
- @Override
- public LazyElement $(String innerCssSelector, int index) {
- return new LazyCollectionFindElement$BySelector(this, innerCssSelector, index);
- }
- /*
- вот это - учти на будущее
- понятно - что этот код уйдет весь
- но - рассмотрим ошибку - чтоб дальше такую не повторять
- по сути - все эти методы делают одно и то же
- у коллекции берут элемент по индексу, и у элемента - ищут внутренний элемент
- самый общий универсальный вариант - это $(int index, By innerLocator)
- из-за второго параметра - By innerLocator
- тип By - позволит искать и по селектору, и по локатору, и по тексту и по ...
- много вариантов
- вот его реализуем первым
- и да - для этого реализуем класс лейзи-элементов специальный
- далее - реализуем остальные методы
- и тут - уже никакой развесистой клюквы не надо
- т к - есть уже $(int index, By innerLocator)
- и мы его можем переиспользовать
- вызвать - $(index, By.cssSelector(innerCssSelector))
- это тоже - DRY
- первое - что должно тебя насторожить - что пришлось реализовать несколько одинаковых по функциональности классов
- это значит - что на предыдущем шаге - ты что-то не учла
- и еще
- порядок параметров в методах-синонимах - должен быть аналогичным
- да и надо взвешивать - сколько таких методов-синонимов нужно
- я бы лишнего не делала
- и по поводу findElement(int index, String locator)
- я бы не использовала имен, которые совпадают с именами методов от WebElement или
- еще каких-то нами используемых интерфейсов
- тут, оно, конечно, технически не мешает - мы в коллекции интерфейс WebElement не имплементируем
- а все равно - на первый взгляд - путает
- и по поводу употребления слова locator
- тут тоже лучше быть последовательным
- мы употребляли locator - для параметров типа By
- а для цсс селекторов - употребляли CssSelector
- не стоит путать смыслы
- одно понятие = один термин
- */
- ***************************************
- public abstract class AbstractLazyElement implements LazyElement {
- @Override
- public WebElement $(By innerLocator) {
- // waitFor(this).until(visible());
- // return new LazyWrappedWebElement(getWrappedEntity()).$(innerLocator);
- return findElement(innerLocator);
- }
- @Override
- public WebElement $(String innerCssSelector) {
- // waitFor(this).until(visible());
- //return new LazyWrappedWebElement(getWrappedEntity()).$(byCss(innerCssSelector));
- return findElement(By.cssSelector(innerCssSelector));
- }
- /*
- как раз тут надо было реализовать эти методы
- зачем нам синонимы для вебэлементовского findElement?
- нет)
- у нас - другая цель
- у нас цель - чтобы
- элементы
- $(...).$(...)
- $$(....).get(...).$(...)
- были лейзи-элементами
- у такого лейзи-элемента будет
- родительский лейзи-элемент
- (в первом примере - это $(...)
- во втором - это $$(....).get(...)
- в любом случае - LazyElement
- и это будет - одна реализация, а не 2
- нам не надо отдельного класса для $(...).$(...)
- и для $$(....).get(...).$(...)
- т к обе эти ситуации = получить у лейзи-элемента(не важно, какого именно)
- его внутренний элемент
- )
- By локатор для внутреннего элемента
- */
- public WebElement getWrappedEntity() {
- return new LazyWrappedWebElement(parentCollection.getWrappedEntity().get(index)).$(innerLocator);
- }
- /*
- применять в getWrappedEntity() - LazyWrappedWebElement - однозначный перебор
- parentCollection.getWrappedEntity() = List<WebElement>
- parentCollection.getWrappedEntity().get(index) = WebElement
- parentCollection.getWrappedEntity().get(index).findElement(innerLocator) = WebElement
- у WebElement - есть метод findElement
- вспомни
- тут, внутри getWrappedEntity() - уже оперируем getWrappedEntity() родительских сущностей и уточняем
- не надо тут использовать ничего из лейзи-сущностей
- тут наоборот задача - получить список вебэлементов или вебэлемент = вернуть то, что оборачивали
- для этого не надо еще оборачивать)
- наоборот - разворачиваем))))
- */
Advertisement
Add Comment
Please, Sign In to add comment