julia_v_iluhina

Untitled

Sep 8th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.31 KB | None | 0 0
  1.     @BeforeClass
  2.     public static void configure() {
  3.         Configuration.timeout = 20;
  4.     }
  5. /*
  6.     ты уверена. что это тебе нужно?
  7.  
  8.     такой код есть в 2-ух тест-классах из 4-х
  9.     если недостаточно таймаута - лучше в каждом тест-классе установи таймаут
  10.  
  11.     или еще одного предка тест-класса реализуй - с установленным нужным тебе таймаутом
  12.     лучше отдельным классом - чтобы не портить универсальную реализацию BaseTest
  13.  
  14.     просто получишь иерархию
  15.     BaseTest
  16.         AtTodoMVCBaseTest
  17.             TodoMVCTest
  18. */
  19. *******************************************
  20.   public static ExpectedCondition<WebElement> elementHasText(final By elementsLocator, final String expectedText) {
  21.   /*
  22.     по аналогии с другими кондишенами - точнее будет listElementHasText
  23.  
  24.  
  25.     для работы с todoMVC - логичнее было бы реализовать
  26.     listElementHasExactText
  27.     &
  28.     exactTexts
  29.  
  30.     как ты помнишь - нам тут нужны проверки более точные - тексты сверяае не на вхождение, а на равенство
  31.   */
  32.         ...
  33.             private String elementText;
  34.             private String actualText;
  35.         ...
  36.         /*
  37.             эти переменные не используются
  38.         */
  39.         ...
  40.                         WebElement element = elements.get(i);
  41.                         return element;
  42. /*
  43.     можно переписать проще = return elements.get(i);
  44. */            ...
  45.             public String toString() {
  46.                 return format("\n texts should contain: %s\n while actual text is %s\n list:%s ",
  47.                         expectedText, actualText, elementTexts);
  48.             }
  49. /*
  50.     сообщение странное
  51.     тут нам надо сказать
  52.     что список должен содержать элемент с таким-то текстом
  53.     в то время как факт = вот такие тексты в списке элементов
  54. */
  55. ************************************************
  56.    public static ExpectedCondition<WebElement> listElementHasClass(final By elementsLocator, final String cssClass) {
  57.         ...
  58.             private WebElement element;
  59.             /*
  60.                 не используется
  61.             */
  62. ....
  63.          public String toString() {
  64.                 return format("\n element with class %s\n should exist. While actual classes are: %s ",
  65.                         cssClass, elementClasses);
  66.             }
  67. /*
  68.     здесь и вооще во всех кондишенах
  69.     стоит строить фразу
  70.  
  71.     element of list located by ...
  72.     list located by ...
  73.     element located by ...
  74.     т е  - указать  - про что речь - что проверяем и уточнить локатор (что тоже важно)
  75.  
  76.     should ...
  77.     описываем expected
  78.  
  79.     while actual ...
  80.     описываем actual
  81.  */
  82.  ****************************************
  83.     public static ExpectedCondition<List<WebElement>> visibleTextsOf(final By elementsLocator, final String... expectedTexts) {
  84. /*
  85.     корректнее назвать textsOfVisible
  86.     а еще лучше = реализовать exactTextsOfVisible
  87.  
  88.     убери лишние комментарии в коде
  89. */
  90. ******************************************
  91.  public static ExpectedCondition<Boolean> noVisibleElementsInList(final By elementsLocator)
  92.  public static ExpectedCondition<Boolean> noElementsInList(final By elementsLocator) {
  93.  /*
  94.     достаточно было бы реализовать sizeOfVisible
  95.  
  96.     по аналогии с sizeOf
  97.  
  98.     это в большем количестве случаев пригодится
  99.  
  100.     а если хочется реализовать аналог empty
  101.  
  102.     то можно было бы дореализовать такую пару
  103.  */
  104.      public static ExpectedCondition<List<WebElement>> listIsEmpty(final By elementsLocator) {
  105.          return sizeOf(elementsLocator, 0);
  106.      }
  107.  
  108.      public static ExpectedCondition<List<WebElement>> listOfVisibleIsEmpty(final By elementsLocator) {
  109.          return sizeOfVisible(elementsLocator, 0);
  110.      }
  111. ****************************************
  112. //метод ниже падает
  113.  
  114. //    public static List<String> getTextsOfVisibleElements(final List<WebElement> elements) {
  115. ...
  116. /*
  117.     а тебе такой метод и не нужен
  118.  
  119.     у тебя чедусных 2 метода есть
  120.  
  121.     getVisibleElements - получила видимые элементы
  122.     getTexts - а теперь получила тесты
  123.  
  124.     или просто
  125.     getTexts - получила тексты всех элементов
  126.  
  127.     не надо ничего другого реализовывать
  128. */
  129. *********************************************
  130.  
  131.     public static <T> T executeJavaScript(String jsCode, Object... arguments) {
  132.         return (T) ((JavascriptExecutor) getDriver()).executeScript(jsCode, arguments);
  133.     }
  134.  /*
  135.     не поняла - зачем тебе тут использование дженериов
  136.  
  137.     мы не используем результат, который возвращает executeScript
  138.     из этих соображений можно наш метод реализовать как
  139.     public static void executeJavaScript(String jsCode, Object... arguments)
  140.  
  141.     если есть желание вернуть то же, что и executeScript
  142.     то тогда посмотри - что возвращает этот метод
  143.     и используй єти знания
  144.  
  145.     место этого метода - в ConciseAPI
  146.     метод универсальный
  147.     и тоже - обеспечивает нам более простую работу с селениумом
  148.  */
  149. *********************************************************
  150.  
  151. getDriver().findElement(cssSelector("#new-todo")).sendKeys(tasksText + Keys.ENTER);
  152.  
  153. /*
  154.     в ConciseAPI реализуй метод
  155.     WebElement setValue(WebElement element, String text)
  156.  
  157.     и тут сможешь переписать код
  158.     setValue($("#new-todo"), tasksText + Keys.ENTER)
  159.  
  160.     согласись, код будет поприятнее)
  161.  
  162. */
  163.  
  164. ************************************************
  165.  
  166.     public static void hover(WebElement element) {
  167.         Actions actions = new Actions(getDriver());
  168.         actions.moveToElement(element).build().perform();
  169.     }
  170. /*
  171.     build().perform() vs perform()
  172.  
  173.     http://stackoverflow.com/questions/29071144/wbdriver-actions-build-perform
  174.  
  175.     http://stackoverflow.com/questions/16435798/webdriver-actions-perform-or-actions-build-perform
  176.  
  177.     http://www.ufthelp.com/2014/11/working-with-action-class-in-selenium.html
  178. */
  179. *******************************************************
  180.  
  181. assertThat(elementHasText(tasks, oldTaskText))).findElement(byCss("label"))
  182.  
  183. /*
  184.     в ConciseAPI реализуй метод
  185.     WebElement $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementCssSelector)
  186.  
  187.     который
  188.         выполнит проверку assertThat(conditionToWaitParentElement)
  189.         и от ее результата - вебэлемента
  190.         получит его внутренний элемент по селектору innerElementCssSelector
  191.  
  192.     фактически - твой код - достаточно просто формализовать
  193.     метод практически написан
  194.  
  195.     и тогда ты сможешь методу doubleClick
  196.     передать параметр $( elementHasText(tasks, oldTaskText), byCss("label") )
  197.  
  198.         elementHasText(tasks, oldTaskText) - дождались и получили элемент списка с таким текстом
  199.         а потом у этого элемента получили внутренний элемент .findElement(byCss("label")
  200.         и уже этот элемент - вернули
  201.  
  202.     когда реализуешь такое метод
  203.     попробуй реализовать и вариант
  204.     WebElement  $(ExpectedCondition<WebElement> conditionToWaitParentElement, By innerElementLocator)
  205.     такой вариант будет более унивенсальным
  206.     понимаешь, почему?
  207.  
  208.     аналогично - упростится вторая часть startEdit
  209.     там где нужно установить новій текст для таски
  210.     этот же метод
  211.      WebElement $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementCssSelector)
  212.      позволит получить таску в режиме редактирования
  213.      правда, кондишен нужен другой
  214.      и у такой таски - получить внутренний элемент .edit
  215.  
  216.      и вот для так полученного вебэлемента - уже и вызовешь setValue
  217.      а поскольку setValue возвращает тот же вебэлемент, с которым мы работали
  218.      то ты в startEdit сможешь вернуть setValue(....)
  219. */
  220. *****************************
  221.     public static void clickOutSide() {
  222.         $("#footer").click();
  223.     }
  224. /*
  225.     а это я недосмотрела еще в селенидовской версии)
  226.  
  227.     во-первых - не стоило выделять это действие в отдельный метод
  228.     т к оно нужно только для реализации ConfirmEditByClickOutside
  229.  
  230.     правильнее - как раз реализовать
  231.     ConfirmEditByClickOutside
  232.         в котором будет вызов
  233.         startEdit + клик на чем-то вне  редактируемой таски
  234.             так ты получишь более KISS вариант
  235.             не разделяй на 2 метода то, что используется только вместе и только в определенной последовательности
  236.  
  237.  
  238.     на чем лучше кликать
  239.     ты права - что лучше кликать на таком элементе, по клику на который ничего,
  240.     кроме смены фокуса, не происходит
  241.      $("#footer") - один из таких вариантов
  242.         но есть вариант и получше
  243.         кликать на чем-то, что уже используется
  244.         например на $("#new-todo")
  245.         так мы уменьшим количество независимых селекторов
  246.             а так - получишь более DRY
  247. */
  248. ********************************
  249. ppublic static void delete(String taskText) {
  250. /*
  251.     и тут используй методы
  252.  
  253.     в первой строке -
  254.      WebElement  $(ExpectedCondition<WebElement> conditionToWaitElement)
  255.      (похож на выше разъясненный, только внутренний элемент не ищем)
  256.  
  257.     во второй строке
  258.      WebElement $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementCssSelector)
  259. */
  260. ***********************************
  261. public static void toggle(String taskText) {
  262. /*
  263.     и тут примени
  264.     WebElement $(ExpectedCondition<WebElement> conditionToWaitParentElement, String innerElementCssSelector)
  265.  
  266. */
  267. *********************************************
  268.  public static void refresh() {
  269. /*
  270.     более универсально это делать
  271.      getDriver().navigate().refresh();
  272.  
  273.       http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html
  274.       http://nadimsaker.blogspot.com/2014/09/how-to-refresh-or-reload-page-in.html
  275.  
  276.      как думаешь - где расположить такой универсальный метод ?
  277. */
Advertisement
Add Comment
Please, Sign In to add comment