julia_v_iluhina

Untitled

Dec 18th, 2016
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 13.05 KB | None | 0 0
  1. Снова проблемки с Кондишнами, в пер
  2. 1.
  3. public static ExpectedCondition<Boolean> textsOf(final List<WebElement> elements, final String...texts) {
  4. /*
  5.     давай определимся с целями
  6.  
  7.     что мы хотим проверить
  8.     что в списке элементов - столько элементов, сколько передано текстов на проверку (это первая часть проверки)
  9.     и что текст элемента списка - соответствует тексту их переданных текстов
  10.         текст нулевого элемента - нулевому переданному тексту
  11.         текст первого элемента - первому переданному тексту
  12.         и т д
  13.  
  14.     проверять соответствие текстов - будем проверкой на вхождение
  15.         в тексте элемента содержится такой-то текст
  16.  
  17.     таким образом  - наш кондишен  - будет проверять
  18.         количество
  19.         порядок
  20.         сами тексты
  21.  
  22.     что нам нужно выдать в сообщении об ошибке
  23.         что проверяли - тексты
  24.         для какой сущности проверяли -  список веб-элементов такой-то
  25.         ожидаемое положение дел - тексты, переданые в кондишен
  26.         фактическое положение дел - тексты самих веб-элементов
  27.  
  28.     это все - нужно отразить в выражении, возвращаемом toString()
  29.  
  30.     т е - на момент вызова toString() - у тебя уже должен быть собран сипсок текстов = текксты веб-элементов из списка
  31.  
  32.     судя по предыдущей реализации этой работы и текущей реализации этих кондишенов - ты оперируешь
  33.     @FindBy-аннотированным списком
  34.  
  35.     так аннотированные элементы и списки - переискиваются всегда, при обращении к ним
  36.     а у тебя, в методе apply - есть задача - сравнить текущее состояние списка (то, которое есть на момент проверки)
  37.     с ожидаемым
  38.  
  39.     причем - в случае неуспеха - мочь описать точно - что с чем мы проверяли
  40.  
  41.     потому - стратегия должна быть следующей
  42.       в apply - сначала - собрать в список текстов - тексты элементов списка
  43.       и затем - сравнивать элементы этого списка с ожидаемыми текстами
  44.  
  45.       так - мы будем оперировать неким зафиксированным состоянием списка вебэлементов
  46.       и сможем его точно описать в toString
  47.  
  48. */
  49.         return new ExpectedCondition<Boolean>() {
  50.             public Boolean apply(WebDriver webDriver) {
  51.                 Iterator var2 = elements.iterator();
  52.                 while (var2.hasNext()) {
  53.                 /*
  54.                     вот такой цикл - да, его можно использовать
  55.                     только вот используешь ты его не совсем верно
  56.                     почитай - https://www.tutorialspoint.com/java/java_using_iterator.htm
  57.                     там есть и описание методов
  58.                     и пример использования
  59.  
  60.                     а вообще - можно было бы воспользоваться более простым синтаксисом цикла
  61.  
  62.                     для сбора текстов вебэлемента в список текстов - отлично подойдет вариант
  63.                     for(WebElement element:elements)
  64.  
  65.                     для обхода собранного списка текстов и сравнения каждого текста с соответствующим текстом из texts
  66.                     for(int i=0; i<texts.length; i++)
  67.  
  68.                     https://www.tutorialspoint.com/javaexamples/method_for.htm
  69.                 */
  70.  
  71.                     WebElement elements = (WebElement) var2.next();
  72.                     /*
  73.                         называть переменную = элемент списка (не элементЫ, а элемент) = elements
  74.                         да еще и именем, которое совпадает с именем параметра - однозначный перебор
  75.  
  76.                         тут ок - element
  77.                     */
  78.  
  79.                     try {
  80.                         String e = elements.getText();
  81.                         return Boolean.valueOf(e.equals(texts)); <<<< не работает с equals, так как там содержится еще код,
  82.                         отлично работает с методом contains,
  83.                         но этот метод срабатывает только для строки и выкидывает ошибку при испольщзозовании varargs
  84.                         /*
  85.                             давай-ка разберем - что с чем сравниваешь
  86.  
  87.                             ты сравниваешь текст такого-то элемента списка - с переданными текстАМИ
  88.  
  89.                             texts = varargs parameter нашего метода
  90.                             считай - texts - это массив (ты с texts можешь работать внутри метода - как с обычным массивом
  91.  
  92.                             http://www.linkex.ru/java/varargs.php
  93.                             http://stackoverflow.com/questions/2161912/why-varargs-should-be-the-last-in-method-signature
  94.                             http://www.java-tips.org/java-se-tips-100019/24-java-lang/481-using-the-varargs-language-feature.html
  95.                             At compile time a vararg is converted to an array.
  96.  
  97.                             сравнивать одну строку с массивом строк - странно
  98.                             ну да, и то, и то = объекты
  99.                             и технически - да, мы любой объект с любым другим объектом можем сравнить
  100.                             вот только что нам это даст
  101.  
  102.                             а метод contains для строки - требует параметра - строки
  103.                             чтоб ответить на вопрос - что вот эта строкА-значение параметра, входит ли в нашу строку
  104.  
  105.                             т е - ты в качестве параметра для someString.contains - не можешь использовать texts
  106.                             т к это - не строка, а если говорить грубо = массив строк
  107.                             и тебе нужно - для текст i-го элемента сравнить с i-ым текстом из texts
  108.  
  109.                             также - обрати внимание на имена переменных
  110.                             приемлемо давать однобуквенные имена - лишь переменным-счетчикам цикла
  111.                             остальные - должны быть осмысленными
  112.  
  113.                             про логику проверки - читай выше, ее нужно подправить
  114.                         */
  115.                     } catch (StaleElementReferenceException var3) {
  116.                         return null;
  117.                     }
  118.  
  119.                 }
  120.                 return Boolean.valueOf(false);
  121.                 /*
  122.                     раз у тебя кондишен - ExpectedCondition<Boolean>
  123.  
  124.                     можно просто вернуть false
  125.                     как и выше - не нулл, а false
  126.  
  127.                     boolean без проблем будет автоматом приведен к Boolean
  128.  
  129.                 */
  130.             }
  131.  
  132.             public String toString() {
  133.                 return "text of all elements " + elements;
  134.             }
  135.             /*
  136.                 про это тоже писала выше
  137.             */
  138.         };
  139.     }
  140. *****************************************************************
  141. 2.  Здесь проблема с поиском элемента, вместо темы письма находит текст "me" то есть address from
  142.     public static ExpectedCondition<Boolean> listNthElementHasText(final List<WebElement> elements, final int index, final String texts) {
  143.     /*
  144.         что есть final String texts
  145.         это - ожидаемый текст ( не текстЫ, а текст)
  146.         поправь имя параметра
  147.  
  148.         по поводу твоего комментария - вместо темы письма находит текст "me" то есть address from
  149.         надо смотреть - и контекст вызова кондишена (для какого списка вебэлементов ты вызываешь проверку
  150.         и надо смотреть - как ты такие выводы делал - т к пока это тоже не ясно, а toString у кондишена - сейчас не информативный
  151.  
  152.         Если ты используешь для списка мейлов - тот же селектор, что и в аналогичном селенидовском задании
  153.         и передаешь в качестве параметра - именно такой список
  154.         то чтоб ты понимал - текст такого то мейла - это вот такая строка = разделенный переходами на новую строку кусок текста
  155.         в который входит и address from в том числе
  156.     */
  157.         return new ExpectedCondition<Boolean>() {
  158.             public Boolean apply(WebDriver webDriver) {
  159.  
  160.                 try {
  161.                     WebElement element = elements.get(index);
  162.                     String e = element.getText();
  163.                     /*
  164.                         имя переменной e - в данном случае плохой вариант
  165.                         используй осмысленное имя
  166.                         например  - actualText
  167.                     */
  168.                     return Boolean.valueOf(e.contains(texts));
  169.                     /*
  170.                         можно просто - return (e.contains(texts));
  171.                         читать код с названиями, искаженно описывающими сущности - очень трудно
  172.                         это не просто придирки - уделяй внимание тому - что и как ты называешь
  173.                         часть проблем уйдет и при разработке
  174.                         думаю, ты и сам себя по дороге запутываешь)
  175.                     */
  176.                 } catch (StaleElementReferenceException var3) {
  177. /*
  178.     про именование исключений
  179.     посмотри
  180.     https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html
  181.     https://en.wikibooks.org/wiki/Java_Programming/Throwing_and_Catching_Exceptions
  182.     традиционно именуют исключения - не var3, а e, ex
  183.  
  184.     вот тут поподробнее информация - какие имена переменным-исключениям можно выбирать - исходя из причины/цели catch-блока
  185.     https://google.github.io/styleguide/javaguide.html#s6.2-caught-exceptions
  186.  
  187.     также - тут нужно ловить и IndexOfBoundsException
  188.     такое исключение возможно - при обращении к єлементу списка за его границами
  189.     погугли про него
  190. */
  191. ********************
  192.             public String toString() {
  193.                 return String.format("\ntext: %s\n of this elements is: %s\n", texts);
  194.             }
  195.             /*
  196.                 примени знания, изложенные выше, и для формирования выращения в toString этого кондишена
  197.             */
  198.         };
  199.     }
  200. }
Advertisement
Add Comment
Please, Sign In to add comment