Перейти к содержимому

Фотография

Page object model, Maven и еще пару вопросов

Page object model Page object Maven

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 Isidor2811

Isidor2811

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Дацюк Олег

Отправлено 14 мая 2018 - 08:42

Всем привет! 

 

Начал изучать автоматизацию в тестировании, и хочется с самого начала делать все правильно, поэтому изучил Page object model, и пока читал но не практиковал, то все было понятно, но когда начал писать код, то немного запутался.

 

Сейчас напишу как я это вижу с кусками кода.

 

1. Создаю класс MainPage в котором будут храниться локаторы с которыми я буду работать. Для примера создал myAccountButton и signUpButton. 

2. Создаю конструктор для инициализации WebDriver и WebDriverWait. 

3. Потом создаю методы.

 

Код ниже. Тут для меня все понятно. Разве что инициализация  WebDriverWait. Для себя я решил, что добавлю ее в конструктор вместе с WebDriver.

И тут первый вопрос! Надо ли это делать - добавлять в конструктор? Или можно с ним (WebDriverWait) работать по другому. Блин..прочитал даже мне стало не совсем понятно, но надеюсь что Вы поймете.

public class MainPage {

    WebDriver driver;
    WebDriverWait howLong;

    By myAccountButton = By.xpath("//div[contains(@class,'col-md-6')]//li[@id='li_myaccount']/a");
    By signUpButton = By.xpath("//li[@id='li_myaccount' and @class='open']//ul//child::li[2]/a");

    public MainPage(WebDriver driver, WebDriverWait howLong){
        this.driver = driver;
        this.howLong = howLong;
    }

    public void clickMyAccountButton(){
        howLong.until(ExpectedConditions.elementToBeClickable(myAccountButton));
        driver.findElement(myAccountButton).click();
    }
    public void clickSignUpButton(){
        howLong.until(ExpectedConditions.elementToBeClickable(signUpButton));
        driver.findElement(signUpButton).click();
    }
}

Дальше: 

Я создаю класс SignUp уже в другом пакете и тут пишу код для самого теста.

 

Вопрос №1. Я создал метод driverStart() с аннотацией @BeforeMethod и там я уже создаю обьект WebDriver driver,  WebDriverWait howLong. 

Это можно делать в этом методе? Или же дальше есть метод signUpTest() и эту инициализацию нужно делать в нем?

 

Вопрос №2. System.setProperty("webdriver.chrome.driver","E:\\chromedriver.exe"); можно прописать в pom.xml?

public class SignUp {

    WebDriver driver;
    WebDriverWait howLong;

    @BeforeMethod
    public void driverStart(){
        System.setProperty("webdriver.chrome.driver","E:\\chromedriver.exe");
        driver = new ChromeDriver();
        howLong = new WebDriverWait(driver,30);
        driver.manage().window().maximize();
        driver.get("https://www.phptravels.net/");
    }

    @Test
    public void signUpTest(){
       MainPage mp = new MainPage(driver,howLong);
       mp.clickMyAccountButton();
       mp.clickSignUpButton();
    }

    @AfterMethod
    public void quiteDriver(){
        driver.quit();
    }

}

Вообщем объяснил немного не так как хотел. Просто сделайте замечания по коду. Хочется по крайней мере начать правильно. Заранее спасибо.


  • 0

#2 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 14 мая 2018 - 14:33

1)Неправильно ты понял PageObject
 
public void clickMyAccountButton - ты либо возвращай this, либо следующий класс. Но никак не void
 
2)Ты мешаешь неявные Implicit  и явные Explicit(WebDriverWait и ExpectedCondition) ожидания. Поэтому получается ерунда
 
3)По поводу "System.setProperty("webdriver.chrome.driver","E:\\chromedriver.exe"); можно прописать в pom.xml?"
 
Используют эту либу:
 

  • 0

#3 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 14 мая 2018 - 16:22

Таки концепцию PageObject, как инкапсуляцию взаимодействия со страницей в объект, топикстартер понял вполне. 

 

Почему любой экшн-метод пейдж-обжекта должен возвращать пейдж-обжект станет понятно как только в тесте появится второй ПО.

Микс явных и неявных ожиданий к концепции ПО отношения не имеет. А почему это плохо - уже на всех конференциях доложили и во всех блогах написали, гуглите.


  • 0

#4 Isidor2811

Isidor2811

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Дацюк Олег

Отправлено 15 мая 2018 - 06:06

Почему любой экшн-метод пейдж-обжекта должен возвращать пейдж-обжект станет понятно как только в тесте появится второй ПО.

ПО? извините за тупость, но розшифруйте пожалуйста аббревиатуру 

А то я и прям не понимаю зачем возвращать что то, если метод просто делает какое то действие. И набор таких методов даст мне проверку тест кейса


  • 0

#5 Isidor2811

Isidor2811

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Дацюк Олег

Отправлено 15 мая 2018 - 06:12

 

2)Ты мешаешь неявные Implicit  и явные Explicit(WebDriverWait и ExpectedCondition) ожидания. Поэтому получается ерунда
 
 

 

Микс явных и неявных ожиданий к концепции ПО отношения не имеет. А почему это плохо - уже на всех конференциях доложили и во всех блогах написали, гуглите.

 

Хоть убейте не могу понять где я делаю микс. Согласно этой ссылке я использую только явные ожидания https://kreisfahrer....ozhidaniya.html

 

а вот собстевенно код от туда 

Более предпочтительно использовать WebDriverWait и ExpectedCondition:
WebDriver driver = new FirefoxDriver();
driver.get("http://some_url");
WebElement dynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("dynamicElement_id")));

Если я что то не понял, ткните пожалуйста носом на ссылку, а то это довольно таки важная тема


  • 0

#6 Little_CJIOH

Little_CJIOH

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 515 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 15 мая 2018 - 11:05

 

Почему любой экшн-метод пейдж-обжекта должен возвращать пейдж-обжект станет понятно как только в тесте появится второй ПО.

ПО? извините за тупость, но розшифруйте пожалуйста аббревиатуру 

А то я и прям не понимаю зачем возвращать что то, если метод просто делает какое то действие. И набор таких методов даст мне проверку тест кейса

 

это я устал писать "пэйдж обджект".

Когда вы кликаете на кнопку происходит нечто, например переход на другую страницу или изменения на текущей.
Как тест узнает с чем взаимодействовать? Должна ли поменяться страница?
Поскольку это логика работы страницы, то и находится она должна в ПО. Например каждое действие на странице возвращает ожидаемый ПО, то есть или себя, или то, на что должны перейти.
Про ожидания - спрашивайте Юзера, он практик.

 

ЗЫ: С возвратом ПО, кстати, не единственное возможное решение.


  • 0

#7 Isidor2811

Isidor2811

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Дацюк Олег

Отправлено 29 мая 2018 - 14:13

Я снова тут, и все еще пытаюсь разобраться с page object и возвращением объектов страницы.

Есть такой вот класс StartPage. В этом классе я определяю объект с которым буду работать и метод для него. Это класс для главной страницы почтового сервиса https://www.ukr.net/

 

Насколько я понял если после нажатия на ссылку никакого перехода не было бы, то мне нужно было бы возвращать обьект этой же страницы тоесть так: return this;

public class StartPage {

    private final WebDriver driver;
    private final WebDriverWait howLong;

    public StartPage(WebDriver driver, WebDriverWait howLong){
       this.driver = driver;
       this.howLong = howLong;
    }

    By postLink = By.linkText("Пошта");

    public LoginPage postLinkClick(){
        howLong.until(ExpectedConditions.elementToBeClickable(postLink));
        driver.findElement(postLink).click();
        return new LoginPage(driver,howLong);
    }
}

Но так как при нажатии на ссылку я перехожу уже на другую страницу, то мне нужно возвращать обьект страницы на которую будет переход return new LoginPage(driver,howLong);

 

Теперь я создаю метод Method1 с аннотацией @Test уже в другом классе (там где у меня будут все тестовые методы)

@Test
public void Method1(){
  StartPage startPage = new StartPage(driver, howLong);
  driver.get("https://www.ukr.net/");
  startPage.postLinkClick();
}

В этом классе я создаю обьект класса StartPage и вызываю метод startPage.postLinkClick();

 

И тут то что я не понимаю. Я вызвал этот метод, он мне возращает обьект на страницу LoginPage, мне в этом методе нужно создать обьект даного класса? Другими словами, как мне теперь взаимодействовать с обьектами на странице LoginPage? Тот обьект что мы только что получили после вызова метода startPage.postLinkClick(), как с ним работать?

 

Или мне нужно было сразу создать два обьекта, а потом уже работать с "модифицированым"? Типа так:

@Test
public void Method1(){
  StartPage startPage = new StartPage(driver, howLong);
  LoginPage loginPage = new LoginPage(driver, howLong)
  driver.get("https://www.ukr.net/");
  startPage.postLinkClick();
}

Этот момент не могу понять, поэтому и сама концепция возвращение обьектов не вкладываеться в голове. Поясните пожалуйста.

 

Update:

Или вот так делать?

 public void Method1(){
        StartPage startPage = new StartPage(driver, howLong);
        driver.get("https://www.ukr.net/");
        LoginPage loginPage = startPage.postLinkClick();
        loginPage.setLogin("UserName");
    }

  • 0

#8 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 29 мая 2018 - 16:33

Последний вариант. Создаете объект страницы и сохраняете в него то, что вернет startPage.postLinkClick().

 

Альтернативный вариант - сами объекты страницы - статичные объекты какого-нибудь отдельного класса. Тогда postLinkClick будет менять соответствующий статичный объект и его же и возвращать.

Тогда в самом тесте - просто обращаетесь сразу к объектам соответствующих страниц.

Но это костыль, лучше уж сделать полноценный PageManager и взаимодействовать со страницами через него.


  • 1

#9 Isidor2811

Isidor2811

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Дацюк Олег

Отправлено 30 мая 2018 - 06:01

Последний вариант. Создаете объект страницы и сохраняете в него то, что вернет startPage.postLinkClick().

 

Альтернативный вариант - сами объекты страницы - статичные объекты какого-нибудь отдельного класса. Тогда postLinkClick будет менять соответствующий статичный объект и его же и возвращать.

Тогда в самом тесте - просто обращаетесь сразу к объектам соответствующих страниц.

Но это костыль, лучше уж сделать полноценный PageManager и взаимодействовать со страницами через него.

 

Спасибо большое, вроде разобрался. Может у вас есть ссылки на какие то исходники, где есть написанные тест кейсы с использованием page object, или что то в єтом духе. Буду очень признателен. 


  • 0

#10 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 30 мая 2018 - 07:37

Ссылок, к сожалению, нет.

 

Условный пример (это не полноценный PageManager).

public class PageManagerLite {
    private static WebDriver driver;
    private static WebDriverWait howLong;

    private StartPage startPage;
    private LoginPage loginPage;
    

    public class PageManagerLite(WebDriver driver, howLong) {
        this.driver = driver;
        this.howLong = howLong;
    }

    private StartPage startPage() {
        // создаем и запоминаем страницу, если она ещё не создавалась
        startPage = startPage == null ? new StartPage(driver, howLong) : startPage;
        return startPage;
    }

    private LoginPage loginPage() {
        // создаем и запоминаем страницу, если она ещё не создавалась
        loginPage = loginPage == null ? new LoginPage (driver, howLong) : loginPage;
        return loginPage;
    }
}

// в методе postLinkClick
public LoginPage postLinkClick() {
    // что-то делается
    return pages.loginPage(); // для этого нужно, чтобы страницы знали про PageManager, т.е. при их создании надо и на него ссылку им передавать
}

// В классе тестов

private PageManagerLite pages;

public void init() {
    pages = new PageManagerLite(driver, howLong);
}

public void Method1(){
    driver.get("https://www.ukr.net/");
    pages.startPage().postLinkClick();
    pages.loginPage().setLogin("UserName");
}

  • 1

#11 Isidor2811

Isidor2811

    Новый участник

  • Members
  • Pip
  • 21 сообщений
  • ФИО:Дацюк Олег

Отправлено 30 мая 2018 - 08:32

 

Ссылок, к сожалению, нет.

 

Условный пример (это не полноценный PageManager).

public class PageManagerLite {
    private static WebDriver driver;
    private static WebDriverWait howLong;

    private StartPage startPage;
    private LoginPage loginPage;
    

    public class PageManagerLite(WebDriver driver, howLong) {
        this.driver = driver;
        this.howLong = howLong;
    }

    private StartPage startPage() {
        // создаем и запоминаем страницу, если она ещё не создавалась
        startPage = startPage == null ? new StartPage(driver, howLong) : startPage;
        return startPage;
    }

    private LoginPage loginPage() {
        // создаем и запоминаем страницу, если она ещё не создавалась
        loginPage = loginPage == null ? new LoginPage (driver, howLong) : loginPage;
        return loginPage;
    }
}

// в методе postLinkClick
public LoginPage postLinkClick() {
    // что-то делается
    return pages.loginPage(); // для этого нужно, чтобы страницы знали про PageManager, т.е. при их создании надо и на него ссылку им передавать
}

// В классе тестов

private PageManagerLite pages;

public void init() {
    pages = new PageManagerLite(driver, howLong);
}

public void Method1(){
    driver.get("https://www.ukr.net/");
    pages.startPage().postLinkClick();
    pages.loginPage().setLogin("UserName");
}

Спасибо!


  • 0



Темы с аналогичным тегами Page object model, Page object, Maven

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных