Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static List<WebElement> getVisibleElements (List < WebElement > elements) {
- List<WebElement> visibleElements = new ArrayList<WebElement>();
- for (WebElement element : elements) {
- if (element.isDisplayed()) {
- visibleElements.add(element);
- }
- }
- return visibleElements;
- }
- /*
- метод = ок
- форматирование кода - поправь
- здесь и в других классах
- в меню(верхнем) - выбери пункт - Code->Reformat code
- https://www.jetbrains.com/help/idea/2016.3/reformatting-source-code.html
- */
- ********************************************************
- public static List<String> getTexts(List<WebElement> elements) {
- /*
- не поняла - какие сложности тут тебя остановили)
- передали тебе список elements
- в цикле - обойди этот список
- и собери в списке строк = тексты элементов
- и список полученных строк затем верни
- у тебя же в коде - уже есть это
- нужно перенести сюда
- */
- ********************************************************
- public static ExpectedCondition<WebElement> conditionToWaitParentElement(final By locator, final String text) {
- /*
- это обсуждали уже
- доработай
- строки 1-74 предыдущего ревью
- */
- **************************************
- public static ExpectedCondition<List<WebElement>> exactTextsOf(final By elementsLocator, final String... texts) {
- /*
- все так
- да только куски кода - повторяются
- пригодился бы метод List<String> getTexts(List<WebElement> elements)
- */
- ****************************************************
- public static ExpectedCondition<List<WebElement>> exactTextsOfVisible(final By elementsLocator, final String... texts) {
- /*
- почему не применил getVisibleElements?
- и тут бы getTexts - пригодился бы
- было бы
- List<WebElement> elements = driver.findElements(elementsLocator);
- List<WebElement> visibleElements = getVisibleElements(elements);
- actualTexts = getTexts(visibleElements);
- аккуратнее получится)
- и разумнее - в случае успеха - возвращать visibleElements
- ну то уже придирки)
- цель - вернуть максимально полезное
- тут - полезно вернуть именно видимые элементы
- наверное)
- я бы так сделала по крайней мере
- но на самом деле - субъективное решение - что лучше вернуть - все элементы или только видимые
- т к пока - само решение - не самое удобное получится)
- дальше на курсе - разберемся как красиво сделать
- но то еще не скоро)
- */
- ********************************************
- public static ExpectedCondition<Boolean> sizeOf(final By elementsLocator, final int expectedSize) {
- /*
- этот кондишен стоит тоже сделалать ExpectedCondition<List<WebElement>>
- в вариантах = ExpectedCondition<Boolean> - меньше потенциальной пользы
- это же касается и sizeOfVisible
- */
- ****************************************************
- public static ExpectedCondition<Boolean> sizeOfVisible(final By elementsLocator, final int expectedSize) {
- /*
- тут - немного бардака есть)
- вообще - не особо анализируя - всегда применяй кетчера для кондишена
- обезопась себя
- да и последовательность в решениях - она всегда на пользу
- */
- public Boolean apply(WebDriver driver) {
- elements = driver.findElements(elementsLocator);
- listSize = elements.size();
- /*
- вот ты тут сразу получил размер списка
- а нас вообще-то - интересует список не всех элементов
- а только видимых
- т е - сначала - получить список видимых элементов
- и только потом делать выводы
- !!! про список видимых элементов
- */
- for (WebElement element : elements) {
- if (!element.isDisplayed()) {
- return null;
- /*
- это неверное решение
- тут - нужен сбор списка видимых элементов
- и только потом - выводы про этот список
- а тут - мы что-то другое проверяем
- не размер списка точно
- */
- ....
- public String toString() {
- return String.format("\nsize of visible list should be more or equals:", expectedSize, "%s\n while actual size is: %s\n", listSize);
- /*
- не отходи от схемы описания
- что проверяем
- для чего проверяем
- ожидаемое
- фактическое
- касается любого кондишена
- */
- *******************************************
- public static ExpectedCondition<WebElement> elementWithCssClass(final By elementsLocator, final String cssClass) {
- return elementExceptionsCatcher(new ExpectedCondition<WebElement>() {
- List<String> actualTexts;
- /*
- вопрос - нам нужны тексты элементов?
- вряд ли)
- а вот значения атрибута class - собрать для всех элементов - было бы полезно)
- */
- public WebElement apply(WebDriver driver) {
- List<WebElement> elements = driver.findElements(elementsLocator);
- for (WebElement element : elements) {
- actualTexts = new ArrayList<String>();
- if (actualTexts.getClass().equals(cssClass)) {
- return element;
- }
- }
- /*
- давай разберем - что мы делаем
- получили список элементов и обходим их
- на каждой итерации - создаем список строк
- и дальше - сравниваем класс этого списка строк с переданным cssClass
- это будут всегда разные вещи
- actualTexts.getClass() - посмотри что за значение получишь
- https://www.tutorialspoint.com/java/lang/object_getclass.htm
- https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#getClass()
- как ты понимаешь - ревь про класс объекта
- объект actualTexts - это список строк
- естественно - это не будет равно строке cssClass
- нам нужно
- обойти elements
- и для каждого элемента - получить значение
- element.getAttribute("class")
- получишь - строку = значение атрибута class для веб элемента
- вот собери такие строки - в список строк = actualClasses
- там этот список пригодится для toString() - нам же надо вывести информацию фактическом состянии
- и дальше - уже обходим этот список
- и анализируем для каждого его элемента
- что там у нас содержится
- там содержатся имена цсс классов через пробел
- тебе нужно эту строку - разбить на слова
- https://www.tutorialspoint.com/java/java_string_split.htm
- и проанализировать - есть ли среди таких слов - равное переданному cssClass
- если есть - значит нужно вернуть соответствующий вебэлемент
- */
- ....
- public String toString() {
- return String.format("\nelements:", elementsLocator, "%s\n hasn`t thic class: %s\n", cssClass);
- }
- /*
- list of webElements located ....
- should contain element with css class ...
- while actual classes are ...
- схема - одна для любого кондишена
- */
- *************************************************
- public static ExpectedCondition<WebElement> elementWithText(final By elementsLocator, final String exactText) {
- return elementExceptionsCatcher(new ExpectedCondition<WebElement>() {
- List<String> actualTexts;
- private int index;
- public WebElement apply(WebDriver driver) {
- actualTexts = new ArrayList<String>();
- List<WebElement> elements = driver.findElements(elementsLocator);
- for (WebElement element : elements) {
- actualTexts.add(element.getText());
- if (actualTexts.get(index).equals(exactText)) {
- return element;
- }
- }
- /*
- сначала - собери actualTexts (используй getTexts(....)
- затем - анализируй список actualTexts
- если нашел строку в actualTexts равный exactText
- значит - возвращай соответствующий вебэлемент
- а какой вебэлемент сооответствует = с таким же индексом, как найденная строка из actualTexts
- */
- return null;
- }
- public String toString() {
- return "element located" + elementsLocator + "\n should equals : " + exactText + "\n actual texts are " + actualTexts;
- }
- /*
- проработай toString()
- примени все ту же схему
- */
- *************************************
- public class ToDoMvcPage {
- static By tasks = byCss("#todo-list>li");
- /*
- это верно - нужен именно локатор
- */
- public static WebElement addTask = $(byCss("#new-todo"));
- /*
- а вот это - неверное решение
- мы получим вебэлемент - в момент инициализации переменной = тогда когда начнем работать с пейджом
- и дальше - будем оперировать этим вебэлементом
- хотя на странице - уже все изменилось
- мы будем оперировать старым значением
- объяви тут - переменную типа By
- и ее используй в методах - где нужно работать с соответствующим элементом
- локатор = это просто рассказ о том как искать элемент
- нам как раз подходит такой вариант
- */
- *********************************
- public static void add(String...taskTexts){
- for (String text: taskTexts) {
- addTask.sendKeys(text);
- addTask.sendKeys(Keys.ENTER);
- /*
- упрощай
- .sendKeys(text, Keys.ENTER);
- .sendKeys(text + Keys.ENTER);
- посмотри на сигнатуру метода sendKeys - что за тип параметра у него
- */
- }
- }
- **************************
- public static void filterActive(){
- $(byText("Active")).click();
- }
- /*
- By.linkText - это родной селениумский метод
- и он в данном случае - поточнее будет)
- */
- **********************************************************
- public static void hover(String taskText){
- Actions action = new Actions(getDriver());
- action.moveToElement($(byText(taskText))).perform();
- }
- /*
- давай отделим одну задачу от другой
- нам нужно
- 1) получить вебэлемент = таску из списка тасок ( таску с таким-то текстом)
- 2) выполнить hover
- реализуй hover(WebElement element) - в ConciseAPI
- ведь это универсальный метод - его можно использовать для любого элемента
- что мы в метоже делаем
- верно - получаем new Actions(getDriver())
- и вызываем action.moveToElement( для элемента переданного
- и заканчиваем perform()
- и задача - получения веб элемента - таски по ее тексту - из списка тасок
- у нас есть By tasks = локатор для списка тасок
- у нас есть(точнее, будет только - т к кондишен надо доработать еще) кондишен - elementWithText
- чтоб получить нужный нам элемент списка -
- нам нужно выполнить ждущую проверку для этого кондишена и этого списка
- $(elementWithText(tasks, taskText))
- такой метод WebElement $(ExpectedCondition <WebElement> conditionToWaitElement) - уже есть, с ним все ок уже
- и дальше - используй такой способ получить таску по ее тексту - $(elementWithText(tasks, taskText))
- это сможешь сделать только когда сам кондишен будет в порядке
- */
- *********************************************
- public static void delete(String taskText){
- $$(exactTextsOf(tasks, taskText));
- /*
- первая проверка - не рабочая в общем случае
- т к проверяет - что в списке тасок - только одна таска с текстом taskText
- а в общем случае - это не так
- да и не ужно нам проверять тексты тасок тут
- нам нужно - поулчить таску с таким-то текстом = $(elementWithText(tasks, taskText))
- и дальше с ней работать
- сначала - выполнить для нее ховер
- затем - уже у этого вебэлемента=таски получить снутренний элемент = кнопку удаления таски
- и на нее кликнуть
- */
- *******************************************
- public static void toggle(String taskText) {
- $(byText(taskText));
- /*
- применяй для получения таски по ее тексту - только $(elementWithText(tasks, taskText))
- и если нужно заюзать что-то внутреннее для вебэлемента - таски - то получай это уже у таски
- WebElement element = .....;
- element.findElement(innerElementLocator).....
- а вот так - когда мы минуя работу со списком тасок - получаем некий элемент с текстом taskText -
- в более-менее приближенных к жизни ситуациях - найдем явно не то что нужно
- лучше быть точным
- есть точное определение списка тасок - локатор
- есть кондишен - позволяющий как результат ждущей проверки - получить нужный элемент списка
- и уже - у этого элемента - получай подчиненный элемент
- и работай с ним
- в случае $(byCss(".toggle")) - ты всегда будешь получать первый на странице элемент с таким селектором
- а нам не это нужно
- нам для таски с текстом taskText это нужно
- */
- $(byCss(".toggle")).click();
- }
- ********************************************************************************
- public static WebElement startEdit(String oldTaskText, String newTaskText){
- $(elementWithText(tasks, oldTaskText));
- doubleClick();
- /*
- то же самое
- сначала - получи вебэлемент = таска с таким-то текстом
- и уже для этого вебълемента = вызывай даблклик
- */
- return $(elementWithCssClass(tasks, "editing"));
- $(byCss(".edit")).sendKeys(newTaskText + Keys.ENTER);
- /*
- код после return - не выполнится
- return - вернули и вышли из метода
- а ам нужно - получить таску с классом editing - $(elementWithCssClass(tasks, "editing")) = хороший код
- потом - у этого вебэлемента - найти его внутренний элемент с селектором ".edit"
- ввести текст (энтер - рано выполнять - т к мы реализуем лишь startEdit)
- и вернуть наш метод должен - вот этот вебэлемент - с селектором ".edit"
- после ввода текста
- посмотри на изначальный код метода (в селенидовской версии)
- тут - метод должен делать то же самое
- с поправкой на способы получения элементов
- но логика - та же
- получили элемент = таску с таким-то декстом
- даблкликнули на ней
- получили подчиненный элемент этой таски - с селектором ".edit"
- ввели новое значение этому элементу (setValue = clear + sendKeys)
- вернули этот элемент
- */
- *********************************************
- public static void doubleClick(){
- Actions actions = new Actions(getDriver());
- actions.doubleClick().perform();
- }
- /*
- у метода - должен быть параметр WebElement element
- даблклик должен выполняться именно на нем
- и метод - как универсальный - должен жить в ConciseAPI
- */
- ***************************************
- public static List<WebElement> $$(ExpectedCondition <List<WebElement>> conditionToWaitElement){
- return assertThat(conditionToWaitElement);
- }
- /*
- как ты понимаешь - такого метода нам пока не надо
- пока не вижу пользы в его существовании
- но то уже сам решай - оставить его или нет)
- */
Advertisement
Add Comment
Please, Sign In to add comment