Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <dependency>
- <groupId>ru.yandex.qatools.allure</groupId>
- <artifactId>allure-junit-adaptor</artifactId>
- <version>${allure.version}</version>
- </dependency>
- /*
- это в pom - уже не нужно
- ведь аллюр в проекте не импользуешь
- */
- **********************
- public class GoogleSearch {
- /*
- на самом деле - можно было пейдж не создавать
- т к в задании
- You will do only a smoke coverage and you most probably will not reuse "steps" in other tests.
- (Or you don't know will you reuse or not)
- */
- ***********************
- public static ElementsCollection links = ...;
- /*
- селектор верный
- но имя переменной - не точное
- это результаты поиска
- да, они содержат линки, но ведь не только линки
- results - было бы точнее
- */
- *******************************
- public static void navigateToGoogle() {
- /*
- сравни
- navigateToGoogle()
- и
- visit()
- поскольку вариантов урлов у нас немного - visit() был бы ок
- не настаиваю )
- */
- ******************************************
- public static void search(String query) {
- $("...").setValue(query).submit();
- }
- /*
- насчет селектора
- можно нагляднее
- обрати внимание на name этого же элемента
- у очень многих продуктов google строка поиска именно такое имя имеет
- от слова query
- http://joxi.ru/823k1x0U6oavV2
- имя параметра я бы уточнила до queryText
- не настаиваю)
- просто query у меня ассоциируется с чем-то более техническим
- возможно, это субъективно
- насчет submit()
- возможно, ты и так в курсе
- submit() для элемента сработает - только если этот элемент находится внутри элемента form
- и внутри него элемент для submit - задан
- https://www.quora.com/What-is-the-difference-between-click-and-submit-in-webdriver
- http://joxi.ru/Vm6QqxphxORZpr
- http://joxi.ru/gmvqJvkHx7dYbr
- в данном случае - submit() применим
- */
- *****************************************************
- public static void clickLink(String linkText) {
- for (SelenideElement link : links) {
- if (link.has(text(linkText))) {
- link.$("h3>a").click();
- break;
- }
- }
- $("#promo").should(exist);
- }
- /*
- тут сразу много всего
- первое - я бы назвала метод followLink
- больше отражает суть процесса
- второй момент
- в задании
- follow the link in 1st result
- т е - нужно кликнуть на главной линке первого результата
- а у тебя - идет выбор линки по ее тексту
- "h3>a" - хорошее уточнение
- нам нужно
- из списка результатов
- получить самый первый элемент
- в нем - получить главную линку ("h3>a")
- и на ней - кликнуть
- верно то, что ты оттолкнулся от переменной для результатов
- и верно, что уточнился до главной линки
- у коллекции элементов есть метод get
- он позволяет получить элемент коллекции по его индексу
- как и во всех джава-коллекциях - нумерация с нуля
- даже если бы тебе нужно было кликнуть на результате с таким-то текстом
- то никаких циклов для этого - не понадобилось бы
- links.findBy(text(linkText)).$("h3>a").click(); - так точнее, проще и надежнее
- наряду с кондишеном exactText есть еще и text - он проверяет, что в тексте єлемента содержится ожидаемый текст
- собственно, ты его тоже в коде использовал)
- только у кода есть недостатки
- для вот так полученного элемента - links.findBy(text(linkText)).$("h3>a")
- при клике на нем, или каком-то другом действии на UI - будет выполнено ожидание элемента
- в рамках таймаута
- а в реализации SelenideElement link : links - не факт, что на начало такого перебора
- весь список результатов уже загрузился
- допустим, ты можешь возразить - что ранее по коду мы проверили размер списка
- это конечно да)
- тут - соломки мы настелили
- но - получается, что надежность работы метода зависит от контекста его вызова
- что не очень хорошо
- link.has(text(linkText)) - has & is - не ждущие методы
- мы проверили, если на момент проверки текст элемента содержит нужный нам текст
- вполне возможно, миллисекундами позже - в том же элементе текст подгрузится
- и такая проверка бы прошла
- а так - мы просто проскакали мимо нужного - только потому - что нужное вовремя не догрузилось
- всех этих недостатков лишен вариант
- links.findBy(text(linkText)).$("h3>a").click();
- и еще - он более KISS
- никаких циклов и условий
- (они-то конечно есть, но "под капотом", under the hood - про это подробно будет во второй части курса)
- и последнее
- вот эта проверка
- $("#promo").should(exist);
- она не относится к логике перехода по нужной нам линке
- да и вообще - наш метод позволит кликнуть на совершенно разных линках
- и далеко не факт - что там будет такой элемент - $("#promo")
- во-первых, проверка
- $("#promo").should(exist); - не универсальна, потому в универсальном методе ей не место
- во-вторых
- такая проверка не имеет никакого отношения к логике действия - перехода на нужный урл
- в-третьих
- такая проверка к пейджу GoogleSearch не имеет никакого отношения
- ведь речь уже про другую веб страницу
- в-четрвертых
- не стоит прятать в методах-действиях - проверки
- и в методах-проверках - действия
- да, есть исключения
- мы видели их на курсе
- когда, например, мы покрывали проверку - что кнопка clear completed стала невидимой
- после выполнения этого действия (было в Якова видео про это)
- мы так смогли сделать только потому, что для тест-метода - такая проверка - лишние подробности
- а нам - практически ничего не стоило покрыть это просто по пути - для улусшения покрытия
- и еще был пример - проверки для обеспечения надежности предварительных действий
- http://pastebin.com/DcnD6CZe строки 116-135
- в общем случае - проверки - отдельно и действия-отдельно
- и то, и то - должно быть отражено в тест-методе
- и то, и то - часть тестовой логики
- ну и последнее)
- $("#promo").should(exist); - не самый наглядный вариант
- сравни
- $("#mainContent>h2").shouldHave(text("What is Selenium?"));
- такая строчка нагляднее нам покажет - что ждали мы какого-то элемента на новой странице
- той, которая про селениум
- резюме
- замени $("#promo").should(exist); на более наглядный вариант
- и вынеси эту строчку прямо в тест-метод
- */
- *************************
- public static void assertAnswers(int count) {
- /*
- тут стоило быть поточнее в имени метода
- уже решили, что список результатов = results
- assertResultsCount - точнее
- и мы используем для одного понятия - один термин
- что дает нам больше однозначности
- */
- **********************************
- public static void assertUrl(String url) {
- assertTrue(url().equals(url));
- }
- /*
- этот метод к пейджу GoogleSearch не имеет никакого отношения
- да, некий универсальный метод
- если считаешь нужным - для таких универсальных методов создавай класс-контейнер
- и располагай в нем статические универсальные методы
- но - см начало ревью про то - что еще неизвестно, будем ли переиспользовать шаги
- и второе - сравни
- assertTrue(url().equals("http://docs.seleniumhq.org/"));
- и
- assertUrl("http://docs.seleniumhq.org/")
- код - не намного сложнее
- я бы в таких обстоятельствах не стала создавать метод assertUrl
- и еще
- использование assertEquals - в случае ошибки - даст более понятное сообщение об ошибке
- поэкспериментируй)
- */
- *************************
- /**
- Automate:
- 1 visit http://google.com/ncr
- 2 search: “Selenium automates browsers”
- 3 check that 10 results are found
- 4 check the text “Selenium automates browsers” in 1st result
- 5 follow the link in 1st result
- 6 check that selenium official page is loaded
- */
- public class GoogleE2ETest {
- /*
- на уровень тест-класса - не надо выносить информацию о E2E
- если хочется подчеркнуть, что в этом классе будут лишь e2e сценарии для интеграционного тестирования
- так надо тогда что-то про Integration написать
- поскольку это один тест-класс
- то GoogleSearchTest - достаточно точно и лаконично
- */
- @Test
- public void testGoogleSearch(){
- /*
- а тут уже можно про Google не повторяться
- в принципе - тут отлично будет и просто перечислить - что мы тестим
- testSearchAndFollowLink
- ну или другие идеи в разделе про naming - в faq посмотри)
- */
- navigateToGoogle();
- search("Selenium automates browsers");
- assertAnswers(10);
- clickLink("Selenium automates browsers");
- /*
- до клика - проверь check the text “Selenium automates browsers” in 1st result
- подумай, как такой метод-проверку сделать поуниверсальнее
- про то - как реализовать
- 5 follow the link in 1st result
- писала выше
- */
- assertUrl("http://docs.seleniumhq.org/");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment