Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public static void executeJavaScript(String script) {
- JavascriptExecutor js = (JavascriptExecutor) getDriver();
- js.executeScript(script);
- }
- /*
- пропускаешь строки в коде - с разной логикой
- посмотри - первую строку в методе то пропускаешь, то нет
- в данном случае - пропуск строки мало что дает
- пропуск строки - хороший разделитель
- между методами, между блоками кода
- а тут что пропуск строки делает? какую пользу приносит? )
- это уже придирки конечно)
- но советую взглянуть на код с этой точки зрения
- тут код можно написать в одну строку
- ((JavascriptExecutor) getDriver()).executeScript(script);
- мне кажется - ничего не потеряли в плане наглядности?
- */
- **********************************************************************
- public static WebElement hover(WebElement element) {
- Actions ac = new Actions(getDriver());
- ac.moveToElement(element).perform();
- return element;
- }
- /*
- Не сокращай слова. Если сокращение какое-то общепринятое - то его можно применять в нейминге
- А самостоятельно - не надо сокращать слова
- ac - не удачное имя для переменной из таких соображений
- для локальных переменных правила нейминга, не такие жесткие
- но советую - не применять сокращения для имен переменных
- однобуквенные имена - хороши для переменных-счетчиков в цикле
- а остальные - стоит называть словани
- наглядность - это важно )
- советую реализовать метод actions() возвращающий new Actions(getDriver())
- он пригодится и в hover, и в doubleClick
- да и вообще для каких-то других нужд может метод actions() понадобиться
- */
- ***********************************************************************
- public static void doubleClick(WebElement element) {
- /*
- раз остальные методы, работающие с веб элементом
- возвращают веб элемент
- то и этот логичо сделать таким же - возвращающим веб элемент
- просто для единообразия
- */
- **************************************
- public static ExpectedCondition<WebElement> elementHasText(final By elementsLocator, final String elementText) {
- ...
- public String toString() {
- return String.format("\nText of elements were being found with elementsLocator - %s"
- + "\nShould be: %s"
- + "\nActual result is: %s\n"
- , elementsLocator.toString()
- , elementText
- , foundElement);
- }
- /*
- вопрос - чем поможет выведенный foundElement ?
- по сути - это последний веб элемент, для которого была выполнена проверка
- назвать такой элемент фактическим результатом - весьма странно
- особенно - если ожидаемый результат - это текст )
- тут, для этого кондишена, полезным Actual результатом - будет описание текстов всех элементов
- представь - ты используешь этот кондишен
- и такая проверка падает
- вопрос - тебе помогут сведения о foundElement?
- а о фактических текстах всех элементов?
- */
- ***************************************************
- public static ExpectedCondition<WebElement> elementHasCssClass(final By elementsLocator, final String cssClass) {
- /*
- судя по названию и параметрам
- мы в списке веб элементов
- найдем такой веб элемент
- у которого есть класс cssClass
- */
- ....
- if (element.findElement(By.cssSelector(cssClass)) != null) {
- foundElement = element;
- return foundElement;
- }
- /*
- а делаем - другое
- мы ищем внутренний элемент для родительского элемента из полученного списка
- причем - ищем по cssSelector-у
- хотя заявили - что будем искать по cssClass-у
- т е - ищем не то и не так
- надо - найти элемент списка elements
- ищем - внутренний элемент у какого-то из элементов elements
- надо - искать по cssClass-у
- ищем - по cssSelector-у
- */
- public String toString() {
- return String.format("\nWebElements were being found with elementsLocator - %s"
- + "\nShould contain element with cssClass: %s"
- + "\nActual result is: %s\n"
- , elementsLocator.toString()
- , cssClass
- , foundElement);
- }
- /*
- cssClass of element
- from list located ....
- should be ...
- while actual classes of list elements are ...
- тут - та же логика
- что проверяем
- для сего проверяем
- что ожидаем
- что имеем по факту
- и тут - как и для прошлого кондишена - описание факта = значение атрибута class для каждого из элементов
- */
- ************************************************
- public static ExpectedCondition<Boolean> sizeOfVisible(final By locator, final int sizeOfVisibleToBe) {
- ....
- elements = driver.findElements(locator);
- visibleTexts = getTexts(elements);
- /*
- нам вообще не нужны тексты элементов
- нам нужен список видимых элементов - этого вполне достаточно, чтобы сделать вывод о количестве видимых элементов
- а так - мы делаем еще что-то лишнее - получаем тесты элементов
- хотя - в данном случае - этого точно не нужно
- любое лишнее действие - это и время
- и вероятности каких-то ошибок
- лучше избегать лишних действий
- */
- ************************************************
- textOfVisible = getTexts(elements);
- /*
- не удачное имя для переменной - textOfVisible
- с учетом названия кондишена - actualTexts - было бы уместнее
- */
- ************************************************
- public class HandleWebElements {
- /*
- класс грамотнее расположить в core - т к он универсальный
- насчет названия - думаю, не самое удачное)
- я бы просто назвала Helpers
- типа - контейнер полезных методов и все
- тоже вариант так себе)
- */
- public static List<String> getTexts(List<WebElement> elements){
- /*
- имя должно точно описывать = что делает метод
- в данном методе - мы получаем не тексты всех элементов списка
- а - тексты видимых элементов списка
- по имени метода - getTexts - это не ясно
- я рекомендовала реализовать 2 отдельных метода
- getVisibleElements
- и
- getTexts
- при существующих потребностях - для кондишенов
- оба метода были бы полезны
- особенно - если ранее реализованные кондишены не убивать)
- */
- ************************************************
- public WebElement startEdit(String oldTaskName, String newTaskName) {
- doubleClick($(elementHasText(tasks, oldTaskName)));
- WebElement editedElement = $(".editing").findElement(By.cssSelector(".edit"));
- return setValue(editedElement, newTaskName);
- }
- /*
- хитро выкрутился)
- кондишен elementHasCssClass - делает не то что нужно
- не) будем elementHasCssClass до ума доводить
- чтоб тут мог написать
- сначала - вот так - $(elementHasCssClass(tasks, "editing")).findElement(By.cssSelector(".edit"));
- а потом - когда дополнительные методы $ реализуешь - вот так - $(elementHasCssClass(tasks, "editing"), ".edit");
- строки 58-93 прошлого ревью
- и немного подсказок по кондишену elementHasCssClass
- как получить значение атрибута class = element.getAttribute("class")
- получишь - например для нашей таски - строку "active editing" - т е в общем случае - строка содержит css классы, разделенные пробелами
- как узнать - есть ли у элемента такой-то cssClass = в полученной строке должно содержаться слово = cssClass-у
- чем вариант $(elementHasCssClass(tasks, "editing")) лучше чем $(".editing") - в этой версии, конечно, сложно понять)
- но в целом - причины те же что и ранее - почему tasks.findBy(cssClass("editing")) лучше $(".editing")
- тем - что варианты tasks.findBy(cssClass("editing")) (и наш не очень красивый $(elementHasCssClass(tasks, "editing")))
- более точные, и более наглядные
- глядя на код - мы понимаем - что работам мы по-прежнему со списком тасок
- и оперируем не любым первым попавшимся элементом $(".editing"), а именно таской из списка, с классом editing
- */
- **********************
- getDriver().getCurrentUrl()
- /*
- в ConciseAPI разумно реализовать метод url()
- */
Advertisement
Add Comment
Please, Sign In to add comment