Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package helpers;
- /*
- тут можно назвать пекедж - core
- т к тут - будут новые Conditions = универсальные вещи, которые можно переиспользовать и далее
- */
- ...
- public class CustomConditions {
- /*
- смесь бульдога с носорогом получилась)
- то ли контейнер для новых кондишенов, то ли предок для тест-класса, то ли пейдж
- тоже будет полезным разобраться - в свете последующих работ)
- понимаю желание разгрузить тест-класс по максимуму
- пока - вынесем только и только статические методы - реализации кондишенов
- */
- public static WebDriver driver = new FirefoxDriver();
- public static WebDriverWait wait = new WebDriverWait(CustomConditions.driver, 6);
- /*
- старайся придерживаться правила - где объект создала - там его и убей)
- сейчас - вебдрайвер создается тут
- а убъем мы его в тест-классе
- не)
- так очень легко сделать ошибку - не убить/создать не вовремя/убить не вовремя и прочая-прочая
- для такого разрывания - в одном месте создали, в другом - убили - должны быть очень веские причины
- если их нет - не надо так делать)
- очень увеличиваешь вероятность ошибок
- да и код становится слишком загадочным)
- логика пока такая
- где нам нужен объект-вебдрайвер
- в тест-классе - на протяжении работы всех его тест-методов
- раз это логика тест-класса - то создание-убиение вебдрайвера - дело либо самого тест-класса либо его предка
- до кучи - и вот эта переменная wait - пусть они рядом будут
- */
- public static void search(String text){
- driver.findElement(By.name("q")).clear();
- driver.findElement(By.name("q")).sendKeys(text + Keys.ENTER);
- }
- /*
- это - мы бы реализовали в пейжде
- если бы его делали)
- по заданию - мы его не делаем
- пока оставь в тест-классе
- */
- public static ExpectedCondition<Boolean> sizeOf(final By elementsLocator, final int expectedSize){
- /*
- только это и должно остаться в этом классе
- буквально в следующем задании - тебе понадобится новый кондишен
- в этом же классе его и расположишь
- */
- public static void followLink(int index){
- /*
- это - метод-шаг, метод-действие
- такое мы выносили в пейджа
- пока - делаем без пейджей
- размести этот метод в тест-классе
- */
- List<WebElement> elements = driver.findElements(By.cssSelector(".srg .g"));
- elements.get(index);
- /*
- читаем код
- получили список элементов
- из него - получили элемент = такой-то элемент списка
- но - ничего с ним не делаем - дальше мы не работаем с полученным таким способом элементом
- */
- driver.findElement(By.cssSelector(" .r>a")).click();
- /*
- а тут - мы просто получаем элемент по селектору " .r>a" и кликаем на нем
- если тебе "повезет" так же как и мне - это вообще не будет главной линкой нулевого результата
- сравни
- http://joxi.ru/nAyqEx7HX0x4JA и http://joxi.ru/Dr860ybhkaGde2
- в селекторе " .r>a" - самый левый пробел - бесполезен
- пробел что значит - что ты ищешь что-то(в селекторе справа пробела) внутри чего-то(в селекторе слева пробела)
- верно - что получила внутри метода список элементов по селектору -
- (заранее объявить и использовать - можно только лейзи-прокси списки элементов или элементы
- а мы работаем без пейджеи - и соотвественно - без лейзи прокси
- потому - сами должны заботиться - чтобы получить элемент тогда, когда он есть
- вызываем мы этот метод уже после того - как проверили что результатов столько-то и текств таком-то результате = такой-то
- т е в момент - когда у нас уже гарантированно есть этот искомый элемент списка
- самое время заново получить список и найти в нем нужный нам элемент - он как раз есть)
- верно - что из полученного списка получила такой-то элемент
- теперь - надо у этого элемента получить подчиненный элемент с селектором ".r>a"
- и кликнуть на него
- можно записать это одной строкой и не используя дополнительных переменных
- но это уже как заработает код - собери
- */
- *******************************************************
- public class GoogleTest {
- @AfterClass
- public static void tearDown() {
- driver.quit();
- }
- /*
- вот я про это)
- раз тут - в тест-классе - убиваем -
- то тут - и создадим
- */
- @Test
- public void testSearchAndFollowLink() {
- driver.get("http://google.com/ncr");
- search("Selenium automates browsers");
- wait.until(sizeOf(By.cssSelector(".srg .g"), 10));
- /*
- ".srg .g" - используешь несколько раз
- заведи строковую переменную (тут же - в тест-классе)
- для этого селектора
- и далее используй
- */
- wait.until(
- textToBePresentInElementLocated(By.cssSelector(".srg .g:first-of-type"), "Selenium automates browsers"));
- /*
- тут - тоже сможешь эту же переменную - селектор ".srg .g" - использовать
- по возможности - будем DRY
- */
- followLink(0);
- wait.until(
- textToBePresentInElementLocated(By.cssSelector(".homepage"), "What is Selenium?"));
- urlContains("http://www.seleniumhq.org/");
- /*
- urlContains - это селениумский кондишен
- и ты можешь его применять в ждущей проверке wait.until как параметр
- в таком как сейчас варианте - в последней строке мы ничего не проверяем
- просто получили значение типа контишен и усе)
- а проверку текста "What is Selenium?" - можно будет уже и не делать)
- т к мы сразу можем ждущей проверкой урл проверить
- */
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment