julia_v_iluhina

Untitled

Jan 20th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 15.90 KB | None | 0 0
  1. Запутался по строками 31-40 в классе ConciseApi
  2. Не работают описанные в ревью конструкции и если честно потерял нить почему нам нужно сделать так.
  3. /*
  4.     таки да, запутался)
  5.     сейчас распутаемся
  6.  
  7.     сначала - твой код прокомментирую
  8.     ниже - приведу конечный вариант и тоже прокомментирую
  9. */
  10.     public static WebElement $(ExpectedCondition<WebElement> conditionToWaitElement) {
  11.         return $(assertThat(elementLocator));
  12.     }
  13.     /*
  14.         у метода - параметр = кондишен, который обеспечивает умное ожидание
  15.         именно его и надо использовать для ожидания- conditionToWaitElement
  16.  
  17.         изначально - у нас был метод $ реализован с использованием
  18.         assertThat(visibilityOfElementLocated(elementLocator));
  19.         дождались видимости, и затем вернули этот веб элемент
  20.  
  21.         т е - самый универсальный из методов $ - БЫЛ WebElement $(By elementLocator)
  22.         вот в нем = мы вызывали assertThat(visibilityOfElementLocated(elementLocator)); =
  23.         реализовывали сам алгоритм методов $
  24.         а в остальных методах $ (например WebElement $(String cssSelector) ) - мы бы переиспользовали
  25.         самый универсальный, ранее разработанный метод WebElement $(By elementLocator)
  26.  
  27.         ТЕПЕРЬ самый универсальный -
  28.             не WebElement $(By elementLocator)
  29.             а  WebElement $(ExpectedCondition<WebElement> conditionToWaitElement)
  30.         и именно он будет реализован по сути
  31.         остальные методы $ - будут его переиспользовать (тоже в 2 приема это сделаем)
  32.  
  33.         по реализации метода WebElement $(ExpectedCondition<WebElement> conditionToWaitElement)
  34.             разбираем код
  35.                 return $(assertThat(elementLocator));
  36.             elementLocator - у нас нет такого параметра вообще
  37.             выражение assertThat(elementLocator) - не имеет смысла
  38.             а нам ведь передали - кондишен, который нужно использовать для ожидания
  39.             assertThat(conditionToWaitElement) - как раз и вернет нам нужный веб элемент
  40.             передавать этот веб элемент как параметр какому-то еще методу $ - уже не нужно
  41.             т е - код этого метода =
  42.                  return assertThat(conditionToWaitElement);
  43.     */
  44.  
  45.  
  46.     public static WebElement $(By conditionToWaitElement) {
  47.     /*
  48.         если параметр типа By - то почему он называется conditionToWaitElement?
  49.         логичнее было бы назвать этот параметр - By elementLocator
  50.     */
  51.         return $(visibilityOfElementLocated(elementLocator));
  52.         /*
  53.             по сути реализации
  54.             давай пока забудем про переиспользование ранее азработанных методов $
  55.  
  56.             что нам надо сделать
  57.             нам надо дождаться видимости элемента по локатору
  58.             как это сделать
  59.             assertThat(visibilityOfElementLocated(elementLocator))
  60.  
  61.             а если учесть ранее реализованный $(ExpectedCondition<WebElement> conditionToWaitElement)
  62.             то код этого метода, верно, такой, как ты и написал
  63.              return $(visibilityOfElementLocated(elementLocator));
  64.             НО - он будет ОК - если у метода параметром будет By elementLocator
  65.             иначе - естественно, тебе Идея сообщает об ошибках
  66.             т к оперируешь в методе тем, чего нету
  67.         */
  68.     }
  69.  
  70.     public static WebElement $(String elementLocator) {
  71.     /*
  72.         если параметр типа String - то это точно не локатор
  73.         я писала - что хорошо бы реализовать метод
  74.         принимающий как параметр  - цсс селектор
  75.         вот такой вариант
  76.         WebElement $(String cssSelector)
  77.     */
  78.         return assertThat(visibilityOfElementLocated(elementLocator));
  79.         /*
  80.             Снова разбираемся, что нам нужно сделать
  81.             нам по селектору - нужно получить локатор By
  82.             это = byCss(cssSelector)
  83.  
  84.             Далее - как в предыдущем методе - мы можем полученный локатор передать в visibilityOfElementLocated
  85.             и для такого кондишена - выполнить ждущую проверку
  86.  
  87.             получим
  88.             return assertThat(visibilityOfElementLocated(byCss(cssSelector)));
  89.  
  90.             а если вспомнить про реализованный предыдущий метод - WebElement $(By elementLocator)
  91.             то
  92.             return $(byCss(cssSelector));
  93.  
  94.             такая замена assertThat-ов вызовами нужного варианта метода $ - призвана упростить код
  95.             сделать его проще и лаконичнее, убрать повторения = сделать код более DRY
  96.  
  97.             если тебе в таком коде тяжело ориентироваться
  98.             то для начала - откажись от идеи переиспользования методов $ в других методах $
  99.  
  100.             ниже - я приведу вариант без переиспользования
  101.             затем - с переиспользованием
  102.  
  103.             ты кстати можешь так себя проверять
  104.             зажав ctrl кликай на вызов метода - разбирайся, какой будет вызван
  105.             это на первых порах облегчит тебе жизнь
  106.         */
  107.     }
  108. //вариант  без переиспользования методов $
  109.     publc static WebElement $(ExpectedCondition<WebElement> conditionToWaitElement) {
  110.         return assertThat(conditionToWaitElement);
  111.     }
  112.  
  113.     public static WebElement $(By elementLocator) {
  114.        return assertThat(visibilityOfElementLocated(elementLocator));
  115.     }
  116.  
  117.     public static WebElement $(String cssSelector) {
  118.         return assertThat(visibilityOfElementLocated(byCss(cssSelector)));
  119.     }
  120. //а теперь - то же самое, только когда каждый следующий метод $ - переиспользует ранее разработанный
  121.     public static WebElement $(ExpectedCondition<WebElement> conditionToWaitElement) {
  122.         return assertThat(conditionToWaitElement);
  123.     }
  124.  
  125.     public static WebElement $(By elementLocator) {
  126.        return $(visibilityOfElementLocated(elementLocator));
  127.     }
  128.  
  129.     public static WebElement $(String cssSelector) {
  130.         return $(byCss(cssSelector));
  131.     }
  132. /*
  133.     оба варианта кода - делают одно и то же
  134.     только второй вариант - более DRY
  135. */
  136. **********************************************************************************************************
  137. в Todo MVC сложность со строкой 47, вроде бы все согласно логике, которая реализована с помощью Selenide, однако не получается разобраться со строкой.
  138.  
  139.     $(ExpectedCondition<WebElement> conditionToWaitParentElement, By innerElementLocator){
  140.         return assertThat(elementWithText(tasks, text),innerElementLocator);
  141.     }
  142.  
  143.     $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementLocator){
  144.         return assertThat(elementWithText(tasks, text), innerElementLocator);
  145.     }
  146. /*
  147.     нам нужны такие методы - не на уровне пейджа, а на уровне ConciseAPI
  148.     а для этого - такие методы должны быть универсальными
  149.  
  150.     ты верно заметил
  151.     что за основу - берем код assertThat(elementWithText(tasks, text)).findElement(...)
  152.     собственно - это и будем реализовывать
  153.     но - перейдем к универсальным терминам
  154.  
  155.     цель - реализовать метод
  156.     WebElement $(ExpectedCondition<WebElement> conditionToWaitParentElement, By innerElementLocator)
  157.  
  158.     который
  159.         получит родительскй вебэлемент, использовав ждущую проверку  conditionToWaitParentElement
  160.             WebElement parentElement = assertThat(conditionToWaitParentElement);
  161.         затем - у родительского єлемента получит его внутренний єлемент по локатору innerElementLocator
  162.             return parentElement.findElement(innerElementLocator)
  163.     т е
  164. */
  165.  public static WebElement $(ExpectedCondition<WebElement> conditionToWaitParentElement, By innerElementLocator) {
  166.     WebElement parentElement = assertThat(conditionToWaitParentElement);
  167.     return parentElement.findElement(innerElementLocator);
  168.  }
  169.  //или - короче, в одну строку
  170.   public static WebElement $(ExpectedCondition<WebElement> conditionToWaitParentElement, By innerElementLocator) {
  171.      return assertThat(conditionToWaitParentElement).findElement(innerElementLocator);
  172.   }
  173.  /*
  174.     дальше - как реализовать WebElement $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementСssSelector)
  175.  
  176.     по большому счету - разница  - только в способе получения снутреннего элемента
  177.     раньше у нас уже был локатор
  178.     а теперь - его надо получить по css selector-у
  179.  
  180.     если ничего не переиспользовать то получим
  181.  */
  182.   public static WebElement $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementСssSelector) {
  183.      return assertThat(conditionToWaitParentElement).findElement(byCss(innerElementСssSelector));
  184.   }
  185. //а если переиспользовать ранее разработанный   WebElement $(ExpectedCondition<WebElement> conditionToWaitParentElement, By innerElementLocator)
  186.   public static WebElement $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementСssSelector) {
  187.      return $(conditionToWaitParentElement, byCss(innerElementСssSelector));
  188.   }
  189. /*
  190.     заметь - внутри этих методов мы вообще не оперируем ничем конкретным из пейджа
  191.     все - универсально
  192.     мы пережли от терминов пейджа к универсальным терминам
  193.     универсальное - располагай в ConciseAPI
  194.  
  195.     а в пейдже - будешь использовать это
  196.     к примеру
  197.     вместо $(elementWithText(tasks, taskText)).findElement(byCss(".toggle")).click();
  198.     будет  $(elementWithText(tasks, taskText), ".toggle").click();
  199. */
  200. ***************************************************
  201. Я так понимаю, что с методом StartEdit получиться разобраться, когда будут готовы методы
  202. $(ExpectedCondition<WebElement> conditionToWaitParentElement и т.д.
  203. Тогда бы мне не помешала подсказка по поводу их реализации)
  204.  
  205. //давай вернемся к селенидовской версии этого метода и ее разберем
  206.     private SelenideElement startEdit(String oldTaskText, String newTaskText) {
  207.         tasks.find(exactText(oldTaskText)).doubleClick();
  208.         return tasks.findBy(cssClass("editing")).$(".edit").setValue(newTaskText);
  209.     }
  210. /*
  211.     мы возвращали - SelenideElement = элемент $(".edit") внутри редактируемой таски
  212.     после ввода нового значения в этот элемент
  213.  
  214.     теперь мы будем возвращать все тот же элемент и после тех же действий
  215.     только тип будем использовать не SelenideElement
  216.     а WebElement
  217.  
  218.     т е сигнатура метода будет
  219.     private WebElement startEdit(String oldTaskText, String newTaskText)
  220.  
  221.     теперь разбираем первую строку
  222.     нам нужен даблклик на таске с такми-то текстом
  223.  
  224.         как мы теперь получаем таску с таким-то текстом
  225.         $(elementWithText(tasks, taskText))
  226.         и на ней нужно - даблкликнуть
  227.         doubleClick($(elementWithText(tasks, taskText)))
  228.  
  229.         если такой код не будет работать - то таску нужно уточнить до label
  230.         как мы делали в задании по Downgrade Selenide to 2.17
  231.         doubleClick($(elementWithText(tasks, taskText), "label"))
  232.  
  233.     по второй строке
  234.         нам нудно получить таску в режиме редактирования
  235.         т е - таску с классом editing
  236.  
  237.         ты для этого писал специальный кондишен elementWithCssClass
  238.         его и применим
  239.         $(elementWithCssClass(tasks, "editing")) - как раз такая таска
  240.         далее - нам нужно уточниться до ее внутреннего элемента  $(".edit")
  241.         $(elementWithCssClass(tasks, "editing"), ".edit")
  242.  
  243.         и вот для этого элемента - нужно ввести новый текст
  244.         и его - этот элемент  - нужно вернуть
  245. */
  246.  
  247.      private WebElement startEdit(String oldTaskText, String newTaskText)
  248.         doubleClick($(elementWithText(tasks, taskText), "label"));
  249.         WebElement inputEdit = $(elementWithCssClass(tasks, "editing"), ".edit");
  250.         setValue(inputEdit, newTaskText);
  251.         return inputEdit;
  252.     }
  253.    
  254. // а если setValue чуть доработать
  255.    public static WebElement setValue(WebElement element, String task) {
  256.         element.clear();
  257.         element.sendKeys(task);
  258.         return element
  259.    }    
  260. // то и   startEdit можно переписать лаконичнее
  261.      private WebElement startEdit(String oldTaskText, String newTaskText)
  262.         doubleClick($(elementWithText(tasks, taskText), "label"));
  263.         return setValue($(elementWithCssClass(tasks, "editing"), ".edit"), newTaskText);
  264.     }
  265. //тогда уже разумно и другие методы для работы с веб элементом - подправить как подправили setValue
  266. //пусть возвращают WebElement
Advertisement
Add Comment
Please, Sign In to add comment