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

В общем что-то процесс встал …
в общем создаю объект 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("Иван");

        

    }


}

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

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

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

Без коллег программистов все бы училось гораздо дольше … В общем пошел путем 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 создана!"));
   }








}

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

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

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

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

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

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

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

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

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

2 лайка

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

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

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