t.me/atinfo_chat Telegram группа по автоматизации тестирования

Запутался с page object или как правильно создать тест

page-object
java
webdriver
Теги: #<Tag:0x00007f9c479fd1d0> #<Tag:0x00007f9c479fd068> #<Tag:0x00007f9c479fcf00>

(Gallagher) #1

В общем что-то процесс встал …
в общем создаю объект LoginPage … но мне же в нем надо перед тестом поставить собакаТест и потом уже создать статический метод и в этом методе создавать метод под каждое поле как здесь https://comaqa.gitbook.io/selenium-webdriver-lectures/page-object-pattern.-arkhitektura-testovogo-proekta./ispolzovanie-patterna-page-object.
А куда девать то все типа

System.setProperty("webdriver.chrome.driver", "/Users/s.ivonin/Downloads/chromedrivernew/chromedriver.exe");
        ChromeDriver driver = new ChromeDriver();
        driver.manage().window().setSize(new Dimension(1300, 800));

package ru.Online;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;

public class LoginPage {
    @Test


    public static void testWait(){
        System.setProperty("webdriver.chrome.driver", "/Users/s.ivonin/Downloads/chromedrivernew/chromedriver.exe");
        ChromeDriver driver = new ChromeDriver();
        driver.manage().window().setSize(new Dimension(1300, 800));

        By usernameLocator = By.id("first_name");
        By usersurnameLocator = By.id("last_name");
        By userpatLocator = By.id("middleName");
        By mailLocator = By.id("reg_email");



        driver.get("http://test.ru/register/create#professor");

        // закрываем отладочную панель

        public static LoginPage closeLaravel(){
            WebElement close = driver.findElement(By.xpath("//a[@class='phpdebugbar-close-btn']"));
            close.click();}


        // заполняем поле E-mail
        String email = "ivonin85" + "+" + System.currentTimeMillis() + "@gmail.com";
        WebElement selectMail = driver.findElement(mailLocator);
        selectMail.sendKeys(email);

        // заполняем первое поле фамилия



        WebElement selectSurname = driver.findElement(usersurnameLocator);
        selectSurname.sendKeys("Иванов");

        // заполняем первое поле имя

        WebElement selectName = driver.findElement(usernameLocator);
        selectName.sendKeys("Иван");

        

    }


}


(Gallagher) #2

В общем как я это вижу: создаешь Объект где под каждое поле своя функция, делаешь его статик и можно обращаться к ним через ИмяКлассна.ИмяФункции и вызывать где угодно… А в каком файле инициализировать драйвер, ставить эту собакаТест?


(Valentin G ) #3

Мое мнение, PageObject должен быть в отдельном классе. Потом уже инициировать его перед тестом, или в тесте (зависит некоторых факторов).


(Gallagher) #4

Ну я вообще правильно понял этот подход? У меня грубо говоря каждая страница (уникальная страница) это отдельный класс … И потом я уже вызываю те методы которые мне нужно в файле …


(Gallagher) #5

Без коллег программистов все бы училось гораздо дольше … В общем пошел путем pageObject … если конечно это он ))))

Такая пока картинка получается …

package ru.test;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;

public class TestTest {
   @Test
   public void testWait() {
       System.setProperty("webdriver.chrome.driver", "/Users/s.ivanov/Downloads/chromedrivernew/chromedriver.exe");
       ChromeDriver driver = new ChromeDriver();
       driver.manage().window().setSize(new Dimension(1300, 800));

       LoginPage registration = new LoginPage(driver);

       // открыть страницу
       driver.get("http://test.ru/register/create#professor");
       // закрыть панель Laravel
       registration.closeLaravel();
       // ввести E-mail
       registration.sendMail();
       // ввести имя
       registration.sendName();
       // вводим фамилию
       registration.sendSurname();
       // вводим фамилию
       registration.sendPatronymic();
       // вводим организацию
       registration.sendorganization();
       // вводим дисциплину
       registration.sendDiscipline();
       // соглашаемся с условиями
       registration.checkMark();
       // нажать кнопку регистрации
       registration.clickButton();
       // проверяем что на странице есть страница с поздравлением
       registration.confirmRegistration();
       System.out.println("Регистрация преподавателя прошла успешно");
   }
}
package ru.test;

import org.junit.Assert;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;

public class LoginPage {

   private WebDriver driver;
   private WebDriverWait wait;

   public LoginPage(WebDriver driver){
       this.driver = driver;
       this.wait = new WebDriverWait(driver, 10);
   }





   @Test
   public void closeLaravel(){
       WebElement close = driver.findElement(By.xpath("//a[@class='phpdebugbar-close-btn']"));
       close.click();}

   public void sendMail(){
       String email = "ivanov85" + "+" + System.currentTimeMillis() + "@gmail.com";
       WebElement selectMail = driver.findElement(By.id("reg_email"));
       selectMail.sendKeys(email);
   }
   public void sendName(){
       WebElement selectName = driver.findElement(By.id("last_name"));
       selectName.sendKeys("Иван");
   }
   public void sendSurname(){
       WebElement selectSurname = driver.findElement(By.id("first_name"));
       selectSurname.sendKeys("Иванов");
   }
   public void sendPatronymic(){
       WebElement selectPatronymic = driver.findElement(By.id("middleName"));
       selectPatronymic.sendKeys("Иванович");
   }
   public void sendorganization(){
       WebElement organization = driver.findElements(By.id("organization")).get(0);
       Select selectOrganization = new Select(organization);
       wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("selection")));
       selectOrganization.selectByValue("E60EE044-341C-4679-BAEA-492B50F6DA6C");
   }
   public void sendDiscipline(){
       WebElement discipline = driver.findElement(By.xpath("//*[@id=\"registration-form\"]/fieldset/div[8]/div/span[1]/span[1]/span/ul"));
       discipline.click();

       // наводим мышку на список

       Actions actions = new Actions(driver);
       actions.moveToElement(discipline).build().perform();

       // выбираем дисциплину из выпадающего списка

       wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"select2-discipline-results\"]/li[3]"))).click();
   }
   public void checkMark(){
       WebElement checkMark = driver.findElement(By.cssSelector("#agree"));
       checkMark.click();
   }
   public void clickButton (){
       WebElement button = driver.findElement(By.id("registration-form"));
       button.findElement(By.cssSelector("button[class=\"btn btn-lg btn-danger\"]")).click();
   }
   public void confirmRegistration(){
       WebElement str = driver.findElement(By.cssSelector(".lead.text-success"));
       String strtrue = str.getText();
       Assert.assertTrue(strtrue.equals("Учетная запись на сайте test.ru создана!"));
   }








}

(Valentin G ) #6

Получше :slight_smile:
Данные для теста лучше подавать как параметры, и валидации (асерты) делать в тесте а не в PageObject.


(Viktor) #7

Можно в одну строчку писать, переменная не нужна если ее используешь один раз
driver.findElement(By.id(“first_name”)).sendKeys(“Иванов”);

Данные подавать через параметры, они разные могут быть
public void sendName(string name){
driver.findElement(By.id(“last_name”)).sendKeys(name);;
}


(Gallagher) #8

Ну это я просто уже на ходу в конце дня сочинял ))
Ну как я понимаю подход верный… Раз ничего не говорите…
Блин, я изучаю две недели webdriver и в принципе уже могу заавтоматизировать весь сайт применяя PageObject … Это и вся автоматизация? )))


Логгирование действий Selenium WebDriver
(Viktor) #9

Нет, автоматизация не ограничивается написанием авто тестов. Настройка инфраструктуры, качественных репортов, данных для анализа результатов, также нужно пройтись по гра■■■м :grinning:. Ну и наконец автоматизировать можно не только веб, так что будет все, когда будешь думать что никогда не будет все :wink:


(Gallagher) #10

Следующий этап я так понимаю многобраузерность и многопоточность?
Я пробовал свой код написанный под Chrome запускать через мозилу, что-то не пошло …
Кстати вы как это реализуете вообще? Один скрипт для всех браузеров?


(Alexandr D.) #11

На мой взгляд плохая тема.

PO должен знать, что проверять, но какую именно проверку совершать, должен знать тест.
Т.е. вы можете написать проверку какого-то поля, но как именно проверять, надо передавать через коллбэк, либо использовать в параметре общий интерфейс, что-то типа этого: https://github.com/nunit/docs/wiki/Constraints


#12

Да, теперь напишешь еще 20 тестов и ты сеньор автоматизатор, можешь смело идти к начальству и просить повышение.


(Alexandr D.) #13

Ну, любой человек может заавтоматизировать любой сайт, в этом особо тяжелого ничего нет.
А вот делать это с умом - это приходит с опытом)


(Gallagher) #14

Ну как бы это в любой профессии так … :wink:


(Dmitrii Demin) #15

Да! Вам пора двигаться дальше - в разработку!
А backend, в особенности всякие хитрые штуки поверх TCP/IP сами себя протестируют, не переживайте =)