julia_v_iluhina

Untitled

Nov 10th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.15 KB | None | 0 0
  1. public  class GoogleSearhTest {
  2. /*
  3.     буковку в имени тест-класса потеряла
  4.     IntelIJ Idea ошибки спеллинга подчеркивает зеленой волнистой линией
  5.     подправь
  6. */
  7.  
  8.     public static WebDriver driver = new FirefoxDriver();
  9.     ....
  10.     @After
  11.     public void tearDown(){
  12.         driver.quit();
  13.     }
  14. /*
  15.     такие вещи - держи рядом друг с другом
  16.     и лучше - к начале кода тест-класса
  17.     причина - чтоб сразу увидеть общую логику тест-класса, а уже потом вдаваться в детали
  18.  
  19.     тут есть еще одна тонкость)
  20.     ты ее не заметила - т к тест-метод у тебя пока один)
  21.  
  22.     instance initialization block - будет выполняться перед запуском каждого тест-метода
  23.     static initialization block - перед запуском всех тест-методов тест-класса
  24.     это же относится и к переменным класса - static & instance
  25.     http://www.javamadesoeasy.com/2015/06/differences-between-instance.html
  26.  
  27.     если грубо, то   разница по эффекту - как использовать @Before или  @BeforeClass метод
  28.     если нам нужно инициализировать вебдрайвер - лишь единожды перед запуском всех тест-классов -
  29.     то это надо делать - или в @BeforeClass-методе или в static initialization block
  30.     а если это нужно делать перед каждым запуском каждого тест-метода - или в @Before или в instance initialization block
  31.  
  32.     и закрывать вебдрайвер - нужно в соотвествующем методе
  33.     если создали или в @BeforeClass-методе или в static initialization block
  34.     так закрываем в @AfterClass
  35.  
  36.     если в @Before или в instance initialization block
  37.     то в @After
  38.  
  39.     Конечно, есть разница между применением  initialization block и специальных методов
  40.     Мы получим более содержательное сообщение об ошибке - если работаем с аннотированными методами
  41.         http://stackoverflow.com/questions/15493189/beforeclass-vs-static
  42.         http://www.unknownerror.org/opensource/junit-team/junit/q/stackoverflow/512184/best-practice-initialize-junit-class-fields-in-setup-or-at-declaration
  43.         http://www.javaworld.com/article/2076265/testing-debugging/junit-best-practices.html
  44.         (подзаголовок Do not use the test-case constructor to set up a test case)
  45.     И еще неочевидный момент
  46.         Если в предке нескольких тест-классов в static initialization block создать вебдрайвер
  47.         а в @AfterClass - удалять
  48.         То уже при запуске тестов из второго тест-класса - начнутся проблемы
  49.         т к @AfterClass-метод уже отработал (для предыдущего тест-класса)
  50.         а вот static initialization block - уже не вызовется)
  51.         он ведь вызывается вообще единожды - при начале работы с классом (а это уже случилось ранее)
  52. */
  53. ****************************
  54.  
  55.     @Test
  56.     public void testSearchAndFollowLink() {
  57.  
  58.         driver.get("http://google.com/ncr");
  59.  
  60.         driver.findElement(By.name("q")).clear();
  61.         driver.findElement(By.name("q")).sendKeys("Selenium automates browsers");
  62.         driver.findElement(By.name("q")).sendKeys((Keys.ENTER));
  63.         /*
  64.             вот этот кусочек можно было переписать в 2 строки - вызвав sendKeys("...",Keys.ENTER)
  65.             а поскольку мы только открыли наш урл, то можно рассчитывать, что поле поиска  - пустое
  66.             и можно не вызывать  driver.findElement(By.name("q")).clear();
  67.             останется одна строчка
  68.         */
  69.         (new WebDriverWait(driver,6)).until(sizeOf(results,10));
  70.         /*
  71.             в коде - многократно повторяется (new WebDriverWait(driver,6))
  72.             рядом с driver объяви и инициализируй переменную wait
  73.             и тут уже будешь писать wait.until(...)
  74.  
  75.             код станет понагляднее
  76.  
  77.             ниже ты используешь бОльший таймаут
  78.             просто при инициализиции переменной - установи макмимальный нужный таймаут
  79.             лишних ожиданий это не породит
  80.             как только мы дожидаемся выполнения кондишена - код выполняется далее
  81.         */
  82.         (new WebDriverWait(driver,6)).until(
  83.                 textToBePresentInElementLocated(By.cssSelector("#rso>.g>.rc"),"Selenium automates browsers"));
  84.         /*
  85.             Использовала особенности селектора в корыстных целях)))
  86.             все равно лучше оперировать уже существующим  results
  87.             Поскольку обращаемся к первому результату - нам подойдет и такой локатор - results
  88.             а если бы обращались к не первому результату - пришлось бы что-то такое делать - http://joxi.ru/5md7jYwtvjGbzr
  89.         */
  90.  
  91.         driver.findElement(By.cssSelector("#rso>.g>.rc>.r")).click();
  92.         /*
  93.             что мы делаем
  94.             мы из списка результатов, получаем самый первый, у него - получаем внутренний элемент с селектором ....
  95.             и на него кликаем
  96.  
  97.             раз для результатов у нас есть переменная - оттолкнись от нее
  98.             driver.findElements(...).get(...).findElement(...)
  99.  
  100.             так будет нагляднее - код будет сам пояснять себя - с чем мы работаем
  101.  
  102.             реализуй метод followLink(int index)
  103.             в рамках подготовки к следующему заданию)
  104.         */
  105.  
  106.         (new WebDriverWait(driver,12)).until(
  107.                 textToBePresentInElementLocated(By.cssSelector("#mainContent>h2"),"What is Selenium?"));
  108.         assertEquals(driver.getCurrentUrl(), "http://docs.seleniumhq.org/");
  109.         /*
  110.             а тут мы можем написать полаконичнее
  111.             у селениума - есть кондишены для проверки урла
  112.             ты можешь вызвать длущую проверку - для проверки урла
  113.             нам не понадобится проверка текста в элементе - для ожидания загрузки страницы
  114.             https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html#urlContains-java.lang.String-
  115.         */
  116.     }
  117.  
  118.     By results =  By.cssSelector("#rso>.g>.rc, .srg>.g");
  119.  
  120.      public static ExpectedCondition<Boolean> sizeOf(final By results,
  121.                                                      final int expectedSize) {
  122.      /*
  123.         кондишен - штука универсальная
  124.         он работает для любого списка элементов
  125.        
  126.         да, мы вызываем его для результатов поиска
  127.         так мы это и уточним при вызове )
  128.        
  129.         а на уровне кондишена - названия должны быть в контексте нашего универсального кондишена
  130.        
  131.         что это final By results
  132.         это - локатор для элементов
  133.         elementsLocator - будет в самый раз
  134.      */                                                    
  135.         ...
  136.  
  137.             public String toString() {
  138.                 return String.format("\nsize of list: %s\n to be: %s\n while actual size is:%s\n", driver.findElements(results), expectedSize, listSize);
  139.             }
  140.             /*
  141.                 тут вместо driver.findElements(results) - выведи просто локатор
  142.                 просто сравни сообщения об ошибках - сейчас и после исправления
  143.                
  144.                 когда пишешь кондишен - всегда проверяй его в 2-ух режимах
  145.                     когда проверка по этому кондишену должна пройти (она таки должна проходить)
  146.                    
  147.                     и когда проверка по этому кондишену не должна пройти
  148.                     (помимо того, что тест должен упасть, он должен увасть с наглядным сообщением об ошибке)
  149.             */
  150.         };
  151.         /*
  152.             поскольку кондишен - вещь универсальная
  153.             перенеси его в класс CustomConditions
  154.             и тут - только вызывай его
  155.            
  156.             класс CustomConditions - как контейнер для универсального - размести в ветке проекта src \ main
  157.         */
  158.     }
  159.  
  160. }
Advertisement
Add Comment
Please, Sign In to add comment