Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class GoogleSearhTest {
- /*
- буковку в имени тест-класса потеряла
- IntelIJ Idea ошибки спеллинга подчеркивает зеленой волнистой линией
- подправь
- */
- public static WebDriver driver = new FirefoxDriver();
- ....
- @After
- public void tearDown(){
- driver.quit();
- }
- /*
- такие вещи - держи рядом друг с другом
- и лучше - к начале кода тест-класса
- причина - чтоб сразу увидеть общую логику тест-класса, а уже потом вдаваться в детали
- тут есть еще одна тонкость)
- ты ее не заметила - т к тест-метод у тебя пока один)
- instance initialization block - будет выполняться перед запуском каждого тест-метода
- static initialization block - перед запуском всех тест-методов тест-класса
- это же относится и к переменным класса - static & instance
- http://www.javamadesoeasy.com/2015/06/differences-between-instance.html
- если грубо, то разница по эффекту - как использовать @Before или @BeforeClass метод
- если нам нужно инициализировать вебдрайвер - лишь единожды перед запуском всех тест-классов -
- то это надо делать - или в @BeforeClass-методе или в static initialization block
- а если это нужно делать перед каждым запуском каждого тест-метода - или в @Before или в instance initialization block
- и закрывать вебдрайвер - нужно в соотвествующем методе
- если создали или в @BeforeClass-методе или в static initialization block
- так закрываем в @AfterClass
- если в @Before или в instance initialization block
- то в @After
- Конечно, есть разница между применением initialization block и специальных методов
- Мы получим более содержательное сообщение об ошибке - если работаем с аннотированными методами
- http://stackoverflow.com/questions/15493189/beforeclass-vs-static
- http://www.unknownerror.org/opensource/junit-team/junit/q/stackoverflow/512184/best-practice-initialize-junit-class-fields-in-setup-or-at-declaration
- http://www.javaworld.com/article/2076265/testing-debugging/junit-best-practices.html
- (подзаголовок Do not use the test-case constructor to set up a test case)
- И еще неочевидный момент
- Если в предке нескольких тест-классов в static initialization block создать вебдрайвер
- а в @AfterClass - удалять
- То уже при запуске тестов из второго тест-класса - начнутся проблемы
- т к @AfterClass-метод уже отработал (для предыдущего тест-класса)
- а вот static initialization block - уже не вызовется)
- он ведь вызывается вообще единожды - при начале работы с классом (а это уже случилось ранее)
- */
- ****************************
- @Test
- public void testSearchAndFollowLink() {
- driver.get("http://google.com/ncr");
- driver.findElement(By.name("q")).clear();
- driver.findElement(By.name("q")).sendKeys("Selenium automates browsers");
- driver.findElement(By.name("q")).sendKeys((Keys.ENTER));
- /*
- вот этот кусочек можно было переписать в 2 строки - вызвав sendKeys("...",Keys.ENTER)
- а поскольку мы только открыли наш урл, то можно рассчитывать, что поле поиска - пустое
- и можно не вызывать driver.findElement(By.name("q")).clear();
- останется одна строчка
- */
- (new WebDriverWait(driver,6)).until(sizeOf(results,10));
- /*
- в коде - многократно повторяется (new WebDriverWait(driver,6))
- рядом с driver объяви и инициализируй переменную wait
- и тут уже будешь писать wait.until(...)
- код станет понагляднее
- ниже ты используешь бОльший таймаут
- просто при инициализиции переменной - установи макмимальный нужный таймаут
- лишних ожиданий это не породит
- как только мы дожидаемся выполнения кондишена - код выполняется далее
- */
- (new WebDriverWait(driver,6)).until(
- textToBePresentInElementLocated(By.cssSelector("#rso>.g>.rc"),"Selenium automates browsers"));
- /*
- Использовала особенности селектора в корыстных целях)))
- все равно лучше оперировать уже существующим results
- Поскольку обращаемся к первому результату - нам подойдет и такой локатор - results
- а если бы обращались к не первому результату - пришлось бы что-то такое делать - http://joxi.ru/5md7jYwtvjGbzr
- */
- driver.findElement(By.cssSelector("#rso>.g>.rc>.r")).click();
- /*
- что мы делаем
- мы из списка результатов, получаем самый первый, у него - получаем внутренний элемент с селектором ....
- и на него кликаем
- раз для результатов у нас есть переменная - оттолкнись от нее
- driver.findElements(...).get(...).findElement(...)
- так будет нагляднее - код будет сам пояснять себя - с чем мы работаем
- реализуй метод followLink(int index)
- в рамках подготовки к следующему заданию)
- */
- (new WebDriverWait(driver,12)).until(
- textToBePresentInElementLocated(By.cssSelector("#mainContent>h2"),"What is Selenium?"));
- assertEquals(driver.getCurrentUrl(), "http://docs.seleniumhq.org/");
- /*
- а тут мы можем написать полаконичнее
- у селениума - есть кондишены для проверки урла
- ты можешь вызвать длущую проверку - для проверки урла
- нам не понадобится проверка текста в элементе - для ожидания загрузки страницы
- https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html#urlContains-java.lang.String-
- */
- }
- By results = By.cssSelector("#rso>.g>.rc, .srg>.g");
- public static ExpectedCondition<Boolean> sizeOf(final By results,
- final int expectedSize) {
- /*
- кондишен - штука универсальная
- он работает для любого списка элементов
- да, мы вызываем его для результатов поиска
- так мы это и уточним при вызове )
- а на уровне кондишена - названия должны быть в контексте нашего универсального кондишена
- что это final By results
- это - локатор для элементов
- elementsLocator - будет в самый раз
- */
- ...
- public String toString() {
- return String.format("\nsize of list: %s\n to be: %s\n while actual size is:%s\n", driver.findElements(results), expectedSize, listSize);
- }
- /*
- тут вместо driver.findElements(results) - выведи просто локатор
- просто сравни сообщения об ошибках - сейчас и после исправления
- когда пишешь кондишен - всегда проверяй его в 2-ух режимах
- когда проверка по этому кондишену должна пройти (она таки должна проходить)
- и когда проверка по этому кондишену не должна пройти
- (помимо того, что тест должен упасть, он должен увасть с наглядным сообщением об ошибке)
- */
- };
- /*
- поскольку кондишен - вещь универсальная
- перенеси его в класс CustomConditions
- и тут - только вызывай его
- класс CustomConditions - как контейнер для универсального - размести в ветке проекта src \ main
- */
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment