julia_v_iluhina

Untitled

Oct 30th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.41 KB | None | 0 0
  1.  public static void doubleClick(WebElement element){
  2.         Actions action = new Actions(getDriver());
  3.         action.moveToElement(element).doubleClick().perform();
  4.  }
  5. /*
  6.     для даблклика - moveToElement(element) - не нужно делать
  7.  
  8.     можно кстати реализовать метод actions
  9.     возвращающий new Actions(getDriver())
  10.     может кому-то пригодиться
  11. */
  12. *************************************
  13. public static List<WebElement> $$(ExpectedCondition<List<WebElement>> conditionToWaitForListFilteredElements)
  14. /*
  15.     не согласна с именем параметра conditionToWaitForListFilteredElements
  16.  
  17.     это  - просто conditionToWaitForList
  18.     или даже condition - т к тип параметра дает остальные пояснения
  19.  
  20.     он может быть любым
  21.     главное - чтобы вот такого типа ExpectedCondition<List<WebElement>>
  22.     и чтобы отвечал нашим потребностям
  23. */
  24. *********************************
  25. /*
  26.     порядок методов в ConciseAPI
  27.  
  28.     технически - может быть любым
  29.  
  30.     но чтобы быстрее приходило понимание - разумно применять некую логику и в порядке методов
  31.  
  32.     от общего к частному
  33.     сначала - ассерты
  34.     потом - $ и $$
  35.     причем - сначала более простые варианты, потом посложнее
  36.     сначала более универсальный вариант, потом - тот, который этот универсальый переиспользует
  37.  
  38.     рядом друг с другом - методы, возвращающие By
  39.  
  40.     ну и вначале, конечно
  41.     поле для драйвера + геттер-сеттер
  42.  
  43.     не настаиваю, но очень рекомендую )
  44. */
  45. ************************
  46. http://joxi.ru/Vrwqg81HKl0xY2
  47. /*
  48.     actualTexts - используется на уровне класса кондишена - в его методах apply & toString
  49.     вот и объяви переменную там
  50.     заодно и не понадобится ее объявлять как final
  51.  
  52.     actualElements - вообще только в apply используется
  53.     вот в apply и объявляй
  54.     и тоже не понадобится ее объявлять как final
  55.  
  56.     посмотри - как ты это делала в кондишене sizeOf
  57.     listSize - объявила на уровне класса-кондишена
  58.     elements - внутри apply
  59.  
  60.     ну и при инициализации этих списков тебе не понадобится addAll
  61.     да и не факт, что будет нужен clear
  62.     для actualElements - так точно не будет нужен
  63.  
  64.     код станет проще
  65.  
  66. */
  67. *******************************
  68.   public static ExpectedCondition<List<WebElement>> exactTextOfVisibleElements(final By elementsLocator, final String... expectedTexts){
  69. /*
  70.     уточни в имени кондишена exactText__s___    -   не поняла как:(
  71. */
  72. /*
  73.  
  74.     exactTextOfVisibleElements (сейчас кондишен называется)
  75.     exactTextsOfVisibleElements (вот так я предлагаю изменить)
  76.  
  77.     буквы одной не хватает
  78.     в прошлый раз выделила ее в комментарии
  79. */
  80. *********************************
  81. elementWithCssClassAndText
  82. /*
  83.     в этом кондишене, в его apply
  84.     в один обход - собираешь информацию про классы и тексты
  85.     и тут же ее анализируешь
  86.     и найдя элемент - сразу его возвращаешь
  87.  
  88.     в целом - все ок
  89.     оптимально - не делаем никаких лишних действий
  90.  
  91.     toString кондишена вызывается в случае - если проверка не прошла
  92.     значит - на момент вызова toString - все списки будут собраны
  93.  
  94.     если конечно по пути не возникнет какого-то исключения)
  95.     это первое если)
  96.  
  97.     а второй момент
  98.     toString любого класса - это способ приведения объекта к строке
  99.     и было бы логично - при проектировании toString
  100.     не думать про то - когда мы его вызываем
  101.     а думать про корректное описание объекта
  102.     вне зависимости от обстоятельств
  103.  
  104.     из этих соображений - разумнее собрать классы и тексты - в списки заранее
  105.     getTexts - уже есть такой метод для сбора текстов
  106.     реализуй и getClasses - и тожеего используй
  107.     и уже после того - как списки собраны - анализируй их
  108.  
  109.     согласна - мы проиграем в скорости
  110.     не думаю, что прямо катастрофически
  111.     зато код будет проще и корректнее
  112.     ну и надежнее тоже
  113.  
  114. */
  115. ***********************************
  116. if (isElementHasCssClass(element, cssClass)){
  117.    if (element.getText().equals(exactText)) {
  118. /*
  119.     можно вместо вложенных if-ов использовать оператор &&
  120.  
  121.     погугли про него
  122. */
  123. ***************************
  124. elementWithText
  125. /*
  126.     то же самое и тут
  127.     используй getTexts
  128.     а потом уже енализируй собранный список текстов
  129. */
  130. *****************************
  131. public static Boolean isElementHasCssClass(WebElement element, String expectedClass){
  132.         String[] classes = element.getAttribute("class").split(" ");
  133.         for (String classAtr : classes) {
  134.             if (classAtr.equals(expectedClass)){
  135.                 return true;
  136.             }
  137.         }
  138.         return false;
  139. }
  140. /*
  141.     вообще-то нам нужем метод
  142.     который в уже ранее полученной строке - значении атрибута class - classAttribute
  143.     ищет cssClass
  144.  
  145.     и реализовать можно лаконичнее
  146.     return Arrays.asList(classAttribute.split(" ")).contains(cssClass)
  147.  
  148.     чтоб понять - почему так можно
  149.     надо почитать про contains для списка
  150. */
  151. *************************
  152. http://joxi.ru/V2VBQLqf0gOjk2
  153. /*
  154.     все же некорректно держать это в пекедже google
  155.  
  156.     думаю, больше порядка будет если перенести все на уровень выше
  157.     или переименовать пекедж google
  158. */
  159. ************************************
  160. http://joxi.ru/EA4k7zEUDJYP82
  161. /*
  162.     и в этой ветке тоже
  163.     странно держать тесты в пекедже google
  164.     ведь мы не работаем в google,
  165.     и не все продукты, что мы тестируем - относятся к google
  166.  
  167.     грамотнее - на уровень выше
  168.     или переименовать пекедж google
  169.  
  170.     ниже  - напишу про структуру подробнее
  171. */
  172. *******************
  173. http://joxi.ru/YmEnRaLFZ4V5d2
  174. /*
  175.     пейджи для разных проектов должны быть на одном уровне иерархии
  176.     что-то мудрено пока )
  177.  
  178.     а с учетом того - что у нас есть еще и гивен-хелперы
  179.     то может правильнее вот такую структуру сделать
  180.  
  181.     core
  182.         ...
  183.     todomvc
  184.         givenhelpers
  185.         pages
  186.     gmail
  187.         pages
  188. */
  189. ******************************
  190.  ((JavascriptExecutor) getDriver()).executeScript(jsCode.concat("]\")"));
  191.  getDriver().navigate().refresh();
  192. /*
  193.     оба метода стоит реализовать в ConciseAPI
  194.  
  195.     executeJavaScript
  196.     refresh
  197. */
  198. *********************************
  199. hover(assertThat(elementWithText(tasks, taskText)));
  200. or
  201. hover($(elementWithText(tasks, taskText)));
  202. /*
  203.     второй вариант - технически - то же самое
  204.     но - точнее описывает что мы делаем
  205.  
  206.     мы получаем элемент через ожидание elementWithText
  207.     чтобы далее выполнить над ним действие
  208.  
  209.     $ - применяем - когда работаем с элементом
  210.     assertThat - применяем - когда речь именно о проверке
  211.  
  212.     реализуй такой вариант $
  213. */
  214. *******************************************
  215.  doubleClick(assertThat(elementWithText(tasks, oldTaskText)).findElement(By.tagName("label")));
  216.  или
  217.  doubleClick($(elementWithText(tasks, oldTaskText),"label"));
  218.  /*
  219.     для второго варианта - все есть
  220.  */
  221. **********************************************
  222. public void edit(String oldTaskText, String newTaskText) {
  223. public void cancelEdit(String oldTaskText, String newTaskText) {
  224. /*
  225.     и тут можно реализовать startEdit
  226.     только теперь возвращай WebElment
  227.  
  228.     и далее - или энтер, или эскейп останется послать
  229. */
  230.  
  231. ************************************
  232. http://joxi.ru/nAyqEx7HXvxQoA
  233.  
  234. вот пример хорошего варианта структуры проекта
  235.  
  236. в src \ main
  237.  
  238.   core - универсальное, что можно переиспользовать в разных проектах
  239.   pages - пейджи тоже можно переиспользовать для других тестов этого же приложения
  240.  
  241.  
  242. в src \ test
  243.  
  244.   testdata - тестовые данные (если такие есть и они вынесены в отдельный класс)
  245.   testconfigs - предки тест-класса (так можно их изолировать от  собственно тест-классов - чтоб легче было ориентироваться
  246.  
  247.  
  248. про пекеджи еще немного)
  249. если GroupID = com.somesite
  250. а проект todomvctest
  251. то пакет корневой должен быть com.somesite.todomvctest
  252.  
  253. логика  - чтобы "не смешивались имена сущностей"
  254.  
  255. внутри одной компании - может быть несколько проектов)
  256. и у всех у них один com.somesite  - базовый пекедж
  257. но для каждого проекта должен быть свой  “базовый пекедж проекта"
  258. иначе все смешается)
  259. важно то, что когда этот проект выльется в отдельную библиотеку,
  260. то не будет конфликтов при его подключении
Advertisement
Add Comment
Please, Sign In to add comment