Advertisement
Guest User

Untitled

a guest
Oct 20th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.71 KB | None | 0 0
  1.     public void assertThat(ExpectedCondition condition){
  2.         new WebDriverWait(getWebDriver(), 15).until(condition);
  3.     }
  4.  
  5.     public WebElement $(By locator){
  6.         assertThat(ExpectedConditions.visibilityOfElementLocated(locator));
  7.         return new WebDriverWait(getWebDriver(), 15).until(visibilityOfElementLocated(locator));
  8.     }
  9. получается - мы в методе $ - сначала дождались видимости элемента
  10. и потом снова делаем ждущую проверку видимости
  11. это лишнее
  12.  
  13. если реализовать строки 140-145 прошлого ревью
  14. то получим
  15.     public WebElement $(By locator){
  16.         assertThat(ExpectedConditions.visibilityOfElementLocated(locator));
  17.         return getWebDriver().findElement(locator);
  18.     }
  19. в первой строке = дождались элемента
  20. в второй строке - уже просто ищем его и возвращаем
  21. тут мы так можем поступить - т к в предыдущей строке мы дождались его появления
  22.  
  23. ====
  24. строки 97-116 прошлого ревью - еще надо реализовать
  25. собственно - ты и у себя эти куски оставила)
  26. значит что-то не получилось...
  27. буду читать твой слек
  28. ====
  29.  
  30.     public void setValue(By elementLocator, String value){
  31.         $(elementLocator).clear();
  32.         $(elementLocator).sendKeys(value);
  33.     }
  34.  
  35.     public void setValue(String selector, String value){
  36.         $(By.cssSelector(selector)).clear();
  37.         $(By.cssSelector(selector)).sendKeys(value);
  38.     }
  39.  
  40. код можно сделать более  DRY
  41.  
  42. в методе  setValue(String selector, String value)
  43. переиспользовать setValue(By elementLocator, String value)
  44.  
  45. кстати - лучше имя cssSelector, а не selector - будет точнее
  46. =====
  47.  
  48.     public static ExpectedCondition<Boolean> listNthElementHasText(final List<WebElement> elements, final int index, final String expectedText) {
  49.  
  50.         return new ExpectedCondition<Boolean>() {
  51.                 private String elementText;
  52.  
  53.  
  54.             public Boolean apply(WebDriver driver) {
  55.                  try {
  56.                     elementText = elements.get(index).getText();
  57.                     return elementText.contains(expectedText);
  58.                 } catch (Exception e) {
  59.                     return false;
  60.                 }
  61.             }
  62. //            когда мы получаем elements.get(index) для индекса за границами списка
  63. //            вызывается исключение ListOutOfBoundsException
  64. //            и далее - проверка не выполняется
  65. //            а нам - стоит и дальше ждать
  66. //            возможно через время нужный нам элемент в списке уже будет
  67. //            т е нам надо обрабатывать ситуацию с возникновением такого исключения
  68. //
  69.             public String toString() {
  70.                 return String.format("\ntext in %s\n element of the elements list  has to be: %s\n while actual text is: %s\n", index, expectedText, elementText);
  71.             }
  72.         };
  73.     }
  74.  
  75. я намекала тебе на использование try-catch и обработке возникновения исключения ListOutOfBoundsException
  76. ок - сейчас подскажу больше
  77. обычно эти подсказки выдаем уже после того как версию с применением try-catch реализовали
  78. но с нашим рваным графиком думаю правильнее продвинуться дальше
  79.  
  80. https://docs.google.com/document/d/1BiYTLdypDfucSqiY9isv1HCKKQIxelzqYrN-3Ku1RWM/edit?usp=sharing
  81. /*
  82.     почитай и примени это для кондишенов
  83.     делай это - после того, как получишь отлаженную и проверенную версию (я писала - как проверять кондишены)
  84.  
  85.     если тебе будет проще - оперируй не типом Function<? super WebDriver, V> (это тип предка ExpectedCondition)
  86.     а ExpectedCondition<V>
  87.     поскольку кетчер бует применяться к потомкам ExpectedCondition - это будет ОК
  88.  
  89.     если захочешь поразбираться с дженериками
  90.         про дженерики в общем(русский)
  91.         http://www.quizful.net/post/java-generics-tutorial
  92.  
  93.         http://www.tutorialspoint.com/java/java_generics.htm
  94.         http://developer.alexanderklimov.ru/android/java/generic.php
  95.  
  96.         конвеншенcы      http://stackoverflow.com/questions/2900881/generic-type-parameter-naming-convention-for-java-with-multiple-chars
  97.         https://docs.oracle.com/javase/tutorial/java/generics/types.html
  98.  
  99.         уроки
  100.         http://docs.oracle.com/javase/tutorial/extra/generics/index.html
  101.  
  102.         очень приличный faq (есть pdf, и есть кое-что еще, помимо дженериков)
  103.         http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
  104.  
  105.         ----------------------------------------------------------
  106.         для понимания кетчера (Catcher)
  107.         http://grepcode.com/file/repo1.maven.org/maven2/com.google.guava/guava/r06/com/google/common/base/Function.java
  108.         http://www.programcreek.com/java-api-examples/com.google.common.base.Function
  109.         https://docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html
  110.         http://stackoverflow.com/questions/3847162/java-generics-super-keyword
  111.         http://stackoverflow.com/questions/2800369/bounding-generics-with-super-keyword
  112.         http://stackoverflow.com/questions/1910892/what-is-the-difference-between-super-and-extends-in-java-generics
  113.  
  114. */
  115. ====
  116.     public void assertMails(String headerText) {
  117.         assertThat(CustomConditions.textsOf(mailsList, список expectedTexts));// как его получить? в каждом запуске тестов переменная subject хранит только одно значение
  118.     }
  119. по поводу того как получить список
  120. вспомни что такое varargs parameter
  121.  http://www.linkex.ru/java/varargs.php
  122.  
  123. если у нас есть метод
  124.  method(String... texts)
  125.  
  126.  то мы можем вызвать метод так
  127.  method("text1")
  128.  и так
  129.  method("text1", "text2")
  130.  
  131.  если у нас будет метод
  132.  public void assertMails(String... headerTexts)
  133.  и кондишен
  134.  textsOf(final List<WebElement> elements, final String... expectedTexts)
  135.  
  136.  то метод assertMails(String... headerTexts) - получится универсальным
  137.  мы сможем его вызвать вот так - assertMails(subject1)
  138.  нам собственно именно такой вариант и нужен
  139.  
  140.  и вот так - assertMails(subject1, subject2, subject3) - если бы нам надо было проверить
  141.  что писем три
  142.  и что тексты в заголовках писем такие-то
  143. =====
  144. public static ExpectedCondition<Boolean> textsOf(final List<WebElement> elements, final List<String> expectedTexts) {
  145. /*
  146.     если тебе передадут не final List<String> expectedTexts
  147.     а final String... expectedTexts
  148.     то ты сможешь работать с expectedTexts как с обычным массивом
  149.     см ссылку выше по varargs параметры
  150. */
  151.  
  152.         return new ExpectedCondition<Boolean>() {
  153.  
  154.             public Boolean apply(WebDriver driver) {
  155.                 if (elements.size() != expectedTexts.size()) {
  156.                     return false;
  157.                 }
  158.                 /*
  159.                     верно - мы должны сравнить к-во вебэлементов
  160.                     с к-вом переданных текстов
  161.  
  162.                     только вот что...
  163.                     у нас elements - при каждом обращении к нему - переискивается)
  164.                     и тут - вначале кода метода apply -
  165.                     у нас может быть один размер списка
  166.  
  167.                     а далее по коду - уже другой)
  168.  
  169.                     ну и не только размер
  170.                     сами элементы тоже
  171.  
  172.                     то что я предлагаю - конечно не панацея
  173.                     но код проще понять - и читая его - и при случае наблюдая в отладке
  174.  
  175.                     я предлагаю - собрать в список  actualTexts - все тексты элементов
  176.                     обойдя в цикле elements
  177.  
  178.                     и далее по коду метода apply - уже оперировать сравнением
  179.                     actualTexts и  expectedTexts
  180.                     эти вещи - не будут меняться в процессе)
  181.  
  182.                     в принципе - соглашусь
  183.                     и во время первого обхода списка - список может ментяться
  184.                     и в actualTexts мы можем собрать не
  185.                     некую картинку в точке времени - а все же что-то в динамике
  186.                     из-за вот этого переискивания
  187.  
  188.                     но вероятность этого гораздо ниже
  189.                     чем если мы на протяжении всего apply будем работать с elements
  190.  
  191.                     и кроме того - нам полезно вывести в toString - значения
  192.                      actualTexts и expectedTexts
  193.                     в стиле
  194.                      для списка такого-то
  195.                      ждали того-то
  196.                      ожидаемые значения = такие-то
  197.                      фактические = такие-то
  198.  
  199.                     при таком коде в  toString
  200.                     если проверка ондишена упадет
  201.                     все будет понятно
  202.  
  203.                     так что работа с actualTexts нам пригодится сразу для двух целей
  204.  
  205.                     не знаю - увидела ли ты это сама - когда отлаживала код
  206.                     но вот есть такая тонкость
  207.                     если работаешь с @FindBy элементами/списками
  208.                     в методе apply кондишена - лучше получить то что будешь сравнивать
  209.                     и потом сравнивать уже ранее полученное
  210.  
  211.                     потому что в рамках одного метода если ты получаешь
  212.                     с твоей точки зрения что-то одинаковое
  213.                     например - размер коллекции
  214.                     или такой-то элемент
  215.                     или какие-то свойства элемента
  216.                     то ты можешь получить разные значения
  217.                     и можно довольно долго ходить кругами и не понимать происходящего
  218.  
  219.                     потому - лучше взять за правило
  220.                     сначала получили то что будем сравнивать
  221.                     и далее уже это сравниваем
  222.                     и с нашим переискивающимся списком/элементом - более не работаем
  223.  
  224.                     я считаю это вторым крупным недостатком в работе с FindBy-аннотированными элементами
  225.  
  226.                 */
  227.  
  228.                 for (int i = 0; i < expectedTexts.size(); i++) {
  229.                     String elementText = elements.get(i).getText();
  230.                     String expectedText = expectedTexts.get(i);
  231.                     if (elementText.contains(expectedText)) {
  232.                         return false;
  233.                         }
  234.                     }
  235.                     return true;
  236.                 }
  237.                 посмотри на кусок кода
  238.                 из-за неверного форматирования он на первый взгляд кажется не правильным)
  239.                 последняя фигурная скобка - относится не к for
  240.                 а ко всему методу
  241.                 а на первый взгляд этого не видно
  242.                 не забывай о форматировании
  243.                
  244.  
  245.             public String toString() {
  246.                 return String.format("\nthere is no such text in elements list\n");
  247.             }
  248.             выше я писала про то что лучше отразить в toString
  249.             учти это
  250.         };
  251.     }
  252. =====
  253.  By.xpath("//*[text()='COMPOSE']")
  254.  
  255. довольно полезно в ConciseaAPI реализовать byText
  256. ведь мы не раз элементы ищем по тексту
  257. можно вот с такой реализацией - как тут
  258. если интересно - загляни в селениде
  259. там применяется более сложное xPath выражение
  260. но оно и больше всякого учитывает
  261. может пригодиться в проектах написанных на чистом селениуме
  262. вот само выражение
  263. ".//*/text()[normalize-space(.) = " + Quotes.escape(elementText) + "]/parent::*"
  264. вот ссылка на источник
  265. https://github.com/codeborne/selenide/blob/master/src/main/java/com/codeborne/selenide/Selectors.java
  266. =====
  267. $(By.cssSelector("div.asf")).click();
  268. насколько я помню - ок работает и вариант ".asf"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement