codefest 2013. Ерошенко А. — Фреймворк html elements или как удобно...

104
H tmlElements

Upload: codefest

Post on 28-Nov-2014

1.343 views

Category:

Technology


10 download

DESCRIPTION

 

TRANSCRIPT

Page 1: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

HtmlElements

Page 2: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах
Page 3: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

PageObjects

Page 4: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Steps

PageObjects

Page 5: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Steps

Tests

PageObjects

Page 6: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Рецепт приготовления

Page 7: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Вкусных тестов

Page 8: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах
Page 9: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

PageObjects

Page 10: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class SearchPage { @FindBy(id = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton;

@FindBy(name = "login") private WebElement loginInput;

@FindBy(name = "passwd") private WebElement passwordInput;

@FindBy(name = "b-form-button__input") private WebElement authorizeButton; public SearchPage(WebDriver driver) { PageFactory.initElements(driver, this); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); }

public void authorize (String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(login); authorizeButton.click(); }}

Page 11: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Steps

Page 12: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class CommonUserSteps {

public CommonUserSteps(WebDriver driver) { ... }

public SearchPage onSearchPage() { return searchPage; } public void loginAsCommonUser() { User user = UserFactory.getCommonUser(); onSearchPage().authorize(user.getLogin, user.getPassword); }

public void searchFor(String request) { onSearchPage().searchFor(request); }

public void shouldSeeSearchResults() { assertTrue(onSearchPage().isSearchResultsBlockDisplayed()); }}

Page 13: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Tests

Page 14: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class SearchResultsTest { private WebDriver driver = new FirefoxDriver(); private CommonUserSteps user = new CommonUserSteps(driver); @Before public void loadPage() { driver.get("http://www.yandex.ru"); } @Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults(); } @After public void closeDriver() { driver.quit(); } }

Page 15: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Steps

Tests

PageObjects

Page 16: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Steps

Tests

PageObjects

Page 17: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Модель устройчива

Page 18: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Steps

Tests

PageObjects

Page 19: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Шаблонизаторы

Page 20: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Шаблонизаторы

Page 21: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Шаблонизаторы

Page 22: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Шаблонизаторы

Page 23: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Шаблонизаторы

Page 24: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Шаблонизаторы

Page 25: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Шаблонизаторы

Page 26: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Шаблонизаторы

Page 27: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Загромождение

Page 28: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Загромождение

Page 29: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class AutoHomePage { @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "twoweeks") private WebElement rememberMeCheckBox; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

}

Загромождение

Page 30: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class AutoHomePage { @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "twoweeks") private WebElement rememberMeCheckBox; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

}

Загромождение

Page 31: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class AutoHomePage { @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "twoweeks") private WebElement rememberMeCheckBox; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; @FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton;

@FindBy(name = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton; @FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(xpath = "//div[@class='b-domik__button']//input") private WebElement loginButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); } public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } public void login(String login, String password) { loginInput.sendKeys(login); passwordInput.sendKeys(password); loginButton.click(); }

}

Загромождение

Page 32: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Недостатки

Page 33: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Дублирование кода

Недостатки

Page 34: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Дублирование кода

Загромождение

Недостатки

Page 35: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Коронное блюдо

Page 36: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Steps

Tests

Element

PageObject

Page 37: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Element

PageObject

Page 38: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

HtmlElements

Page 39: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Блоки элементов

Типизация элементов

Библиотека матчеров

Page 40: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Блоки элементов

Типизация элементов

Библиотека матчеров

Page 41: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах
Page 42: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах
Page 43: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Element

PageObject

Page 44: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement {

@FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Поисковая форма

Page 45: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Block(@FindBy(className = "b-domik")) public class AuthorizationForm extends HtmlElement {

@FindBy(name = "login") private WebElement loginInput; @FindBy(name = "passwd") private WebElement passwordInput; @FindBy(className = "b-form-button__input") private WebElement authorizeButton; public void authorize(String login, String pass) { loginInput.sendKeys(login); passwordInput.sendKeys(password); authorizeButton.click(); }}

Форма авторизации

Page 46: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Element

PageObject

Page 47: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Главная страницаpublic class SearchPage { @FindBy(id = "text") private WebElement requestInput; @FindBy(xpath = "//input[@type='submit']") private WebElement searchButton;

@FindBy(name = "login") private WebElement loginInput;

@FindBy(name = "passwd") private WebElement passwordInput;

@FindBy(name = "b-form-button__input") private WebElement authorizeButton; public SearchPage(WebDriver driver) { PageFactory.initElements(driver, this); } ...}

Page 48: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class SearchPage {

private SearchArrow searchArrow;

private AuthorizationForm authorizationForm;

public SearchPage(WebDriver driver) { HtmlElementLoader.populatePageObject(this, driver); } public void searchFor(String request) { searchArrow.searchFor(request); } public void login(String login, String password) { authorizationForm.login(login, password); }}

Главная страница

Page 49: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Структура страницы

Page 50: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class AutoSearchPage {

@FindBy(className = "b-search") private SearchArrow searchArrow;

private SearchResultsBlock searchResultsBlock; public SearchResultsPage(WebDriver driver) { HtmlElementLoader.populatePageObject(this, driver); } public void searchFor(String request) { searchArrow.searchFor(request); } public boolean isSearchResultsBlockDisplayed() { return searchResultsBlock.isDisplayed(); } }

Переопределение

Page 51: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement {

...

}

Переопределениеpublic class SearchPage {

@FindBy(className = "b-search") private SearchArrow searchArrow;

}

Page 52: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Блоки элементов

Типизация элементов

Библиотека матчеров

Page 53: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Типизация

Page 54: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

GodeFest

Типизация

Page 55: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

GodeFest

Типизация

Page 56: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton;

@FindBy(xpath = "//div[@class='i-popup__content']//li") private List<WebElement> suggest; public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.get(suggestItemNumber).click(); } }

Поисковая формаGodeFest

Page 57: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton;

@FindBy(xpath = "//div[@class='i-popup__content']//li") private List<WebElement> suggest; public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.get(suggestItemNumber).click(); } }

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private TextInput requestInput; @FindBy(className = "b-form-button__input") private Button searchButton; @FindBy(className = "i-popup__content") private Suggest suggest;

public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.selectByIndex(suggestItemNumber); } }

Поисковая формаGodeFest

Page 58: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Стандартные

TextBlock

TextInput

Link

Button

Page 59: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Расширенные

Select

Radio

Table

Form

Checkbox

Page 60: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class Checkbox extends TypifiedElement {

public WebElement getLabel(){...}

public String getLabelText(){...}

public String getText(){...}

public void select(){...}

public void deselect(){...}

public void set(boolean checked){...}

public boolean isSelected(){...}}

Checkbox

Page 61: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class Radio extends TypifiedElement {

public List<WebElement> getButtons(){...}

public WebElement getSelectedButton(){...}

public void selectByValue(String value){...}

public void selectByIndex(int index){...}

}

Radio

Page 62: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class Select extends TypifiedElement {

public boolean isMultiple(){...}

public List<WebElements> getOptions(){...}

public List<WebElement> getAllSelectedOptions(){...}

public WebElement getFirstSelectedOption(){...}

public void selectByVisibleText(String text){...}

public void selectByIndex(int index){...} public void selectByValue(String value){...}

public void deselectAll(){...}

public void deselectByValue(String value){...}

public void deselectByIndex(int index){...}

public void deselectByVisibleText(String text){...}}

Select

Page 63: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Formpublic class Form extends TypifiedElement {

public void fill(Map<String, Object> data){...}

public <T> void fill(T bean, Converter Converter){...}

protected WebElement findFiledByKey(String key){...}

protected void fillField(WebElement e, Object value){...}

public WebElement findFirstField(By by){...}

public List<WebElement> findFields(By by){...}

public List<WebElement> findSelectsBy(By by){...}

}

Page 64: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Form

public class CommonUserSteps {

public void loginAsCommonUser() { User user = UserFactory.getCommonUser(); HashMap<String, Object> userHash = convert(user); onSearchPage().getAuthorizationForm.fill(userHash); }}

public class SearchPage {

@FindBy(className = "b-domik") private Form authorizationForm;

}

Page 65: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class Table extends TypifiedElement {

public List<WebElement> getHeadings(){...}

public List<String> getHeadingsAsString(){...}

public List<List<WebElement>> getRows(){...}

public List<List<WebElement>> getColumns(){...}

public WebElement getCellAt(int i, int j){...}

public List<Map> getRowsMappedToHeadings() {...}

public List<Map> getRowsMappedToHeadings(List<String> h){...}

public List<Map> getRowsAsStringMappedToHeadings(){...}

public List<Map> getRowsAsStringMappedToHeadings(List h){...}

}

Table

Page 66: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Table

public class SearchUserSteps {

public List<User> findAllUsers() { Table usersTable = onSomeSecretPage().getUsersTable(); List<Map> hash = usersTable.getRowsMappedToHeadings(); List<User> users = convert(hash); return users; }}

public class SomeSecretePage {

@FindBy(className = "b-secret") private Table users;

}

Page 67: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Converters

Page 68: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private TextInput requestInput; @FindBy(className = "b-form-button__input") private Button searchButton; @FindBy(className = "i-popup__content") private Suggest suggest;

public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.selectByIndex(suggestItemNumber); } }

Поисковая формаGodeFest

Page 69: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private TextInput requestInput; @FindBy(className = "b-form-button__input") private Button searchButton; @FindBy(className = "i-popup__content") private Suggest suggest;

public void searchBySuggest(String request, int suggestItemNumber) { requestInput.sendKeys(request); suggest.selectByIndex(suggestItemNumber); } }

Поисковая формаGodeFest

Page 70: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Добавление элементовpublic class Suggest extends TypifiedElement { public Suggest(WebElement wrappedElement) { super(wrappedElement); } private List<WebElement> getItems() { return getWrappedElement().findElements(By.xpath("//li")); } public void selectByIndex(int itemIndex) { getItems().get(itemIndex).click(); } public void selectByValue(String itemValue) { for (WebElement item : getItems()) { if (itemValue.equals(item.getText())) { item.click(); return; } } throw new NoSuchElementException(); } }

Page 71: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Конструктор

Типизированные элементы

Страница

Page 72: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Блоки элементов

Типизация элементов

Библиотека матчеров

Page 73: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Матчеры

Page 74: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Матчеры

assertThat(audience, isPayingAttention())

Page 75: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Матчеры

assertThat(audience, isPayingAttention())

assertThat(audience, is(not(sleeping())))

Page 76: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Матчеры элементов

Page 77: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

assertThat(element, exists())

Матчеры элементов

Page 78: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

assertThat(element, exists())

assertThat(element, hasText(“CodeFest”))

Матчеры элементов

Page 79: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

assertThat(element, exists())

assertThat(element, hasText(“CodeFest”))

assertThat(checkBox, isSelected())

Матчеры элементов

Page 80: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

assertThat(element, exists())

assertThat(element, hasText(“CodeFest”))

assertThat(checkBox, isSelected())

assertThat(radio, hasSelectedButton(3))

Матчеры элементов

Page 81: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class CommonUserSteps {

public void shouldSeeSearchResults() { assertThat( onSearchPage().getSearchResults(), exist() ); }}

Матчеры в степах

Page 82: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class CommonUserSteps {

public void shouldSeeSearchResults() { assertThat(onSearchPage().getSearchResults(), both(exist()).and(isDisplayed())); }}

Матчеры в степах

Page 83: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class CommonUserSteps {

public void shouldSeeSearchResults(Matcher mch) { assertThat( onSearchPage().getSearchResults(), mch ); }}

Матчеры в степах

Page 84: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( both(exists()).and(isDisplayed()) );}

Матчеры в тестах

Page 85: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Вывод ошибки@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( both(exists()).and(isDisplayed()) );}

Expected: element existing on page but: was <[[FirefoxDriver: firefox on MAC (e3b28f2e-7aa7-a241-8807-40df2a8e0b54)] -> ...]>

Page 86: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Block(@FindBy(className = "b-head-search")) public class SearchResultBlock extends HtmlElement {

@Name("Список поисковых результатов") @FindBy(id = "results") private List<SearchResult> searchResults;

@FindBy(id = "info") private TextBlock searchInfo;

}

Именование элементов

Page 87: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

public class SearchPage {

@Name(“Блок поисковых результатов”) private SearchResultsBlock searchResultsBlock;

}

Переопределение

@Block(@FindBy(className = "b-head-search")) public class SearchResultsBlock extends HtmlElement {

...

}

Page 88: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( both(exists()).and(isDisplayed()) );}

Expected: element existing on page but: was SearchResultBlock

Вывод ошибки

Page 89: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Декораторы

Page 90: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( should(exists()).whileWaitingUntil(timeoutHasExpired()) );}

Waiter Decorator

Expected: while waiting for [30000] ms element existing on page but: was SearchResultBlock

Page 91: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( should(exists()).after(pageRefresh(driver)) );}

Action Decorator

Expected: after page refresh element existing on page but: was SearchResultBlock

Page 92: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( should(isDisplayed()).inCase(exists()); );}

Condition Decorator

Expected: element displayed on page if element exists on page but: was SearchResultBlock

Page 93: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Блоки элементов

Типизация элементов

Библиотека матчеров

Page 94: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

71

Будущее

Page 95: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Библиотека элементов

Page 96: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Библиотека элементов

Page 97: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Генерация блоков

Page 98: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Страница

Генерация блоков

Page 99: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }

Страница Блоки

Генерация блоков

Page 100: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Попробуйтесами

Page 101: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Steps

Tests

Element

PageObject

Page 102: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

HtmlElements

Page 103: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах

Технологии

Converter = LambdaJ

Step FRWK = 2CDDs

Matchers = Hamcrest