julia_v_iluhina

Untitled

Jan 27th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.89 KB | None | 0 0
  1.     public static WebElement $(By elementsLocator, String text) {
  2.         return assertThat(elementHasText(elementsLocator, text));
  3.     }
  4. /*
  5.     ну, если не знать задачки - догадаться будет не просто)
  6.     что за метод
  7.     что он принимает и как работает
  8.     если уже такое реализовывать (я например - не уверена - что стоит)
  9.     то вот так
  10.  
  11.     реализуем самый универсальный вариант
  12.     public static WebElement $(ExpectedCondition<WebElement> conditionToWaitElement)
  13.         который будет возвращать assertThat(conditionToWaitElement);
  14.  
  15.     в методе - public static WebElement $(By locator)
  16.         уже используем ранее реализованный универсальный - $(visibilityOfElementLocated(locator));
  17.  
  18.     реализацию public static WebElement $(String cssSelector)  - оставила бы как у тебя
  19.  
  20.     я бы на этом и остановилась)
  21.         и там где нужно элемент получить по его тексту - вот так бы получала - $(elementHasText(tasks, "task1"));
  22.         оно конечно - чуть длиннее чем                                         $(tasks, "task1");
  23.         но как-то попонятнее)
  24.         и думать не нужно - как в методе параметры назвать )
  25.  
  26.     а если таки идти дальше, как ты пошел
  27.         то изменить имена параметров -  WebElement $(By elementsLocator, String elementText)
  28.         будет чуть попонятнее
  29.  
  30.     а если учесть - что еще и вариант получения таски по ее классу нужен, и мы про текст - метод реализовали
  31.         то почему бы и для такого варианта метод не реализовать - WebElement $(By elementsLocator, String elementCssClass)
  32.  
  33.     мне эти последние 2 метода кажутся слишком сложными
  34.     я бы все равно заглядывала - как они реализованы
  35.     так что - я б их не реализовывала
  36.     настаивать не буду - чтоб и ты придерживался тех же взглядов
  37.     оставишь - подравняй имена методов
  38. */
  39. *******************************************************
  40.     public static WebElement $(By parentLocator, String text, By innerLocator) {
  41.         return assertThat(waitParentElement(parentLocator, text, innerLocator));
  42.     }
  43. /*
  44.     сходу и не разберешься)
  45.     как метод работает и чего он дожидается )
  46. */
  47. *********************************************
  48.    public static ExpectedCondition<WebElement> waitParentElement(
  49.             final By parentLocator
  50.             , final String text
  51.             , final By innerLocator) {
  52.  
  53.  
  54. ....
  55.                     if (parentElement.findElement(innerLocator) != null && parentElement.getText().equals(text)) {
  56.                         return parentElement.findElement(innerLocator);
  57. /*
  58.     т е - по сути - что мы делаем
  59.     ищем родительский элемент с таким-то текстом
  60.     а когда нашли - получем его внутренний элемент по локатору
  61.  
  62.     так у нас уже все есть)
  63.     кондишен elementHasText - найдет элемент
  64.     а дальше - уточнимся
  65.  
  66.     т е - вот такой код - $(elementHasText(tasks, "task1")).findElement(...);
  67.     а в самом задании было предложено - реализовать методы
  68.      $(ExpectedCondition<WebElement> conditionToWaitParentElement, By innerElementLocator)
  69.      $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementCssSelector)
  70.     которые по сути - реализованы как $(conditionToWaitParentElement).findElement(...);
  71.  
  72.     т е - работаем так
  73.         дожидаемся чего-то там для родительского элемента
  74.         а затем - получаем внутренний элемент
  75.  
  76.     тут мы рассчитываем - что если наш элемент догрузился
  77.         то уже его внутренний элемент - тоже
  78.  
  79.     допускаю - что так не всегда бывает
  80.         в данном нашем случае - для todoMVC - это так
  81.         а далее на курсе - мы и покрасивее версию реализуем
  82.         и уйдем от не красивого)
  83.         но это еще не скоро)
  84.  
  85.     резюме
  86.         такой кондишен тебе не нужен
  87.         а вот методы
  88.             $(ExpectedCondition<WebElement> conditionToWaitParentElement, By innerElementLocator)
  89.             и
  90.             $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementCssSelector)
  91.         нужны
  92.  
  93.             будешь потом их использовать в стиле $(elementHasText(tasks, "task1"), ".toggle")
  94. */
  95.         // TODO: 26.01.2017 override toString()
  96. /*
  97.     ага)
  98.     если что-то не можешь назвать или описать - задумайся)
  99.     часто бывает - что такого рода объект и не нужен
  100.     либо вместо него нужно несколько разных, илбо еще что-то)
  101.  
  102.     следствие Single Responsibility Principle
  103.  
  104.     если он для класса не выполняется - будут такого рода затруднения)
  105. */
  106.  
  107. ************************************************
  108. public static ExpectedCondition<WebElement> elementHasText(
  109.             final By elementsLocator
  110.             , final String expectedText) {
  111.  
  112.      ...
  113.             public String toString() {
  114.                 return String.format("\nText of elements,"
  115.                                 + "\nfound with elementsLocator - %s"
  116.                                 + "\nShould be: %s"
  117.                                 + "\nActual: text not found\n"
  118.                         , elementsLocator.toString()
  119.                         , expectedText);
  120.             }
  121. /*
  122.     реализация apply - да, все ок будет работать
  123.     но вот сообщение в toString() - буду критиковать
  124.  
  125.     toString() - просто описание объекта
  126.     неважно в какой момент
  127.  
  128.     указывая в выражении - Actual: text not found
  129.     ты опираешься на свои зания, что toString() кондишена вызывается именно при падении проверки
  130.  
  131.     т е - реализуешь toString()  - как зависимое от контекста вызова выражение
  132.     избегай таких решений
  133.  
  134.     в toString()  - просто опиши
  135.         что проверяли
  136.         для чего проверяли
  137.         что ждали
  138.         что оказалось в реальности
  139.     как видишь - никаких выводов - что нашли/чего не нашли
  140.         только рассказ про объект
  141.  
  142.     эта схема должна применяться для любого кондишена
  143.         в данном случае - про реальность если рассказывать - то надо бы рассказать о текстах всех элементов
  144.  
  145. */
  146. **********************************************************************
  147. public static ExpectedCondition<List<WebElement>> visibleTextOf(
  148.             final By locator
  149.             , final String... texts) {
  150. /*
  151.     читаем имя кондишена = видимый текст (один) того-то
  152.     а на самом деле - мы проверяем текстЫ видимых того-то = textsOfVisible(...
  153.     или - точнее - exactTextsOfVisible (ну, у тебя реализован вариант textsOfVisible,
  154.     хотя для текущей задачи уместнее біло реализовать exactTextsOfVisible
  155.  
  156.     имена параметров - тоже мало помогают
  157.     By elementsLocator - было бы информативнее - так бы мы видели - что работаем с элементами(списком)
  158.  
  159.     форматирование - не стандартное, реформатируй код
  160. */
  161.         return elementExceptionsCatcher(new ExpectedCondition<List<WebElement>>() {
  162.  
  163.             private List<String> actualTexts = new ArrayList<String>();
  164.             private List<WebElement> elements;
  165.  
  166.             public List<WebElement> apply(WebDriver driver) {
  167.  
  168.                 actualTexts.clear();
  169.                 elements = driver.findElements(locator);
  170.                 for (WebElement element : elements) {
  171.                     if (!element.getText().equals("")) {    // костылёк :) - наш локатор почему-то
  172.                         // при одной таске выгребает еще 2-ю пустую стрингу :(
  173.                         actualTexts.add(element.getText());
  174.                     }
  175.                 }
  176.                 /*
  177.                     реши задачу в 2 приема)
  178.                     сначала - получи список видимых элементов
  179.                     чтобы узнать - видим элемент или нет - проверяй - element.isDisplayed()
  180.                     element.getText() для невидимого элемента возвращает пусто
  181.                     https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/6415
  182.                     почитай обсуждение - в общем - это логично)
  183.                     какая разница, какой текст у не видимого элемента)
  184.                     его же не видно, он может быть вообще любым и никто разницы не оценит)
  185.  
  186.                     потом - для списка видимых элементов получи их тексты
  187.  
  188.                     т к получение текстов по списку веб-элементов - задача, которая нужна в нескольких кондишенах
  189.                     то вынеси этот метод в класс универсальных статических методов List<String> getTexts(List<WebElement> elements)
  190.                     и используй его
  191.  
  192.                     решение задачи в 2 шага - позволит тебе переиспользовать
  193.                         и получение видимых элементов по списку вебэлементов
  194.                         и получение текстов элементов по списку вебэлементов
  195.                 */
  196. ************************************************************
  197.    public static ExpectedCondition<List<WebElement>> sizeOfVisible(final By locator) {
  198.  
  199.         return elementExceptionsCatcher(new ExpectedCondition<List<WebElement>>() {
  200.  
  201.             public List<WebElement> apply(WebDriver driver) {
  202.  
  203.                 List<WebElement> elements = driver.findElements(locator);
  204.                 List<WebElement> visibleElements = new ArrayList<>();
  205.  
  206.                 for (WebElement element : elements) {
  207.                     if (element.isDisplayed()) {
  208.                         visibleElements.add(element);
  209.                     }
  210.                 }
  211.                 return visibleElements;
  212.             }
  213.         });
  214.  
  215.         // TODO: 26.01.2017 override toString()
  216.     }
  217. /*
  218.     ну ок - собираешь список видимых элементов - это ок
  219.  
  220.     так а размер проверить?
  221.     сейчас - вообще не важно какой размер у списка
  222.     вернем его да и все
  223.     а у кондишена цель = обедиться, что размер списка = ....
  224.  
  225.     только тут мы должны оперировать
  226.     не всем списком элементов, найденных по локатору
  227.     а лишь теми, которые видимы
  228.  
  229.     посмотри на ранее реализованный sizeOf
  230.  
  231.     и на toString() его - тоже посмотри
  232. */
  233. *********************************
  234. JavascriptExecutor js = (JavascriptExecutor) getDriver();
  235. ...
  236. js.executeScript("location.reload()");
  237. /*
  238.     реализуй в ConciseAPI  - метод  executeJavaScript
  239.     будешь в качестве параметра - передавать текст команды
  240. */
  241. ****************************************
  242.   Actions ac = new Actions(getDriver());
  243.   ac.moveToElement(focusOnDeletedTask).perform();
  244. /*
  245.     реализуй в ConciseAPI методы
  246.  
  247.      actions()
  248.  
  249.      WebElement hover(WebElement element)
  250.      метод будет выполнять действие над элементом
  251.      и возвращать тот же элемент
  252.  
  253.      чтоб потом можно было такое писать hover($(...)).findElement(...)....
  254.  
  255.      doubleClick() - похоже релизуй
  256. */
  257. ******************************
  258.     public void assertNoVisibleTasks() {
  259.         assert assertThat(sizeOfVisible(tasks)).size() == 0;
  260.     }
  261. /*
  262.     вот это - если и работает
  263.     то только благодаря быстрой загрузке приложения
  264.  
  265.     а общем случае - не должно)
  266.  
  267.     sizeOfVisible сейчас реализован так
  268.     что уже после первого выполнения apply - ждущая проверка закончится
  269.  
  270.     после корректировки sizeOfVisible -
  271.     тут код будет проще
  272.     assertThat(sizeOfVisible(tasks), 0)
  273.  
  274.     ассерт проверять ассертом - не, так не надо)
  275. */
  276. ******************************************************
  277.     public void assertItemsLeft(int itemsLeft) {
  278.         assertThat(elementHasText(By.cssSelector("#todo-count>strong"), Integer.toString(itemsLeft)));
  279.     }
  280. /*
  281.     ну, оно может и работает)
  282.     но на самом деле - тут такого не надо)
  283.  
  284.     нам не надо по селектору "#todo-count>strong"
  285.     искать СПИСОК вебэлементов
  286.     и выбирать среди них такой у которого текст = ...
  287.  
  288.     нам просто - нужно получить элемент по локатору и проверить его текст
  289.     посмотри в сторону стандартных кондишенов)
  290.     https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html
  291. */
  292. ********************************************
  293. ublic WebElement startEdit(String oldTaskName, String newTaskName) {
  294.  
  295.         WebElement focusOnEditTask = $(tasks, oldTaskName);
  296.         Actions ac = new Actions(getDriver());
  297.         ac.doubleClick(focusOnEditTask)
  298.                 .sendKeys(Keys.chord(Keys.CONTROL, "a") + Keys.DELETE)
  299.                 .sendKeys(newTaskName).perform();
  300.         return focusOnEditTask;
  301.     }
  302. /*
  303.     сложно)
  304.     и не факт что работает
  305.  
  306.     посмотри - на селенидовскую версию этого метода
  307.  
  308.     сначала - мы даблкликали на таске с таким-то текстом
  309.     потом - мы таску искали по классу editing
  310.     и у нее - получали внутренний элемент ".edit"
  311.     в котором - вводили текст
  312.  
  313.     про  doubleClick - выше писала - реализуй метод
  314.  
  315.     аналогично тому, как ты с помощью кондишена elementHasText
  316.     получаешь таску с таким-то текстом
  317.  
  318.     реализуй и примени кондишен elementHasCssClass
  319.     и получи таску с таким-то классом
  320.  
  321.     по setValue - это последовательный вызов методов для веб-элемента
  322.         clear
  323.         sendKeys
  324.        
  325.     setValue - реализуй в ConciseAPI
  326. */
Advertisement
Add Comment
Please, Sign In to add comment