Раздел: Автоматизация > Практикум > PageObjects pattern + Selenium (Java)
PageObjects pattern + Selenium (Java)
Попробуем на небольшом примере показать как, используя PageObjects pattern и Selenium (Java), можно достаточно быстро реализовать фреймоворк для автоматизированного тестирования, и начать писать понятные, легко поддерживаемые, а главное работающие тесты.
Рассмотрим пример реализованный на базе Selenium RC. (Реализация для Selenium 2 (WebDriver) выполняется по аналогии. Если у вас возникнут вопросы, обращайтесь - поможем)
Пример:Страница LoginPage состоит из двух полей ввода User и Password, кнопки Login. При отправке корректного логина и пароля открывается страница Home на которой есть имя пользователя и ссылка Logout. При отправке НЕкорректного логина и пароля открывается страница ErrorLogin, на которой есть сообщение об ошибке и ссылка Back To Login Page.
Задание:Написать тестовые скрипты:
1. Корректный Login -> проверка имени пользователя -> Logout
2. Некорректный Login -> проверка сообщения об ошибке -> Back To Login Page
1. Создаем рабочий контекст на базе Selenium 1.x.x
Context.java:public class Context {
public static final String BROWSER_IE = "*iexplore";
public static final String BROWSER_FF = "*firefox";
public static final String BROWSER_CH = "*chrome";
private static Context context;
private static String siteUrl;
private Selenium browser;
private SeleniumServer seleniumServer;
private Context() {
}
public static void initInstance(String browserType, String siteURL) {
context = new Context();
siteUrl = siteURL;
context.setBrowser(new DefaultSelenium("localhost", 4444, browserType, siteURL));
context.start();
}
public static Context getInstance() {
if (context == null) {
throw new IllegalStateException("Context is not initialized");
}
return context;
}
public Selenium getBrowser() {
if (browser != null) {
return browser;
}
throw new IllegalStateException("WebBrowser is not initialized");
}
public String getSiteUrl() {
return siteUrl;
}
public void start() {
try {
seleniumServer = new SeleniumServer();
seleniumServer.start();
} catch (Exception e) {
e.printStackTrace();
}
browser.start();
}
public void close() {
browser.close();
browser.stop();
seleniumServer.stop();
}
public void setBrowser(Selenium browser) {
this.browser = browser;
}
}
2. Добавляем в абстрактный супер класс Page ссылку на рабочий контекст context, а также сервисный метод для получения из него объекта Selenium getBrowser().
Page.java:public abstract class Page {
private Context context;
private String currentPage;
protected Page(String pageUrl) {
this.currentPage = pageUrl;
setContext(Context.getInstance());
init();
parsePage();
}
private void setContext(Context instance) {
this.context = instance;
}
protected abstract void init();
protected abstract void parsePage();
public String getCurrentPage() {
return context.getSiteUrl() + this.currentPage;
}
protected Selenium getBrowser() {
return context.getBrowser();
}
// ....
// service methods...
// ....
}
3. Реализуем классы страниц, необходимые при написании тестов для нашего примера, а именно: LoginPage, HomePage и ErrorLoginPage. И добавляем в сервисные методы реальный ввод данных в поля, нажатие кнопок и клики на ссылки
LoginPage.java:public class LoginPage extends Page {
public static final String PAGE_URL = "/login.html";
protected LoginPage() {
super(PAGE_URL);
}
public static LoginPage openLoginPage() {
LoginPage loginPage = new LoginPage();
loginPage.getBrowser().open(PAGE_URL);
return loginPage;
}
private void setUserName(String userName) {
// код для заполнения поля Username
getBrowser().type("id=UserName", userName);
}
private void setPassword(String password) {
// код для заполнения поля Password
getBrowser().type("id=Password", password);
}
private void pushLoginButton() {
// код для нажатия на кнопку Login
getBrowser().click("id=LoginButton");
}
protected void parsePage() {
// Разбор элементов страницы
// Заполнение необходимых переменных данными со страницы
}
protected void init() {
// Инициализация страницы, например проверка адреса (URL) страницы:
if(!getBrowser().getLocation().equals(PAGE_URL)) {
throw new IllegalStateException("Invalid page is opened");
}
// Можно также добавить проверки наличия необходимых для дальнейшей работы
// объектов и т.д.
}
private void loginAs(String userName, String password) {
setUserName(userName);
setPassword(password);
pushLoginButton();
}
public HomePage login(String userName, String password) {
loginAs(userName, password);
return new HomePage();
}
public ErrorLoginPage loginInvalid(String userName, String password) {
loginAs(userName, password);
return new ErrorLoginPage();
}
}
HomePage.java:
public class HomePage extends Page {
public static final String PAGE_URL = "/home.html";
private String loggedinUserName;
protected HomePage() {
super(PAGE_URL);
}
protected void init() {
// Инициализация страницы
}
protected void parsePage() {
// Разбор элементов страницы
this.loggedinUserName = getBrowser().getText("id=userName");
}
public String getLoggedinUserName() {
return loggedinUserName;
}
public LoginPage logout() {
getBrowser().click("id=LogoutLink");
return new LoginPage();
}
}
ErrorLoginPage.java:
public class ErrorLoginPage extends Page {
public static final String PAGE_URL = "/loginError.html";
private String errorMessage;
protected ErrorLoginPage() {
super(PAGE_URL);
}
protected void init() {
// Инициализация страницы
}
protected void parsePage() {
// Разбор элементов страницы
this.errorMessage = getBrowser().getText("id=ErrorMessage");
}
public String getErrorMessage() {
return this.errorMessage;
}
public LoginPage backToLoginPage() {
getBrowser().click("id=BackLink");
return new LoginPage();
}
}
4. Пишем тесты на базе JUnit:
public class TestLogin extends TestCase {
public void setUp() {
// Инициализация контекста.
Context.initInstance(Context.BROWSER_IE, "http://www.testtesttestlogin.com");
}
public void testLoginLogout() {
String userName = "tester";
String password = "testPass";
LoginPage loginPage = LoginPage.openLoginPage();
HomePage homePage = loginPage.login(userName, password);
assertEquals(userName, homePage.getLoggedinUserName());
homePage.logout();
}
public void testInvalidLogin() {
String userName = "$tester@#";
String password = "********";
String expectedMessage = "Invalid username or password";
LoginPage loginPage = LoginPage.openLoginPage();
ErrorLoginPage errorLoginPage = loginPage.loginInvalid(userName, password);
assertEquals(expectedMessage, errorLoginPage.getErrorMessage());
errorLoginPage.backToLoginPage();
}
protected void tearDown() throws Exception {
// закрытие браузера
Context.getInstance().close();
}
}
Скачать исходный код примера реализации Page Object Pattern на базе Selenium RC
Вот все и готово - первые объекты страниц, первые тесты. Попробуйте, может и Вам подойдет подобная архитектура. В любом случае всегда все можно обсудить - любые комментарии с вопросами и конструктивной критикой приветствуются. Вопросы "отвечаются" быстро, критика анализируется... :)
Смотрите также Автоматизированное тестирование: работа со статическими ресурсами
Автор: Алексей Булат