julia_v_iluhina

Untitled

Sep 29th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.31 KB | None | 0 0
  1. public class GmailTest extends BaseTest {
  2.  
  3.     @BeforeClass
  4.     public static void configure() {
  5.         Configuration.timeout = 20;
  6.     }
  7. /*
  8.     заметила - что раньше вот так было...
  9.     если запускать все тесты проекта
  10.     то вот эта строчка очень портит картинку)
  11.     что объяснимо - таймаут у нас в миллисекундах
  12.  
  13.     может - собственно поэтому у тебя в прошлый раз тесты и не запускались нормально?
  14.  
  15.     погоняла все тесты - все бегает)
  16.     это ок
  17.     правда, пришлось чуть подправить google search - но то уже особенности відаси результатов поиска
  18.     возможно - у тебя ок с твоим кодом
  19. */
  20. *********************************
  21.     public static void followLink(int index) {
  22.         results.shouldHave(minimumSizeOf(index + 1));
  23.         results.get(index).find(".r>a").click();
  24.     }
  25.  
  26. /*
  27.     не надо тут results.shouldHave(minimumSizeOf(index + 1));
  28.  
  29.     как click() работает в нашем лейзи-элементе - дожидается его видимости
  30.     так что - все ок будет и без предварительной проверки
  31. */
  32. ********************************************
  33. new WebDriverWait(getDriver(), 4).until(urlContains("http://www.seleniumhq.org/"));
  34. /*
  35.     можно кстати вернуть в ConciseAPI assertThat - который работал с родными селениумскими кондишенами
  36.     вот тут - пригодился бы )
  37. */
  38. ********************************************
  39. public static Condition<List<WebElement>> listIsEmpty()
  40. /*
  41.     можно полаконичнее назвать кондишен empty()
  42.     касается и метода, и класса
  43.  
  44.     аналогично - для sizeOf и minimumSizeOf
  45.     это раньше - когда первым параметром был локатор - этот Of был уместен
  46.     теперь - точно лишнее
  47.     size и minimumSize - будет полностью ок
  48. */
  49. ***********************************
  50. public static void visit() {
  51.         open("https://todomvc4tasj.herokuapp.com");
  52. }
  53.  
  54. /*
  55.     думаю - лишний метод)
  56. */
  57. ************************************
  58. static LazyCollection mails = $("[role = 'main']").findAll(".zA");
  59. /*
  60.     мы и вот так можем переменные объявлять)
  61.  
  62.     т к в конструкторах наших лейзи-сущностей - мы ничего не ищем...
  63.     только запоминаем  - как нам такую сущность искать
  64.  
  65.     верни назад - старый вариант
  66.     static LazyCollection mails = $$("[role = 'main'] .zA");
  67.  
  68.     проверили findAll  - и хорошо
  69. */
  70. **************************************
  71. public static void assertMail(int index, String text) {
  72.         mails.get(index).shouldHave(ElementConditions.text(text));
  73. }
  74.  
  75. public static void assertMails(String... texts) {
  76.         mails.shouldHave(texts(texts));
  77. }
  78. /*
  79.    shouldHave - предполагает работу с кондишеном и только с кондишеном
  80.    потому смело используй import static
  81.  
  82.    конечно, получится не очень понятно - .shouldHave(text(text));
  83.    но - в случае shouldHave(texts(texts)) - тебя это не смутило)
  84.  
  85.    самое красивое решение - переименовать параметры методов в mailText & mailTexts
  86.    и использовать import static
  87.  
  88.    получишь
  89.    shouldHave(text(mailText))
  90.    shouldHave(texts(mailTexts))
  91. */
  92.  
  93. /*
  94.     как ты понимаешь - весь код полируем)
  95.     скоро финиш)
  96.  
  97.     так что - и сами тест-методы и пейджи - все просмотри
  98.     поправь выравнивание
  99.     реформатируй
  100.  
  101.     ну и то что я написала - тоже поправь
  102. */
  103. *************************************************
  104.     @Override
  105.     public boolean is(Condition<WebElement> condition) {
  106.         return condition.check(lazyElement.getWrappedEntity());
  107.     }
  108. /*
  109.     Тут надо ловить WebDriverException
  110.  
  111.     чтобы гарантированно is не падал
  112.     а просто возвращал - да/нет
  113.  
  114.     если падает - значит возвращай - нет
  115. */
  116. ************************************************
  117. public WebElement fetchWrappedEntity() {
  118.         List<WebElement> parentCollectionWrappedElements = parentCollection.getWrappedEntity();
  119. /*
  120.     ага, молодец, все ок реализовала
  121.  
  122.     твой вариант, конечно красивее был
  123.     но этот пошустрее
  124.  
  125.     переменную parentCollectionWrappedElements
  126.     можно и попроще назвать
  127.     parentElements, elements - будет ок )
  128. */
  129. ******************************************
  130. public class LazyElementInnerCollection extends AbstractLazyCollection {
  131.  
  132.     @Override
  133.     public String toString() {
  134.         return parentElement.toString() + " find(" + innerLocator + ")";
  135.     }
  136.  
  137. /*
  138.     и реализовала, и оттестила - молодец)
  139.  
  140.     в toString() все же уточни - не " find(", а " findAll("
  141. */
  142. ***********************************
  143. public class ExactTexts extends CollectionCondition {
  144.     protected String[] expectedTexts;
  145.     protected List<String> elementTexts;
  146.  
  147. /*
  148.     насчет использования модификатора доступа protected
  149.  
  150.         есть такая точка зрения, что использовать protected - это самообман
  151.         т к в рамках потомков можно для отнаследованного protected-метода
  152.         этот метод сделать публичным
  153.  
  154.         когда мы использовали protected, мы хотели, чтобы что-то было с возможностью наследования
  155.         и не хотели его внешнего использования.
  156.         а кто-то отнаследовался от нашего класса и объявил это как public
  157.         и вот то, что мы прятали внутри класса - уже "торчит" наружу
  158.  
  159.         есть good practice - избегать применения protected
  160.         то, что мы что-то объявим внутри класса-кондишена как public
  161.         не будет нам особо мешать при работе с нашим фреймворком
  162.         т к в итоге - используем для кондишена тип интерфейс,
  163.         и это позволит не светить нашими публичными переменными/методами
  164.         когда будем юзать фреймворк
  165.  
  166.         идеально про протектед-методы
  167.             http://programmers.stackexchange.com/questions/162643/why-is-clean-code-suggesting-avoiding-protected-variables
  168.             http://joxi.ru/52akqzoUGnqYGr
  169.  
  170.             http://stackoverflow.com/questions/3631176/why-are-many-developers-opposed-to-using-the-protected-modifier-in-oop
  171.             http://stackoverflow.com/questions/37011/should-you-ever-use-protected-member-variables
  172.             http://stackoverflow.com/questions/4913025/reasons-to-use-private-instead-of-protected-for-fields-and-methods
  173.  
  174.             http://www.javalobby.org/java/forums/t77911.html
  175.  
  176.     Просмотри весь проект, перейди на использование public
  177. */
  178. ******************************************
  179.  
  180. public class ExactTexts extends CollectionCondition {
  181.  ...
  182.  
  183.     @Override
  184.     public boolean check(List<WebElement> elements) {
  185.     ...
  186.                if (!elementTexts.get(i).equals(expectedTexts[i])) {
  187.                /*
  188.                     фактически - только эта строка и отличает реализацию метода
  189.                     check в этом кондишене и его потомке
  190.  
  191.                     можно
  192.                     в этом классе реализовать метод checkElement(int index)
  193.                     ровно с такой проверкой
  194.  
  195.                     и тогда в потомке - check убери полностью
  196.                     и просто перереализуй checkElement(int index)
  197.                     кода станет еще меньше )
  198.                */
  199.     ...
  200. ********************************************
  201. public static Condition<WebElement> visible() {
  202.         return new Visible();
  203. }
  204. /*
  205.     по идее - можно было еще короче)
  206. */
  207. public static Condition<WebElement> visible = new Visible();
  208.    
  209. /*
  210.     т е - реализовывать не метод, а статическую переменную
  211.     вроде бы - лаконичнее, что хорошо
  212.    
  213.     но - не так уж и хорошо)
  214.    
  215.     Тут есть такая тонкость)
  216.  
  217.     мы создали статические переменные = объект-кондишен
  218.  
  219.     и используем их в проекте, который поддерживает параллелизацию
  220.  
  221.     если мы в параллельных тестах будем использовать ОДИН объект-кондишен ОДНОВРЕМЕННО
  222.     могут возникать странные ошибки
  223.  
  224.     чтобы избежать этого
  225.     вместо переменных стоит использовать методы
  226.     тогда для каждого вызова кондишена мы будем использовать свой объект
  227.     и таких проблем не будет
  228.    
  229.     наш текущий вариант с методом - грамотнее)
  230. */
Advertisement
Add Comment
Please, Sign In to add comment