julia_v_iluhina

Untitled

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