julia_v_iluhina

Untitled

Jan 15th, 2017
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 20.81 KB | None | 0 0
  1.         public static List<WebElement> getVisibleElements (List < WebElement > elements) {
  2.             List<WebElement> visibleElements = new ArrayList<WebElement>();
  3.             for (WebElement element : elements) {
  4.                 if (element.isDisplayed()) {
  5.                     visibleElements.add(element);
  6.                 }
  7.             }
  8.             return visibleElements;
  9.         }
  10. /*
  11.     метод = ок
  12.  
  13.     форматирование кода - поправь
  14.     здесь и в других классах
  15.  
  16.     в меню(верхнем) - выбери пункт  - Code->Reformat code
  17.     https://www.jetbrains.com/help/idea/2016.3/reformatting-source-code.html
  18. */
  19. ********************************************************
  20. public static List<String> getTexts(List<WebElement> elements) {
  21. /*
  22.     не поняла - какие сложности тут тебя остановили)
  23.  
  24.     передали тебе список elements
  25.  
  26.     в цикле - обойди этот список
  27.     и собери в списке строк = тексты элементов
  28.  
  29.     и список полученных строк затем верни
  30.     у тебя же в коде - уже есть это
  31.     нужно перенести сюда
  32. */
  33. ********************************************************
  34. public static ExpectedCondition<WebElement> conditionToWaitParentElement(final By locator, final String text) {
  35. /*
  36.     это обсуждали уже
  37.     доработай
  38.     строки 1-74 предыдущего ревью
  39. */
  40. **************************************
  41. public static ExpectedCondition<List<WebElement>> exactTextsOf(final By elementsLocator, final String... texts) {
  42. /*
  43.     все так
  44.     да только куски кода - повторяются
  45.  
  46.     пригодился бы метод List<String> getTexts(List<WebElement> elements)
  47. */
  48. ****************************************************
  49. public static ExpectedCondition<List<WebElement>> exactTextsOfVisible(final By elementsLocator, final String... texts) {
  50. /*
  51.     почему не применил getVisibleElements?
  52.     и тут бы getTexts - пригодился бы
  53.  
  54.     было бы
  55.     List<WebElement> elements = driver.findElements(elementsLocator);
  56.     List<WebElement> visibleElements = getVisibleElements(elements);
  57.     actualTexts = getTexts(visibleElements);
  58.  
  59.     аккуратнее получится)
  60.  
  61.     и разумнее - в случае успеха - возвращать visibleElements
  62.     ну то уже придирки)
  63.     цель - вернуть максимально полезное
  64.     тут - полезно вернуть именно видимые элементы
  65.     наверное)
  66.     я бы так сделала по крайней мере
  67.     но на самом деле - субъективное решение - что лучше вернуть - все элементы или только видимые
  68.  
  69.     т к пока - само решение - не самое удобное получится)
  70.     дальше на курсе - разберемся как красиво сделать
  71.     но то еще не скоро)
  72. */
  73. ********************************************
  74. public static ExpectedCondition<Boolean> sizeOf(final By elementsLocator, final int expectedSize) {
  75. /*
  76.     этот кондишен стоит тоже сделалать ExpectedCondition<List<WebElement>>
  77.  
  78.     в вариантах = ExpectedCondition<Boolean> - меньше потенциальной пользы
  79.  
  80.     это же касается и sizeOfVisible
  81. */
  82. ****************************************************
  83. public static ExpectedCondition<Boolean> sizeOfVisible(final By elementsLocator, final int expectedSize) {
  84.    /*
  85.         тут - немного бардака есть)
  86.  
  87.         вообще - не особо анализируя - всегда применяй кетчера для кондишена
  88.         обезопась себя
  89.         да и последовательность в решениях - она всегда на пользу
  90.    */
  91.  
  92.             public Boolean apply(WebDriver driver) {
  93.                 elements = driver.findElements(elementsLocator);
  94.                 listSize = elements.size();
  95.                 /*
  96.                     вот ты тут сразу получил размер списка
  97.  
  98.                     а нас вообще-то - интересует список не всех элементов
  99.                     а только видимых
  100.  
  101.                     т е - сначала - получить список видимых элементов
  102.                     и только потом делать выводы
  103.                     !!! про список видимых элементов
  104.                 */
  105.  
  106.                 for (WebElement element : elements) {
  107.                     if (!element.isDisplayed()) {
  108.                         return null;
  109.                         /*
  110.                             это неверное решение
  111.  
  112.  
  113.                             тут - нужен сбор списка видимых элементов
  114.  
  115.                             и только потом - выводы про этот список
  116.  
  117.                             а тут - мы что-то другое проверяем
  118.                             не размер списка точно
  119.                         */
  120. ....
  121.             public String toString() {
  122.                 return String.format("\nsize of visible list should be more or equals:", expectedSize, "%s\n while actual size is: %s\n", listSize);
  123. /*
  124.     не отходи от схемы описания
  125.     что проверяем
  126.     для чего проверяем
  127.     ожидаемое
  128.     фактическое
  129.  
  130.     касается любого кондишена
  131. */
  132. *******************************************
  133.     public static ExpectedCondition<WebElement> elementWithCssClass(final By elementsLocator, final String cssClass) {
  134.         return elementExceptionsCatcher(new ExpectedCondition<WebElement>() {
  135.             List<String> actualTexts;
  136.             /*
  137.                 вопрос - нам нужны тексты элементов?
  138.                 вряд ли)
  139.                 а вот значения атрибута class  - собрать для всех элементов - было бы полезно)
  140.             */
  141.  
  142.             public WebElement apply(WebDriver driver) {
  143.                 List<WebElement> elements = driver.findElements(elementsLocator);
  144.                 for (WebElement element : elements) {
  145.                     actualTexts = new ArrayList<String>();
  146.                     if (actualTexts.getClass().equals(cssClass)) {
  147.                         return element;
  148.                     }
  149.                 }
  150.                 /*
  151.                     давай разберем - что мы делаем
  152.  
  153.                     получили список элементов и обходим их
  154.  
  155.                     на каждой итерации - создаем список строк
  156.                     и дальше - сравниваем класс этого списка строк с переданным cssClass
  157.  
  158.                     это будут всегда разные вещи
  159.                     actualTexts.getClass() - посмотри  что за значение получишь
  160.                     https://www.tutorialspoint.com/java/lang/object_getclass.htm
  161.                     https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#getClass()
  162.  
  163.                     как ты понимаешь - ревь про класс объекта
  164.                     объект actualTexts - это список строк
  165.                     естественно - это не будет равно строке cssClass
  166.  
  167.  
  168.                     нам нужно
  169.                     обойти elements
  170.                     и для каждого элемента - получить значение
  171.                     element.getAttribute("class")
  172.                     получишь - строку = значение атрибута class для веб элемента
  173.                     вот собери такие строки - в список строк = actualClasses
  174.                     там этот список пригодится для toString() - нам же надо вывести информацию фактическом состянии
  175.  
  176.                     и дальше - уже обходим этот список
  177.                     и анализируем для каждого его элемента
  178.                     что там у нас содержится
  179.                     там содержатся имена цсс классов через пробел
  180.                     тебе нужно эту строку - разбить на слова
  181.                     https://www.tutorialspoint.com/java/java_string_split.htm
  182.                     и проанализировать - есть ли среди таких слов - равное переданному cssClass
  183.                     если есть - значит нужно вернуть соответствующий вебэлемент
  184.  
  185.                 */
  186. ....
  187.             public String toString() {
  188.                 return String.format("\nelements:", elementsLocator, "%s\n hasn`t thic class: %s\n", cssClass);
  189.             }
  190. /*
  191.     list of webElements located ....
  192.     should contain element with css class ...
  193.     while actual classes are ...
  194.  
  195.     схема - одна для любого кондишена
  196. */
  197. *************************************************
  198.  public static ExpectedCondition<WebElement> elementWithText(final By elementsLocator, final String exactText) {
  199.  
  200.  
  201.         return elementExceptionsCatcher(new ExpectedCondition<WebElement>() {
  202.             List<String> actualTexts;
  203.             private int index;
  204.  
  205.             public WebElement apply(WebDriver driver) {
  206.  
  207.                 actualTexts = new ArrayList<String>();
  208.                 List<WebElement> elements = driver.findElements(elementsLocator);
  209.                 for (WebElement element : elements) {
  210.                     actualTexts.add(element.getText());
  211.  
  212.                     if (actualTexts.get(index).equals(exactText)) {
  213.                         return element;
  214.                     }
  215.                 }
  216.                 /*
  217.                     сначала - собери actualTexts (используй getTexts(....)
  218.                     затем - анализируй список actualTexts
  219.                     если нашел строку в actualTexts равный exactText
  220.                     значит - возвращай соответствующий вебэлемент
  221.  
  222.                     а какой вебэлемент сооответствует = с таким же индексом, как найденная строка из actualTexts
  223.                 */
  224.  
  225.                 return null;
  226.             }
  227.  
  228.             public String toString() {
  229.                 return "element located" + elementsLocator + "\n should equals :      " + exactText + "\n actual texts are    " + actualTexts;
  230.             }
  231. /*
  232.     проработай toString()
  233.     примени все ту же схему
  234. */
  235. *************************************
  236. public class ToDoMvcPage {
  237.  
  238.  static By tasks = byCss("#todo-list>li");
  239. /*
  240.     это верно - нужен именно локатор
  241. */
  242.  
  243.   public static WebElement addTask =  $(byCss("#new-todo"));
  244. /*
  245.     а вот это - неверное решение
  246.     мы получим вебэлемент - в момент инициализации переменной = тогда когда начнем работать с пейджом
  247.     и дальше - будем оперировать этим вебэлементом
  248.  
  249.     хотя на странице - уже все изменилось
  250.     мы будем оперировать старым значением
  251.  
  252.     объяви тут - переменную типа By
  253.     и ее используй в методах - где нужно работать с соответствующим элементом
  254.  
  255.     локатор = это просто рассказ о том как искать элемент
  256.     нам как раз подходит такой вариант
  257. */
  258. *********************************
  259.     public static void add(String...taskTexts){
  260.         for (String text: taskTexts) {
  261.             addTask.sendKeys(text);
  262.             addTask.sendKeys(Keys.ENTER);
  263.             /*
  264.                 упрощай
  265.                 .sendKeys(text, Keys.ENTER);
  266.                 .sendKeys(text + Keys.ENTER);
  267.  
  268.                 посмотри на сигнатуру метода sendKeys - что за тип параметра у него
  269.             */
  270.         }
  271.     }
  272. **************************
  273.     public static void filterActive(){
  274.         $(byText("Active")).click();
  275.     }
  276. /*
  277.     By.linkText - это родной селениумский метод
  278.     и он в данном случае - поточнее будет)
  279. */
  280. **********************************************************
  281.     public static void  hover(String taskText){
  282.         Actions action = new Actions(getDriver());
  283.         action.moveToElement($(byText(taskText))).perform();
  284.     }
  285. /*
  286.     давай отделим одну задачу от другой
  287.  
  288.     нам нужно
  289.     1) получить вебэлемент = таску из списка тасок ( таску с таким-то текстом)
  290.     2) выполнить hover
  291.  
  292.     реализуй hover(WebElement element) - в ConciseAPI
  293.     ведь это универсальный метод - его можно использовать для любого элемента
  294.  
  295.     что мы в метоже делаем
  296.     верно - получаем new Actions(getDriver())
  297.     и вызываем  action.moveToElement( для элемента переданного
  298.     и заканчиваем perform()
  299.  
  300.  
  301.     и задача - получения веб элемента - таски по ее тексту  - из списка тасок
  302.  
  303.      у нас есть By tasks = локатор для списка тасок
  304.      у нас есть(точнее, будет только - т к кондишен надо доработать еще) кондишен - elementWithText
  305.  
  306.       чтоб получить нужный нам элемент списка -
  307.       нам нужно выполнить ждущую проверку для этого кондишена и этого списка
  308.       $(elementWithText(tasks, taskText))
  309.       такой метод WebElement $(ExpectedCondition <WebElement> conditionToWaitElement) - уже есть, с ним все ок уже
  310.  
  311.       и дальше - используй такой способ получить таску по ее тексту - $(elementWithText(tasks, taskText))
  312.       это сможешь сделать только когда сам кондишен будет в порядке
  313. */
  314. *********************************************
  315.     public static void delete(String taskText){
  316.         $$(exactTextsOf(tasks, taskText));
  317.         /*
  318.             первая проверка - не рабочая в общем случае
  319.  
  320.             т к проверяет - что в списке тасок - только одна таска с текстом taskText
  321.             а в общем случае - это не так
  322.  
  323.             да и не ужно нам проверять тексты тасок тут
  324.  
  325.             нам нужно - поулчить таску с таким-то текстом = $(elementWithText(tasks, taskText))
  326.             и дальше с ней работать
  327.             сначала - выполнить для нее ховер
  328.             затем - уже у этого вебэлемента=таски получить снутренний элемент = кнопку удаления таски
  329.             и на нее кликнуть
  330.         */
  331. *******************************************
  332.  public static void toggle(String taskText) {
  333.      $(byText(taskText));
  334.      /*
  335.         применяй для получения таски по ее тексту - только $(elementWithText(tasks, taskText))
  336.         и если нужно заюзать что-то внутреннее для вебэлемента - таски - то получай это уже у таски
  337.         WebElement element = .....;
  338.         element.findElement(innerElementLocator).....
  339.        
  340.         а вот так - когда мы минуя работу со списком тасок - получаем некий элемент с текстом taskText -
  341.         в более-менее приближенных к жизни ситуациях - найдем явно не то что нужно
  342.        
  343.         лучше быть точным
  344.         есть точное определение списка тасок - локатор
  345.         есть кондишен - позволяющий как результат ждущей проверки - получить нужный элемент списка
  346.         и уже  - у этого элемента - получай подчиненный элемент
  347.         и работай с ним
  348.        
  349.         в случае $(byCss(".toggle")) - ты всегда будешь получать первый на странице элемент с таким селектором
  350.         а нам не это нужно
  351.         нам для таски с текстом taskText это нужно
  352.        
  353.      */
  354.      $(byCss(".toggle")).click();
  355.  }
  356. ********************************************************************************
  357.  
  358.  public static WebElement startEdit(String oldTaskText, String newTaskText){
  359.      $(elementWithText(tasks, oldTaskText));
  360.      doubleClick();
  361. /*
  362.     то же самое
  363.     сначала - получи вебэлемент = таска с таким-то текстом
  364.     и уже для этого вебълемента = вызывай даблклик
  365. */
  366.      return $(elementWithCssClass(tasks, "editing"));
  367.      $(byCss(".edit")).sendKeys(newTaskText + Keys.ENTER);
  368. /*
  369.     код после return - не выполнится
  370.     return - вернули и вышли из метода
  371.    
  372.     а ам нужно - получить таску с классом editing - $(elementWithCssClass(tasks, "editing")) = хороший код
  373.     потом - у этого вебэлемента - найти его внутренний элемент с селектором ".edit"
  374.     ввести текст (энтер - рано выполнять - т к мы реализуем лишь startEdit)
  375.    
  376.     и вернуть наш метод должен - вот этот вебэлемент - с селектором ".edit"
  377.    
  378.     после ввода текста
  379.    
  380.     посмотри на изначальный код метода (в селенидовской версии)
  381.     тут - метод должен делать то же самое
  382.     с поправкой на способы получения элементов
  383.    
  384.     но логика - та же
  385.         получили элемент = таску с таким-то декстом
  386.         даблкликнули на ней
  387.         получили подчиненный элемент этой таски - с селектором ".edit"
  388.         ввели новое значение этому элементу (setValue = clear + sendKeys)
  389.         вернули этот элемент
  390. */    
  391. *********************************************
  392.  public static void doubleClick(){
  393.      Actions actions = new Actions(getDriver());
  394.      actions.doubleClick().perform();
  395.  }
  396. /*
  397.     у метода - должен быть параметр WebElement element
  398.     даблклик должен выполняться именно на нем
  399.    
  400.     и метод - как универсальный - должен жить в ConciseAPI
  401. */
  402. ***************************************
  403.     public static List<WebElement> $$(ExpectedCondition <List<WebElement>> conditionToWaitElement){
  404.         return assertThat(conditionToWaitElement);
  405.     }
  406. /*
  407.     как ты понимаешь - такого метода нам пока не надо
  408.    
  409.     пока не вижу пользы в его существовании
  410.    
  411.     но то уже сам решай - оставить его или нет)
  412. */
Advertisement
Add Comment
Please, Sign In to add comment