julia_v_iluhina

Untitled

Nov 18th, 2016
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.86 KB | None | 0 0
  1. было немного времени потщательнее обдумать твои вопросы)
  2. извини, тормозила. Длинный день)
  3.  
  4.  
  5. в Selenium есть классы
  6. public class WebDriverWait extends FluentWait<WebDriver>
  7. и его предок
  8. public class FluentWait<T> implements Wait<T>
  9.  
  10.  
  11. на уровне интерфейса Wait<T> - объявлен метод
  12. <T> T until(Function<? super F, T> isTrue);
  13. который реализован  на уровне класса FluentWait
  14.  
  15. и этот метод until, собственно, реализует ждущую проверку =
  16. выполнения некого условия Function<? super F, T> isTrue
  17.  
  18. и вот эта сущность - Function<? super F, T> isTrue
  19. типизирована двумя разными типами
  20. как дженерик-типом T,
  21. который определяет - какого же типа результат будет получен при вызове метода apply
  22. у нашей сущности isTrue
  23.    
  24. так и типом - ? super F
  25. который определяет тип параметра метода apply
  26.  
  27. Сущность isTrue - это объект, который имплементирует интерфейс  Function
  28. Вот описание интерфейса Function
  29. https://github.com/google/guava/blob/master/guava/src/com/google/common/base/Function.java
  30.  
  31. А это значит - что у такого объекта будет реализован метод T apply(@Nullable F input)
  32.  
  33. Который в методе until - мы как раз вызываем - чтобы в очередной раз проверить - выполняется ли нужное нам условие.
  34. В Selenium очень много всего работает с использованием вебдрайвера
  35. И логично предположить - что и для многих проверок он понадобится (возможно, не для всех, но для подавляющего большинства - так точно)
  36. Потому - нам нужен вебдрайвер на этапе - когда для нашего кондишена - мы будем выполнять проверку = вызывать метод apply (см релизацию until)
  37.  
  38. Когда мы реализуем объект-кондишен, то нам в его конструктор и не нужно передавать вебдрайвер, мы с ним и не работаем в этот момент.  А вот метод  apply  у этого объекта - мы реализуем с параметром типа WebDriver. И мы внутри этого метода apply - реализуем некие проверки (как правило, задействуя WebDriver). Посмотри на реализации родных селениумских кондишенов - как на примеры
  39. https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/support/ui/ExpectedConditions.java
  40.  
  41. Тот вариант, что ты приводил выше -
  42.  
  43. public static ExpectedCondition<WebElement> visible(final WebElement element) {
  44.     return webDriver -> element.isDisplayed() ? element : null;
  45. }
  46.  
  47.  
  48. фактически, равносилен коду с использованием анонимных классов
  49.     public static ExpectedCondition<WebElement> visible(final WebElement element) {
  50.         return new ExpectedCondition<WebElement>() {
  51.             public WebElement apply(WebDriver webDriver) {
  52.                 return element.isDisplayed() ? element : null;
  53.             }
  54.         };
  55.     }
  56.  
  57. вот наш вариант метода http://joxi.ru/l2ZNaR0F80d0z2
  58. и IntelIJ Idea - позволяет свернуть код = спрятать детали http://joxi.ru/Y2LXgYnfnR4Rn2
  59. Нажми “+” слева от кода (для строки 15 на скриншоте) - и увидишь код - как он есть
  60.  
  61. А в 8-ой Java - уже поддерживается изначально вот такой синтаксис и возможности функционального программирования. Но это уже совсем другая история)
  62.  
  63. Мы определились - что у кондишенов - метод apply - получает как параметр вебдрайвер и как правило - оперирует им (в данном случае - для visible() - как раз нетипичная ситуация - нам вебдрайвер не пригодился, но ты легко можешь оценить - как часто такое случается - если посмотришь на реализации кондишенов в классе ExpectedConditions https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/support/ui/ExpectedConditions.java)
  64.  
  65. Итак - в until - мы передаем объект-кондишен
  66.     у которого есть нам нужный в until-е  метод apply(WebDriver webDriver)
  67.         который позволит выполнить некую проверку
  68.             которая как правило без вебдрайвера невозможна)
  69.  
  70. Откуда мы для вызова apply - берем вебдрайвер
  71.     оттуда - где мы вызываем apply - в until
  72.         А это метод какого объекта - WebDriverWait or FluentWait
  73.             Таким объектам - мы как раз в конструктор - и передали вебдрайвер)
  74.  
  75. Надеюсь, от этих пояснений станет чуть проще и я в них осветила твои вопросы)
Advertisement
Add Comment
Please, Sign In to add comment