Как правильно пользоваться паттерном PageObject

235
09 мая 2017, 03:43

Пытаюсь разобраться с паттерном Page object и возник вопрос: Пытаюсь автоматизировать тестирование сайта на котором есть

1)Страница входа(логин/пароль/кнопка входа). 2)После ввода логина и пароля нас переводит на страницу c "ВашАккаунт". На странице ВашАккаунт есть кнопка "Создать обьяление" После нажатия на кнопку происходит переход страницу с полями которые необходимо заполнить.

Для автоматизации тестирования страницы при использовании паттерна Page object нужно:

Создать класс для логина:

public class AutoQALogin {
WebDriver driver;
By userName = By.id("user_login");
By password = By.id("user_pass");
By login = By.id("wp-submit");
public AutoQALogin(WebDriver driver){
    this.driver = driver;
}
//Set user name in textbox
public void setUserName(String strUserName){
    driver.findElement(userName).sendKeys(strUserName);
}
//Set password in password textbox
public void setPassword(String strPassword){
     driver.findElement(password).sendKeys(strPassword);
}
//Click on login button
public void clickLogin(){
        driver.findElement(login).click();
}
public void loginToAutoQA(String strUserName,String strPasword){
    //Fill user name
    this.setUserName(strUserName);
    //Fill password
    this.setPassword(strPasword);
    //Click Login button
    this.clickLogin();      
    }
}

Создать класс для создания обьявления:

    public class AutoQAcreateMail{  
WebDriver driver;
By captionName = By.xpath("//*[@id="title"]/div[1]/label");
By description= By.xpath("//*[@id="description"]/div[1]/label");
By createButton= By.xpath("//*[@id="button"]");
public AutoQAcreateMail(WebDriver driver){
    this.driver = driver;
}
//Set tools name in captionName 
public void setCaptionName(String captionName){
    driver.findElement(captionName).sendKeys(captionName);
}
//Set description in description textbox
public void setDescription(String description){
     driver.findElement(description).sendKeys(description);
}
//Click on create button
public void clickCreate(){
    driver.findElement(createButton).click();
}
public void createMail(String strCaptionName, String strDescription){
    //Fill Caption Name
    this.setCaptionName(strCaptionName);
    //Fill Description
    this.setDescription(strDescription);
    //Click Create button
    this.clickCreate();       
    }  
}

Выполнение теста

public class TestAutoQALogin {
WebDriver driver;
AutoQALogin objLogin;
AutoQAHomePage objHomePage;
@BeforeTest
public void setup(){
    driver = new FirefoxDriver();
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.get("http://autoqa.pp.ua/wp-login.php");
}
@Test(priority=0)
public void test_Home_Page_Appear_Correct(){
objLogin = new AutoQALogin(driver);
//login to application
objLogin.loginToAutoQA("subscriber", "subscriberpass");
// go the next page
objMailPage = new AutoQAcreateMail(driver);
//Create mail
createMail("testFillCaption", "testFillDecRiption")
//Verify create mail
Assert.assertTrue(objMailPage.getHomePageDashboardName().toLowerCase().contains("profile"));
    }
}

Так вот подскажите правильно ли я все делаю согласно паттерну Page Object

Answer 1

Это не лучший способ реализации данного шаблона, потому что в вашем классе AutoQAcreateMail по сути действия выполняются над страницей AutoQALogin, а это не есть хорошо.

Предлагаю ознакомиться с данным туториалом по реализации паттерна PageObject. Здесь основная идея заключается в том, что методы конкретной страницы возвращают новое состояние текущей страницы:

public LoginPage typeUsername(String username) {
    driver.findElement(usernameLocator).sendKeys(username);
    return this;    
}) 

либо возвращают страницу, на которую осуществляется переход после выполнения определенного действия:

public HomePage submitLogin() {
    driver.findElement(loginButtonLocator).submit();
    return new HomePage(driver);    
}

В вашем случае необходимо будет создать 3 класса: "Страница входа", "Страница Ваш аккаунт", "Страница с формой заполнения".

И никаких переходных классов наподобие AutoQAcreateMail не нужно создавать. Если в приложении есть всего 3 страницы HTML, то всего будет 3 класса, описывающих страницы. Больше классов не следует создавать.

UPD. Единственный минус данной реализации - это то, что при большом количестве переходов между страницами каждый раз будет создаваться новый объект, т.е. необходимо задуматься о том, как хранить состояния страниц. Для этого можно использовать один из нижеперечисленных способов:

  • передавать в метод старый экземпляр страницы;

  • создать конструктор, инициализирующий состояние страницы.

READ ALSO
Проблема с подгрузкой картинки(ок) через uri, после рестарта приложения

Проблема с подгрузкой картинки(ок) через uri, после рестарта приложения

Uri сохраняется и изображения подгружаются через uri(через SharedPreferences), но эти изображения еще и должны сохранятся, что я делаю через uri

278
Cделать так, чтобы при отключении наушников ставилась пауза для музыки?

Cделать так, чтобы при отключении наушников ставилась пауза для музыки?

Есть приложение, которое воспроизводит через интернет радио потокиПрисутствуют кнопки, чтобы останавливать проигрывание и продолжать его

342
Java - напечатать пирамиду в консоли

Java - напечатать пирамиду в консоли

Надо напечатать вот так пирамидукак сделать, чтобы она вот так была "отцентрована" по правому краю? Пробелами? Размер пирамиды задается с клавиатуры

282
Можно ли закрыть прямоугольник кругом?

Можно ли закрыть прямоугольник кругом?

Имеется прямоугольное отверстие размерами a и b, определить, можно ли его полностью закрыть круглой картонкой радиусом r

874