julia_v_iluhina

Untitled

Jan 5th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.45 KB | None | 0 0
  1.   public static <T> T assertThat(WebDriver driver, ExpectedCondition<T> condition)
  2. /*
  3.     Тут согласно conventions - надо использовать имя дженерик-типа - V
  4.     http://stackoverflow.com/questions/6008241/java-generics-e-and-t-what-is-the-difference
  5.         когда типизируешь generic-типом класс - то T (T is meant to be a Type)
  6.         а когда речь идет о типизации значения, возвращаемого методом -  V (V is Value (as a return value or mapped value))
  7.  
  8.     Метод реализован ОК
  9.     Только давай немного разовьем функциональность
  10.     реализуй
  11.     public static <T> T assertThat(WebDriver driver, ExpectedCondition<T> condition, int timeout)
  12.         чтоб явно задавать таймаут - с помошью параметра
  13.     и затем - реализуй
  14.     public static <T> T assertThat(WebDriver driver, ExpectedCondition<T> condition)
  15.        в котором вызовешь предыдущий assertThat и в качестве параметра укажешь Configuration.timeout
  16.     так ты получишь более гибкий функционал
  17.        бывает - что практически для всех проверок нужен один таймаут, а вот для небольшого количества проверок -
  18.        нужен таймаут побольше
  19.        2 таких метода полностью закроют проблему
  20. */
  21. ************************
  22.  public static WebElement $(WebDriver driver, WebElement proxyElement) {
  23.  /*
  24.     тут - также вызывай разработанный assertThat
  25.     код станет проще
  26.  
  27.     visibilityOf(proxyElement) - это то, что передащь в качестве значения кондишена
  28.  */
  29. *******************************
  30.  public static ExpectedCondition<WebElement> nthProxyElementHasText(final List<WebElement> elements
  31.              , final int index
  32.              , final String expectedText) {
  33.  
  34. .....
  35.              public String toString() {
  36.                  return String.format(.....
  37.                          , elements.get(index).getText());
  38. /*
  39.     с прокси-списками какая история (с прокси-элементами - тоже)
  40.     при каждом обращении к ним - они переискиваются
  41.     и когда ты получаешь в toString() - elements.get(index).getText()) -
  42.     ты можешь получить уже что-то новое
  43.     т е - выводы ты делал опираясь на одно значение, а описал - другое
  44.     вряд ли такое соообщение в случае ошибки - поможет разобраться - что ж там было
  45.     а кроме того - у тебя и тут может возникнуть IndexOfBoundsException - ведь никто не гарантирует
  46.     что для elements.get(index).getText() - достаточно элементов в списке
  47.  
  48.     потому
  49.     - объяви на уровне класса - переменную String actualText
  50.     - в apply - инициализируй ее значением elements.get(index).getText()
  51.     - в apply - делай выводы на основании значения actualText
  52.     - в toString - выводи actualText
  53.  
  54.     так ты добъешься ситуации
  55.     когда и выводы и сообщение - базируются на одних данных
  56.     и в toString - уже не будет никаких новых вычислений и/или сложной логики, что тоже важно
  57.     toString должен быть максимально простым
  58.  
  59.     это касается любого кондишена
  60. */
  61. ************************************************
  62.  public static ExpectedCondition<List<WebElement>> texts(final List<WebElement> elements, final String... texts) {
  63.         return new ExpectedCondition<List<WebElement>>(){
  64.  
  65.             final List<String> proxyTexts = new ArrayList<String>();
  66.             /*
  67.                 actualTexts - в данном случае более точное название
  68.                 тексты элементов - все же не прокси)
  69.                 при обращении к текстам - тексты не будут переискиваться )
  70.             */
  71.             final List<WebElement> returnedProxyElements = new ArrayList<WebElement>();
  72.             /*
  73.                 а это тебе вообще не нужно
  74.                 в случае успеха - вернем elements = список, который получили в качестве параметра
  75.             */
  76.  
  77.             public List<WebElement> apply(WebDriver webDriver) {
  78.  
  79.  
  80.                 for (WebElement proxyElement : elements) {
  81.                     proxyTexts.add(proxyElement.getText());
  82.                 }
  83.                 /*
  84.                     вспомни схему вызова кондишена в wait.until
  85.                     apply одного кондишена может вызываться многократно
  86.                     и получишь - что список proxyTexts при каждом вызове apply
  87.                     все пополняется и пополняется
  88.  
  89.                     очищай список proxyTexts перед циклом
  90.  
  91.                     тебе каждый apply =  нужен новый вариант текстов списка веб элементов
  92.                 */
  93.  
  94.                 for (int i = 0; i < proxyTexts.size(); i++) {
  95.                     if (proxyTexts.get(i).contains(texts[i])) {
  96.                         returnedProxyElements.add(elements.get(i));
  97.                     }
  98.                     /*
  99.                         тут проще применить такую логику
  100.                         если не содержит
  101.                         значит вернем нулл - т к уже не выполнили уловие
  102.                     */
  103.                 }
  104.  
  105.                 return elements.size() == returnedProxyElements.size() ? returnedProxyElements : null;
  106.                 /*
  107.                     не то сравниваешь
  108.                     размеры не тех сущностей
  109.                     нужно сравнить proxyTexts и texts
  110.                     proxyTexts - уже отражает фактический размер списка на момент сравнения
  111.                     elements.size() - мы можем опять что-то новое получить, у нас же список переискивается
  112.                     на протяжении работы apply - правильно оперировать одним состоянием списка
  113.                     вот мы зафиксировали это состояние - получили proxyTexts
  114.                     и дальше его анализируем
  115.  
  116.                     сравнение размеров списка - грамотнее сделать до цикла for (int i = 0; i < proxyTexts.size(); i++)
  117.                     если размеры не совпадают - нету смысла делать сравнение текстов -
  118.                     да и в случае несовпадения размеров - при таком цикле есть вероятность получить IndexOfBoundsException
  119.  
  120.                     а переставив проверку размера выше цикла for (int i = 0; i < proxyTexts.size(); i++)
  121.                     ты уйдешь от такой проблемы
  122.  
  123.                     если размеры не совпадают (размеры proxyTexts и texts) - то просто верни нулл
  124.                     а после цикла - если мы добрались до этой строки - значит проверки на каждой итерации цикла выполнены успешно
  125.                     значит в целом проверка выполнена успешно
  126.                     значит можно вернуть elements
  127.                 */
  128.             }
  129.  
  130.             public String toString(){
  131.                 // TODO: 03.01.2017
  132.                 return String.format("");
  133.             }
  134.  /*
  135.     что проверяем
  136.     для чего проверяем
  137.     ожидаемый результат
  138.     фактический результат
  139.  
  140.     Texts of list elements .....
  141.     should contain .....
  142.     while actual texts ....
  143.  
  144.     обязательно проверь - в режиме - когда проверка будет падать
  145.     чтобы сообщение об ошибке было корректным и наглядным
  146.  */
  147.  *******************************
  148.  public class Configuration {
  149.  
  150.      public static int timeout = 10;
  151.  }
  152.  /*
  153.     Правильнее значение по умолчанию устанавливать таким
  154.     которого хватает как правило
  155.     предлагала тебе 4 секунды -  кк у Selenide сделать
  156.     а уже в самом тест-классе - установи таймаут в нужное тебе значение
  157.  
  158.     посмотри на свое Selenide
  159.  */
  160.  ***************************************
  161.  public class GmailTest {
  162.  
  163.   ...
  164.   private static WebDriver driver = new FirefoxDriver();
  165.   ...
  166.      @AfterClass
  167.      public void tearDown() {
  168.          driver.quit();
  169.      }
  170.  }
  171.  /*
  172.     вместо того чтоб решить вопрос с предком тест-класса - ты от него избавился)
  173.     я не про это писала)
  174.  
  175.     еще раз перечитай http://pastebin.com/q4zuVus2
  176.     строки 148-160
  177.    
  178.     подсказываю - как выкрутиться - чтобы не было описанной в http://pastebin.com/q4zuVus2 проблемы
  179.     в предке тест-класса
  180.     - объяви статическую переменную driver
  181.     - инициализируй ее в BeforeClass - создавай веб-драйвер
  182.     - закрывай вебдрайвер - в @AfterClass
  183.  
  184.  */
  185.  *******************
  186.     public void send(String emailAddress, String subjectOfLetter) {
  187.  
  188.          $(driver, compose).click();
  189.          $(driver, to).sendKeys(emailAddress);
  190.          subject.sendKeys(subjectOfLetter);
  191.          send.click();
  192.     }
  193. /*
  194.     не рискуй
  195.     ко всем элементам через $(driver, ...) обращайся
  196.     надежность теста будет повыше
  197. */
  198. *************************
  199.  assertThat(driver, nthProxyElementHasText(page.emails, 0, subject));
  200.  assertThat(driver, texts(page.emails, subject));
  201. /*
  202.     реализуй в пейдже методы для этих проверок
  203.  
  204.     подсмотри у себя же - как они в селеидовской версии этой работы назывались
  205.     чтоб уже с неймингом не ходить кругами
  206. */
Advertisement
Add Comment
Please, Sign In to add comment