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

Selenium WebDriver: полное руководство
онлайн, начало 19 октября
Логи как инструмент тестировщика
онлайн, начало 22 октября
Школа для начинающих тестировщиков
онлайн, начало 122 октября
Тестирование REST API
онлайн, начало 22 октября
Фотография

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
  • 751 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 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 176 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 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 176 сообщений
  • ФИО:Власкин Павел
  • Город:Санкт-Петербург


Отправлено 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
  • 315 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 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
  • 315 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 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


Программирование на С# для тестировщиков
онлайн, начало 28 сентября
Автоматизатор мобильных приложений
онлайн, начало 3 октября
Selenium WebDriver: полное руководство
онлайн, начало 19 октября
Программирование на Python для тестировщиков
онлайн, начало 26 октября




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

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

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

Яндекс.Метрика
Реклама на портале