julia_v_iluhina

Untitled

Jan 31st, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.63 KB | None | 0 0
  1.     public static void executeJavaScript(String script) {
  2.  
  3.         JavascriptExecutor js = (JavascriptExecutor) getDriver();
  4.         js.executeScript(script);
  5.     }
  6. /*
  7.     пропускаешь строки в коде - с разной логикой
  8.     посмотри - первую строку в методе то пропускаешь, то нет
  9.  
  10.     в данном случае - пропуск строки мало что дает
  11.     пропуск строки - хороший разделитель
  12.     между методами, между блоками кода
  13.     а тут что пропуск строки делает? какую пользу приносит? )
  14.  
  15.     это уже придирки конечно)
  16.     но советую взглянуть на код с этой точки зрения
  17.  
  18.     тут код можно написать в одну строку
  19.     ((JavascriptExecutor) getDriver()).executeScript(script);
  20.     мне кажется - ничего не потеряли в плане наглядности?
  21. */
  22. **********************************************************************
  23.     public static WebElement hover(WebElement element) {
  24.  
  25.         Actions ac = new Actions(getDriver());
  26.         ac.moveToElement(element).perform();
  27.         return element;
  28.     }
  29. /*
  30.     Не сокращай слова. Если сокращение какое-то общепринятое - то его можно применять в нейминге
  31.     А самостоятельно - не надо сокращать слова
  32.     ac - не удачное имя для переменной из таких соображений
  33.  
  34.     для локальных переменных правила нейминга, не такие жесткие
  35.     но советую - не применять сокращения для имен переменных
  36.     однобуквенные имена - хороши для переменных-счетчиков в цикле
  37.     а остальные - стоит называть словани
  38.     наглядность - это важно )
  39.  
  40.     советую реализовать метод actions() возвращающий  new Actions(getDriver())
  41.     он пригодится и в hover, и в doubleClick
  42.     да и вообще для каких-то других нужд может метод actions() понадобиться
  43. */
  44. ***********************************************************************
  45. public static void doubleClick(WebElement element) {
  46. /*
  47.     раз остальные методы, работающие с веб элементом
  48.     возвращают веб элемент
  49.     то и этот логичо сделать таким же - возвращающим веб элемент
  50.  
  51.     просто для единообразия
  52. */
  53. **************************************
  54. public static ExpectedCondition<WebElement> elementHasText(final By elementsLocator, final String elementText) {
  55.  
  56. ...
  57.             public String toString() {
  58.                 return String.format("\nText of elements were being found with elementsLocator - %s"
  59.                                 + "\nShould be: %s"
  60.                                 + "\nActual result is: %s\n"
  61.                         , elementsLocator.toString()
  62.                         , elementText
  63.                         , foundElement);
  64.             }
  65. /*
  66.     вопрос - чем поможет выведенный foundElement ?
  67.     по сути - это последний веб элемент, для которого была выполнена проверка
  68.     назвать такой элемент фактическим результатом - весьма странно
  69.  
  70.     особенно - если ожидаемый результат - это текст )
  71.     тут, для этого кондишена, полезным Actual результатом - будет описание текстов всех элементов
  72.  
  73.     представь - ты используешь этот кондишен
  74.     и такая проверка падает
  75.     вопрос - тебе помогут сведения о foundElement?
  76.     а о фактических текстах всех элементов?
  77. */
  78. ***************************************************
  79.     public static ExpectedCondition<WebElement> elementHasCssClass(final By elementsLocator, final String cssClass) {
  80.     /*
  81.         судя по названию и параметрам
  82.         мы в списке веб элементов
  83.         найдем такой веб элемент
  84.         у которого есть класс cssClass
  85.     */
  86.         ....
  87.                     if (element.findElement(By.cssSelector(cssClass)) != null) {
  88.                         foundElement = element;
  89.                         return foundElement;
  90.                     }
  91.     /*
  92.         а делаем - другое
  93.         мы ищем внутренний элемент для родительского элемента из полученного списка
  94.         причем - ищем по cssSelector-у
  95.         хотя заявили - что будем искать по cssClass-у
  96.  
  97.         т е - ищем не то и не так
  98.  
  99.             надо - найти элемент списка elements
  100.             ищем - внутренний элемент у какого-то из элементов  elements
  101.  
  102.             надо - искать по cssClass-у
  103.             ищем - по cssSelector-у
  104.     */
  105.             public String toString() {
  106.                 return String.format("\nWebElements were being found with elementsLocator - %s"
  107.                                 + "\nShould contain element with cssClass: %s"
  108.                                 + "\nActual result is: %s\n"
  109.                         , elementsLocator.toString()
  110.                         , cssClass
  111.                         , foundElement);
  112.             }
  113.     /*
  114.         cssClass of element
  115.         from list located ....
  116.         should be ...
  117.         while actual classes of list elements are ...
  118.  
  119.         тут - та же логика
  120.         что проверяем
  121.         для сего проверяем
  122.         что ожидаем
  123.         что имеем по факту
  124.  
  125.         и тут - как и для прошлого кондишена - описание факта = значение атрибута class для каждого из элементов
  126.     */
  127. ************************************************
  128.     public static ExpectedCondition<Boolean> sizeOfVisible(final By locator, final int sizeOfVisibleToBe) {
  129.  
  130.         ....
  131.                 elements = driver.findElements(locator);
  132.                 visibleTexts = getTexts(elements);
  133. /*
  134.     нам вообще не нужны тексты элементов
  135.     нам нужен список видимых элементов - этого вполне достаточно, чтобы сделать вывод о количестве видимых элементов
  136.  
  137.     а так - мы делаем еще что-то лишнее - получаем тесты элементов
  138.     хотя - в данном случае - этого точно не нужно
  139.  
  140.     любое лишнее действие - это и время
  141.     и вероятности каких-то ошибок
  142.     лучше избегать лишних действий
  143. */
  144. ************************************************
  145. textOfVisible = getTexts(elements);
  146. /*
  147.     не удачное имя для переменной - textOfVisible
  148.     с учетом названия кондишена - actualTexts - было бы уместнее
  149. */
  150. ************************************************
  151.     public class HandleWebElements {
  152.     /*
  153.         класс грамотнее расположить в core - т к он универсальный
  154.         насчет названия - думаю, не самое удачное)
  155.  
  156.         я бы просто назвала Helpers
  157.         типа - контейнер полезных методов и все
  158.         тоже вариант так себе)
  159.     */
  160.         public static List<String> getTexts(List<WebElement> elements){
  161.         /*
  162.             имя должно точно описывать = что делает метод
  163.             в данном методе - мы получаем не тексты всех элементов списка
  164.             а - тексты видимых элементов списка
  165.             по имени метода - getTexts - это не ясно
  166.  
  167.             я рекомендовала реализовать 2 отдельных метода
  168.              getVisibleElements
  169.              и
  170.              getTexts
  171.  
  172.             при существующих потребностях - для кондишенов
  173.             оба метода были бы полезны
  174.             особенно - если ранее реализованные кондишены не убивать)
  175.         */
  176. ************************************************
  177.    public WebElement startEdit(String oldTaskName, String newTaskName) {
  178.  
  179.         doubleClick($(elementHasText(tasks, oldTaskName)));
  180.         WebElement editedElement = $(".editing").findElement(By.cssSelector(".edit"));
  181.         return setValue(editedElement, newTaskName);
  182.     }
  183. /*
  184.     хитро выкрутился)
  185.     кондишен elementHasCssClass - делает не то что нужно
  186.     не) будем  elementHasCssClass до ума доводить
  187.     чтоб тут мог написать
  188.     сначала - вот так  - $(elementHasCssClass(tasks, "editing")).findElement(By.cssSelector(".edit"));
  189.     а потом - когда дополнительные методы $ реализуешь - вот так - $(elementHasCssClass(tasks, "editing"), ".edit");
  190.     строки 58-93 прошлого ревью
  191.    
  192.     и немного подсказок по кондишену elementHasCssClass        
  193.         как получить значение атрибута class = element.getAttribute("class")
  194.         получишь - например для нашей таски - строку "active editing" - т е в общем случае - строка содержит css классы, разделенные пробелами
  195.         как узнать - есть ли у элемента такой-то cssClass = в полученной строке должно содержаться слово = cssClass-у
  196.    
  197.     чем вариант $(elementHasCssClass(tasks, "editing")) лучше чем $(".editing") - в этой версии, конечно, сложно понять)
  198.     но в целом - причины те же что и ранее - почему tasks.findBy(cssClass("editing")) лучше $(".editing")
  199.     тем - что варианты tasks.findBy(cssClass("editing")) (и наш не очень красивый $(elementHasCssClass(tasks, "editing")))
  200.     более точные, и более наглядные
  201.     глядя на код - мы понимаем - что работам мы по-прежнему со списком тасок
  202.     и оперируем не любым первым попавшимся элементом $(".editing"), а именно таской из списка, с классом editing
  203. */
  204.  
  205. **********************
  206. getDriver().getCurrentUrl()
  207. /*
  208.     в ConciseAPI разумно реализовать метод url()
  209. */
Advertisement
Add Comment
Please, Sign In to add comment