julia_v_iluhina

Untitled

Sep 30th, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 15.56 KB | None | 0 0
  1.     public boolean containsOrEquals(List<String> actualTexts, String[] expectedTexts) {
  2.         for (int i = 0; i < expectedTexts.length; i++) {
  3.             if (!actualTexts.get(i).contains(expectedTexts[i])) {
  4.                 return false;
  5.             }
  6.         }
  7.         return true;
  8.     }
  9. /*
  10.     можно было сэкономить еще больше )
  11. */
  12.  
  13.    public boolean check(List<WebElement> elements) {
  14.         actualTexts = getTexts(elements);
  15.         if (actualTexts.size() != expectedTexts.length) {
  16.             return false;
  17.         }
  18.         for (int i = 0; i < expectedTexts.length; ++i) {
  19.             if (!checkElement(i)) {
  20.                 return false;
  21.             }
  22.         }
  23.         return true;
  24.     }
  25.  
  26.     public boolean checkElement(int index) {
  27.         return actualTexts.get(index).contains(expectedTexts[index]);
  28.     }
  29.  
  30. /*
  31.     и в потомке - реализуем checkElement
  32.  
  33.     а в check предка - оставляем всю схему проверки
  34.     что тоже очень наглядно
  35. */
  36. **********************************
  37.         if (!(element == null))
  38.         {isPresent = true;}
  39. /*
  40.     перепиши проще
  41.     isPresent = (element != null)
  42.  
  43.     форматирование - не забывай)
  44.  
  45.     видно - что на автопилоте ты многое форматируешь нестандартно
  46.  
  47.     я тоже так делаю)
  48.     поэтому - в конце каждого цикла разработки - реформатирую код)
  49.     это здорово снижает градус в рабочей обстановке))))
  50. */
  51. ************************************
  52. public class Text extends ElementCondition {
  53.  
  54.     ...
  55.  
  56.     @Override
  57.     public boolean check(WebElement element) {
  58.         actualText = element.getText();
  59.         return (containsOrEquals (actualText, expectedText));
  60.     }
  61.     ....
  62.  
  63.     public boolean containsOrEquals (String actualText, String expectedText){
  64.         return(actualText.contains(expectedText));
  65.     }
  66. /*
  67.     а тут - экономия на спичках)
  68.     check - и так в 2 строчки
  69.     ради экономии одной строчки организовывать метод - расточительство)
  70.  
  71.     в данном случае - мы усложнили код )
  72.  
  73.     избавляйся от containsOrEquals тут и в потомке
  74.     check - и так хорош
  75.  
  76.     а наследование позволит не создавать кучу вспомогательного и упростить конструктор
  77. */
  78. public class ExactText extends Text {
  79.  
  80.     public ExactText(String expectedText) {
  81.         super(expectedText);
  82.     }
  83.     /*
  84.         конструктор - ок упростила
  85.     */
  86.  
  87.     @Override
  88.     public boolean check(WebElement element) {
  89.         return super.check(element);
  90.     }
  91.     /*
  92.         этот метод - будет и в предке и в потомке
  93.     */
  94.  
  95.     @Override
  96.     public String expected() {
  97.         return null;
  98.     }
  99.  
  100.     @Override
  101.     public String actual() {
  102.         return null;
  103.     }
  104.     /*
  105.         вот это не правильно
  106.         если бы мы эти методы тут не перереализовали - вызывались бы
  107.         сотвествующие методы предка
  108.         что хорошо)
  109.  
  110.         а мы - эти методы перереализовали, причем бесполезно
  111.  
  112.         просто - убери их
  113.         пусть работает логика предка - она нам подходит
  114.     */
  115.  
  116.     @Override
  117.     public boolean containsOrEquals (String actualText, String expectedText){
  118.         return(actualText.equals(expectedText));
  119.     }
  120.     /*
  121.         это уйдет
  122.     */
  123. }
  124. *************************************
  125. public class ExactTexts extends Texts  {
  126.  
  127.     public ExactTexts (String... texts) {
  128.         super(texts);
  129.         if (expectedTexts.length == 0) {
  130.             throw new IllegalArgumentException("Array of expected texts is empty.");
  131.         }
  132.     }
  133.     /*
  134.         посмотри на логику конструктора предка
  135.         нам тут отлично подойдет super(texts);
  136.     */
  137.  
  138.     @Override
  139.     public boolean check(List<WebElement> elements) {
  140.         return super.check(elements);
  141.     }
  142.     /*
  143.         этот метод можно просто не реализовывать - раз логика check
  144.         полностью совпадает с логикой check предка
  145.  
  146.         с конструктором такие номера не проходят
  147.         а с остальными методами - вполне
  148.  
  149.         http://stackoverflow.com/questions/2319817/how-to-inherit-constructor-from-super-class-to-sub-class
  150.         http://www.programcreek.com/2013/04/what-are-the-frequently-asked-questions-about-constructors-in-java/
  151.     */
  152.  
  153.     @Override
  154.     public String expected() {
  155.         return Arrays.toString(expectedTexts);
  156.     }
  157.  
  158.     @Override
  159.     public String actual() {
  160.         return String.join(", ", actualTexts);
  161.     }
  162.     /*
  163.         нам подходит функциональность этих методов у предка
  164.         можно тут не реализовывать
  165.     */
  166.  
  167.     @Override
  168.     public boolean containsOrEquals (List<String> actualTexts, String[] expectedTexts) {
  169.         for (int i = 0; i < expectedTexts.length; i++) {
  170.             if (!actualTexts.get(i).equals(expectedTexts[i])){}
  171.         }
  172.     return areTexts;}
  173.     /*
  174.         этот метод - будет попроще
  175.  
  176.         форматирование )))
  177.     */
  178.  
  179. }
  180. ****************************************
  181.  
  182. src / main / java / core / lazy /
  183.  
  184. /*
  185.     мы оперируем ленивыми ... чем?
  186.     сущностями или обертками
  187.     как тебе нравится)
  188.  
  189.     переименуй пекедж lazy в
  190.     lazywrappers / lazyentities/ wrappers / entities
  191.  
  192.     как понравится )
  193. */
  194. ************************
  195. public interface Lazy <T>  {
  196.     public T getWrappedEntity();
  197. }
  198. /*
  199.     реализация - ок
  200.  
  201.     лучше переименуй интерфейс в - LazyEntity
  202.  
  203. */
  204. ***************************************
  205. public abstract class AbstractLazyCollection<V> implements Lazy <List<WebElement>> {
  206. /*
  207.     направление верное )
  208.  
  209.     после реализации интерфейса - реализовать абстрактный класс,
  210.     реализовать все что можно на его уровне
  211.     и далее - в классах-потомках абстрактного класса - уже делать все остальноное)
  212.  
  213.     все так)
  214.  
  215.     только вот еще момент - нам потом жедательно объявлять переменные типа интерфейс
  216.     и инициализировать их объектами наших классов
  217.     значит - на уровне интерфейса должны быть объявлены все нужные нам методы
  218.  
  219.     значит - на не хватает в дереве иерархии - еще одного уровня
  220.  
  221.     реализуй интерфейс
  222.     LazyCollection
  223.     наследника LazyEntity <List<WebElement>>
  224.         в котором объяви методы shouldBe и shouldHave
  225.         getWrappedEntity() - уже объявлен в предке, повторяться не надо,
  226.         будем только дополнять
  227.  
  228.     и AbstractLazyCollection будет имплементировать LazyCollection
  229.  
  230.     и  LazyCollection и  AbstractLazyCollection уже не нуждаются в объявлении
  231.     AbstractLazyCollection<V>
  232.     LazyCollection<V>
  233.  
  234.     наоборот - мы уточнили этот тип - наследуясь от LazyEntity <List<WebElement>>
  235.  
  236. */
  237.  
  238. public By locator;
  239. /*
  240.     в абстрактном классе - рано объявлять локатор
  241.     у нас будет целое семейство классов лейзи-коллекций
  242.     один из них - и правла будет оперировать локатором, а остальные - нет
  243.     поле локатор уже в потомке объявишь
  244. */
  245.  
  246. public abstract List<WebElement> getWrappedEntity();
  247. /*
  248.     раз метод объявлен в интерфейсе
  249.     и ты его не собираешься реализовывать в абстрактном классе -
  250.     тут его не надо объхявлять
  251.     мы его уже в интервейсе объявили
  252.     нам этого хватит
  253. */
  254.  
  255. public abstract Lazy shouldBe(Condition <List<WebElement>> condition);
  256.  
  257. public abstract Lazy shouldHave (Condition <List<WebElement>> condition);
  258. /*
  259.     а вот эти методы - мы запросто тут можем реализовать
  260.  
  261.     все объекты-лейзи-коллекции  - будут проверяться одинаково
  262.  
  263.     что есть should...(condition) ?
  264.     это ждущая проверка
  265.  
  266.     мы ее уже на прошлом шаге реализовали
  267.  
  268.     смотри реализацию метода assertThat
  269.  
  270.     return waitFor(locator).until(condition, timeout);
  271.  
  272.     если класс WaitFor - научить оперировать не локатором -
  273.     а лейзи сущностью (LazyEnity - т к WaitFor - должен работать как с лейзи-элементами, так и с лейзи-коллекциями)
  274.  
  275.     то тут в should-методах
  276.     return waitFor(this).until(condition);
  277.  
  278.        вот неплохие линки - про использование this
  279.             https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
  280.             http://stackoverflow.com/questions/2411270/when-should-i-use-this-in-a-class
  281. */
  282.  
  283. public abstract String identity();
  284. }
  285.  
  286. /*
  287.     хм...
  288.     свежая мысль)
  289.    
  290.     ты знаешь, соглашусь с тобой
  291.     на уровне интерфейса LazyEntity объявляй такой метод)
  292.    
  293.     и тут - реализовывай)
  294.     для всех коллекций - это "elements"
  295.     а еще лучше - "collection" - так быстрее в глаза бросается - что речь не про элемент
  296. */
  297. ******************************************
  298. public class WaitFor {
  299.  
  300.  
  301.     private static By locator;
  302.  
  303.     public WaitFor(By locator) {
  304.         this.locator = locator;
  305.     }
  306.  
  307.     public static WaitFor waitFor(By locator) {
  308.         return new WaitFor(locator);
  309.     }
  310.  
  311.     /*
  312.         принимай не локатор, а LazyEntity
  313.     */
  314.  
  315.     public static <T> T until(Condition<T> condition, long timeout) {
  316.         ....
  317.                 T result = condition.apply(locator);
  318.                 /*
  319.                     передавай не локатор, а LazyEntity
  320.                 */
  321. *******************************************************
  322. public abstract class AbstractCondition<V> implements Condition<V> {
  323.  
  324.     public By locator;
  325.     /*
  326.         тут тоже оперируем не локатором, а LazyEntity
  327.     */
  328.  
  329.     public abstract V getWrappedEntity();
  330.     /*
  331.         этот метод уйдет
  332.     */
  333.  
  334.     public abstract boolean check(V entity);
  335.  
  336.     public V apply(By locator) {
  337.     /*
  338.         измени параметр метода - не локатор, а LazyEntity
  339.         и на уровне интерфейса тоже
  340.     */
  341.         this.locator = locator;
  342.         V entity = getWrappedEntity();
  343.         /*
  344.             и getWrappedEntity() - теперь вызывай  у этой LazyEntity )
  345.  
  346.             соотвественно - убирай реализацию getWrappedEntity()
  347.             в этом классе и классах-потоках
  348.  
  349.             это был костыль)
  350.             теперь лейзи-сущность
  351.             сама про себя это расскажет
  352.         */
  353.         return check(entity) ? entity : null;
  354.     }
  355. *******************************************************
  356. public abstract class CollectionCondition extends AbstractCondition<List<WebElement>> {
  357.  
  358.     public String identity() {
  359.         return "elements";
  360.     }
  361.  
  362.     public List<WebElement> getWrappedEntity(){
  363.         return getDriver().findElements(locator);
  364.     }
  365.  
  366. }
  367.  
  368. /*
  369.     оба метода уйдут отсюда
  370.     аналогично - для ElementCondition
  371.    
  372.     это будем получать уже от лейзи-сущности
  373.     что логично)
  374.    
  375.     фактически - этот класс - просто уточнит тип
  376.     поскольку будет куча наследников-кондишенов
  377.     это не так мало)
  378.     так что пусть такой класс будет)
  379.  
  380.     на уровне конечных кондишенов - уже наши навороты никак не скажутся
  381. */
  382. *********************************
  383. public class LazyCollection extends AbstractLazyCollection <List<WebElement>>{
  384. /*
  385.     раз мы AbstractLazyCollection не объявляли как  AbstractLazyCollection<V>
  386.     то и тут уже не придется уточняться до List<WebElement>
  387.     на самом деле - мы это на предыдущем шаге сделали
  388.    
  389.     а вот на уровне класса лейзи-коллекции, оперирующей локатором
  390.     реализуй поле для локатора и конструктор, получающий локатор и фиксирующий его в поле
  391. */
  392.     @Override
  393.     public List<WebElement> getWrappedEntity() {
  394.         return getDriver().findElements(locator);
  395.     }
  396. /*
  397.     да, как раз тут и надо реализовать getWrappedEntity()
  398.     и реализация верная
  399.  
  400.     конечные классы лейзи-сущностей - будем называть по схеме
  401.  
  402.     Lazy+Откуда+Уточнение+Element/Collection
  403.  
  404.     это будет LazyWebDriverCollection (т к откуда = WebDriver)
  405.    
  406.     также реализуй для класса toString()
  407.     тут будет ок - если мы вернем локатор
  408. */
  409.  
  410.     @Override
  411.     public Lazy shouldBe(Condition<List<WebElement>> condition) {
  412.         return null;
  413.     }
  414.  
  415.     @Override
  416.     public Lazy shouldHave(Condition<List<WebElement>> condition) {
  417.         return null;
  418.     }
  419.    
  420.     @Override
  421.     public String identity() {
  422.         return "elements";
  423.     }
  424. /*
  425.     эти методы - с общей функциональностью для всех лейзи-коллекций
  426.     и мы их реализовали на уровне абстрактного предка
  427.    
  428.     все - в потомках не морочимся с ними вообще)
  429.     тут - в потомке абстрактного класса - удаляй код)
  430.     все уже реализовано в абстрактном предке
  431. */    
  432.  
  433.  
  434. /*
  435.     аналогично описанному  - проработай и лейзи-элемент
  436. */
Advertisement
Add Comment
Please, Sign In to add comment