julia_v_iluhina

Untitled

Sep 15th, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.07 KB | None | 0 0
  1.     public static WebElement setValue(WebElement element,String specifiedCss, String value)  {
  2.         element.findElement(byCss(specifiedCss)).clear();
  3.         element.findElement(byCss(specifiedCss)).sendKeys(value);
  4.         return element;
  5.     }
  6.  
  7. /*
  8.     нам не надо такого умного)
  9.  
  10.     мухи - отдельно, котлеты - отдельно
  11.  
  12.     по крайней мере тогда, когда это в наших силах)
  13.  
  14.     да, у нас есть задача - получить внутренний элемент, дождавшись выполнения кондишена для внешнего элемента
  15.     и это мы решаем в методе  $
  16.  
  17.     тут - мы реализуем ввод нового значения для конкретного вебэлемента
  18.     очистили поле
  19.     и ввели новое значение
  20.     все)
  21.  
  22.  
  23.     вот эти кусочки - findElement(byCss(specifiedCss))
  24.     и этот параметр - specifiedCss
  25.     тут не нужны
  26.  
  27.  
  28.     а как будешь вызывать такой метод - укажешь вебэлемент
  29.     не
  30.     setValue(
  31.         $(listElementWithCssClass(tasks, "editing")),
  32.         ".edit",
  33.         newTaskText + Keys.ENTER
  34.     );
  35.     а
  36.     setValue(
  37.         $(listElementWithCssClass(tasks, "editing"), ".edit"),
  38.         newTaskText + Keys.ENTER
  39.     );
  40. */
  41. *****************************
  42.     public static ExpectedCondition<WebElement> listElementWithCssClass(final By elementsLocator, final String expectedCss) {
  43.     /*
  44.         что это - expectedCss ?
  45.         это - недостаточно точно
  46.         expectedCssClass - будет точно
  47.     */
  48.         return elementExceptionsCatcher(new ExpectedCondition<WebElement>() {
  49.             List<WebElement> actualElements;
  50.             String currentCssClass;
  51. ....
  52.             public String toString() {
  53.                 return String.format("elements ['%s'] should have CSS class ['%s'], while actual classes are ('%s')  "
  54.                         , actualElements.toArray().toString(), expectedCss, currentCssClass);
  55.             }
  56.     /*
  57.         сначала поговорим про бантики )
  58.  
  59.         предположи - что это не ты писал кондишен
  60.         ты вообще не понимаешь как он работает
  61.         и тебе надо  - по тексту сообщения об ошибке - разобраться
  62.  
  63.         прежде всего = что мы проверяем
  64.             что какой-то из элементов списка [такого-то = найденного по такому-то локатору = elementsLocator]
  65.             содержит CSS класс [такой-то = expectedCssClass]
  66.  
  67.         если проверка не прошла - что еще мы захотим узнать?
  68.         помимо описания - что мы проверяем
  69.         нам будет интересно - а что же по факту в списке элементов было
  70.         т е - фактические значения атрибута class  - для каждого(!!!) из элементов списка
  71.         эта информация поможет нам понять - почему же мы не нашли  - что искали
  72.  
  73.         теперь разбираем
  74.              про локатор - не сказали
  75.              зато вывели actualElements.toArray().toString()
  76.              ты смотрел - что мы так навыводим?
  77.              будет ли польза от данной информации?
  78.              как смотреть - можно реализовать заведомо падающуюу проверку такого кондишена
  79.  
  80.              про то, что проверяем - ну... были не точны в формулировке
  81.              сейчас
  82.              elements ['%s'] should have CSS class ['%s']
  83.              надо
  84.              element of list located ['%s'] should have CSS class ['%s']
  85.              мелочь вроде бы, а смысл меняется
  86.  
  87.              про факт - смотри сам - выводим currentCssClass
  88.              это - данные о последнем проверенном элементе
  89.              сомнительная польза - если в списке было несколько элементов
  90.  
  91.              ниже - про алгоритм самой проверки
  92.     */
  93. *************
  94.  
  95.            public WebElement apply(WebDriver driver) {
  96.                 WebElement currentElement;
  97.                 actualElements = driver.findElements(elementsLocator);
  98.  
  99.                 for(int i=0; i < actualElements.size(); i++) {
  100.                     currentElement = actualElements.get(i);
  101.                     currentCssClass = currentElement.getAttribute("class");
  102.                     /*
  103.                         в первом цикле - обходе списка ведэлементов
  104.                         ты можешь получить в список строк - значения атрибута "class"
  105.                         для всех элементов списка
  106.  
  107.                         и уже далее - оперировать этим списком - как описанием факта
  108.                         обходи полученный список значений атрибута "class"
  109.  
  110.                         когда будешь обходить такой список -
  111.                         по индексу получить соответствующий веб элемент ты сможешь
  112.                     */
  113.                     if(contains(currentCssClass, expectedCss))
  114.                     /*
  115.                         сомневаюсь - что такой метод contains еще где-то понадобится
  116.                         не стоит в данном случае это выносить в универсальный метод
  117.  
  118.                         а если и выносить - то формулировать надо бы поточнее
  119.                         isWordContainedInPhrase
  120.                     */
  121. ********************************
  122.     public static boolean contains(String currentString, String expectedCss) {
  123.      ...
  124. /*
  125.     когда ты объявляешь метод и придумываешь имена методу и его параметрам
  126.     отвлекись от контекста, в котором ты будешь применять такой метод
  127.     сейчас все названия должны точно описывать то, что делает сам метод
  128.     а не как и при каки обстоятельствах он будет использоваться
  129.  
  130.     и вообще не нужно - чтобы эти имена параметров или метода как-то отражали обстоятельства использования такого метода
  131.     речь про решаемую задачу и ни про что больше
  132.  
  133.     а мы решаем задачу вот такую
  134.     у нас есть строка - слова, разделенные пробелами = фраза
  135.     у нас есть цель - узнать, встречается ли в фразе искомое слово
  136.  
  137.     т е решаем задачу - содержится ли слово(word) в фразе (phrase) - isWordContainedInPhrase
  138.     мы не говорим ни про какие css классы  в нашем универсальном методе
  139.  
  140.     а когда мы вызываем метод - вот тут уже мы уточняемся
  141.     передавая значения в качестве параметров
  142.     if (isWordContainedInPhrase(expectedCssClass, currentCssClass)) ...
  143.  
  144.     если же ты такого рода код не выносишь в универсальый метод - то, конечно,
  145.     используй имена переменных, наиболее точно отражающих контекст
  146.  
  147. */
  148. ***************************************
  149.  
  150.     public static ExpectedCondition<WebElement> listElementWithExactText(final By elementsLocator, final String expectedText) {
  151.        ...
  152.             public String toString() {
  153.                 return String.format("elements of list located ['%s'] should have text ['%s']. " +
  154.                         "Actual texts are: ['%s']",elementsLocator, expectedText, Arrays.toString(actualTexts.toArray()));
  155.             }
  156. /*
  157.     с реализацией - ок
  158.  
  159.     фразу - подправь
  160.     не elements of list
  161.     а  element of list
  162.  
  163.     нам достаточно - чтобы лишь один из элементов списка имел такой-то текст
  164.  
  165.  
  166.     Arrays.toString(actualTexts.toArray())
  167.     да, будет ок
  168.     но - можно проще
  169.         actualTexts.toString()
  170.         или
  171.         String.join(",", actualTexts)
  172. */
  173. *****************************************
  174.    public static ExpectedCondition<List<WebElement>> exactTextOf(final By elementsLocator, final String... expectedTexts) {
  175.         return elementExceptionsCatcher(new ExpectedCondition<List<WebElement>>() {
  176.             private List<String> elementsTexts;
  177.  
  178.             public List<WebElement> apply(WebDriver driver) {
  179.                 elementsTexts = new ArrayList<>();
  180.                 ...
  181.  
  182.                 for (int i = 0; i < innerElements.size(); i++) {
  183.                     elementsTexts.add(innerElements.get(i).getText());
  184.                 }
  185.                 /*
  186.                     метод  getTexts() используй
  187.                 */
  188.  
  189. ********************************************
  190.  
  191. public static ExpectedCondition<List<WebElement>> exactTextsOfVisible(final By elementsLocator, final String... expectedTexts) {
  192.  ...
  193.  
  194.                 for (int i = 0; i < elementsTexts.size(); i++) {
  195.                     if (!elementsTexts.get(i). equals(expectedTexts[i])) {
  196.                         return null;
  197.                     }
  198.                 }
  199. /*
  200.     Такого рода код используется в 2-ух кондишенах
  201.     можно вынести в метод boolean isContainedInList(String text, List<String> list)
  202.  
  203.     а терерь посмотри на isWordContainedInPhrase
  204.     не узнаешь похожие черты? )
  205.     подумай как переиспользовать в isWordContainedInPhrase метод isContainedInList
  206. */
  207.  
  208.             public String toString() {
  209.                 return String.format("elements of list located ['%s'] should have ('%s') visible ('%s') texts, " +
  210.                         "while actual visible texts are ('%s')",
  211.                         elementsLocator,expectedTexts.length ,elementsTexts.toArray().toString(), Arrays.toString(expectedTexts));
  212.             }
  213. /*
  214.     тут лучше написать не про видимые тексты, а про видимые элементы
  215.     и точнее, и лаконичнее
  216.  
  217.     visible elements of list located ['%s']
  218.     should have texts (%s)
  219.     while actual texts are (%s)
  220.  
  221.     не надо ничего про количество элементов писать - expectedTexts.length
  222.     это бесполезная информация
  223.     в контексте данной проверки
  224.  
  225.     напоминаю - .toArray().toString() - получишь некрасивую строку
  226.  
  227.     если пишешь кондишен
  228.     всегда проверяй его
  229.     в ситуации - когда проверка должна пройти
  230.     и в ситуации - когда должна упасть
  231.  
  232.     прежде всего - это должно происходить (проверка - правильно отрабатывает)
  233.     и сразу же - проверяй выводимую фразу  - при падении проверки
  234.  
  235.     если этого не делать - лучше вообще кондишены не писать
  236.     т к потом - мы считаем - что мы можем кондишен использовать
  237.     и используем) уже не вникая в детали работы кондишена
  238.     можно таких делов наворотить с непроверенными кондишенами - мало не покажется)
  239.  
  240. */
  241. ****************************************
  242.  actualElements = driver.findElements(elementsLocator);
  243.  List<WebElement> currentVisibleElements = getVisibleElements(actualElements);
  244. /*
  245.     уже или actual или current
  246.  
  247.     употребляешь синонимы  - для обозначения чего-то фактического
  248.  
  249.     мне больше нравится actual
  250.  
  251.     то же самое про expected значения
  252.     то используешь expected, то нет
  253.     тоже - лучше бы одинаково
  254.     точнее - использовать expected
  255.  
  256.     именно в кондишенах
  257.     т к внутри кондишена мы оперируем как actual, так и expected значениями
  258.     хорошо бы видеть это не напрягая мозги - что есть что
  259. */
  260. ********************************************
  261. assertThat(ExpectedConditions.textToBe(todoCount, Integer.toString(count)));
  262. /*
  263.     заимпорти статически ExpectedConditions.textToBe
  264.     и в коде используй textToBe
  265.  
  266.     метод assertThat - предполагает - что ему дадут кондишен на вход
  267.     потому - и textToBe - достаточно однозначно
  268.  
  269.     и потому же - в документации селениде советуют кондишены импортить статически
  270. */
  271. ***********************************************
  272. public static void assertTasks(String... expectedTaskTexts)
  273. public static void assertVisibleTasks(String... expectedTaskTexts)
  274. /*
  275.     а вот тут бы - я бы про expected ничего не писала
  276.  
  277.     внутри метода - нету кода про actual и expected
  278.  
  279.     потому - можно и не уточняться
  280.  
  281.     настаивать не буду
  282.  
  283.     у тебя - то так, то так)
  284.     прими для себя решение)
  285. */
  286. ****************************
  287.   public static void assertTasksSizeOf(int size) {
  288.       assertThat(sizeOf(tasks, size));
  289.   }
  290.  
  291.   public static void assertNoTasks() {
  292.       assertTasksSizeOf(0);
  293.   }
  294. /*
  295.     я бы не стала реализовывать отдельно - assertTasksSizeOf
  296.     т к - штука не востребованная
  297.  
  298.     если у тебя есть таски в списке - проверка размера списка - недостаточно точна
  299.     т к чтоб было точно - надо проверять тексты тасок
  300.  
  301.     а если тасок нет - то вариант assertNoTasks() - вполне OK и максимально KISS
  302.  
  303.     кстати, название assertTasksSizeOf - странноватое
  304.     с точки зрения английского - фраза некорректно построена
  305.     assertSizeOfTasks / assertSizeOfTaskList / assertTasksSize / assertTaskListSize
  306.     тоже далеко не идеальніе варианты, но лучше
  307.  
  308.     мы в имени кондишена писали SizeOf в расчете на первый параметр - Of чего = локатор списка элементов
  309.     ну и получали формулировку - размер Of(чего) того-то
  310.    
  311.     то же самое про assertVisibleTasksSizeOf
  312. */
Advertisement
Add Comment
Please, Sign In to add comment