Transcript
Page 1: Html elements. How to cook tasty tests

HtmlElements

Page 2: Html elements. How to cook tasty tests
Page 3: Html elements. How to cook tasty tests

PageObjects

Page 4: Html elements. How to cook tasty tests

Steps

PageObjects

Page 5: Html elements. How to cook tasty tests

Steps

Tests

PageObjects

Page 6: Html elements. How to cook tasty tests

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

Page 7: Html elements. How to cook tasty tests

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

Page 8: Html elements. How to cook tasty tests
Page 9: Html elements. How to cook tasty tests

PageObjects

Page 10: Html elements. How to cook tasty tests

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: Html elements. How to cook tasty tests

Steps

Page 12: Html elements. How to cook tasty tests

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: Html elements. How to cook tasty tests

Tests

Page 14: Html elements. How to cook tasty tests

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: Html elements. How to cook tasty tests

Steps

Tests

PageObjects

Page 16: Html elements. How to cook tasty tests

Steps

Tests

PageObjects

Page 17: Html elements. How to cook tasty tests

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

Page 18: Html elements. How to cook tasty tests

Steps

Tests

PageObjects

Page 19: Html elements. How to cook tasty tests

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

Page 20: Html elements. How to cook tasty tests

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

Page 21: Html elements. How to cook tasty tests

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

Page 22: Html elements. How to cook tasty tests

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

Page 23: Html elements. How to cook tasty tests

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

Page 24: Html elements. How to cook tasty tests

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 25: Html elements. How to cook tasty tests

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 26: Html elements. How to cook tasty tests

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 27: Html elements. How to cook tasty tests

Недостатки

Page 28: Html elements. How to cook tasty tests

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

Недостатки

Page 29: Html elements. How to cook tasty tests

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

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

Недостатки

Page 30: Html elements. How to cook tasty tests

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

Page 31: Html elements. How to cook tasty tests

Steps

Tests

Element

PageObject

Page 32: Html elements. How to cook tasty tests

Element

PageObject

Page 33: Html elements. How to cook tasty tests

HtmlElements

Page 34: Html elements. How to cook tasty tests

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

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

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

Page 35: Html elements. How to cook tasty tests

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

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

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

Page 36: Html elements. How to cook tasty tests
Page 37: Html elements. How to cook tasty tests
Page 38: Html elements. How to cook tasty tests

Element

PageObject

Page 39: Html elements. How to cook tasty tests

@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 40: Html elements. How to cook tasty tests

@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 41: Html elements. How to cook tasty tests

Element

PageObject

Page 42: Html elements. How to cook tasty tests

Главная страница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 43: Html elements. How to cook tasty tests

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 44: Html elements. How to cook tasty tests

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

Page 45: Html elements. How to cook tasty tests

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 46: Html elements. How to cook tasty tests

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

...

}

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

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

}

Page 47: Html elements. How to cook tasty tests

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

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

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

Page 48: Html elements. How to cook tasty tests

Типизация

Page 49: Html elements. How to cook tasty tests

GodeFest

Типизация

Page 50: Html elements. How to cook tasty tests

GodeFest

Типизация

Page 51: Html elements. How to cook tasty tests

@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 52: Html elements. How to cook tasty tests

@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 53: Html elements. How to cook tasty tests

Стандартные

TextBlock

TextInput

Link

Button

Page 54: Html elements. How to cook tasty tests

Расширенные

Select

Radio

Table

Form

Checkbox

Page 55: Html elements. How to cook tasty tests

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 56: Html elements. How to cook tasty tests

public class Radio extends TypifiedElement {

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

public WebElement getSelectedButton(){...}

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

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

}

Radio

Page 57: Html elements. How to cook tasty tests

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 58: Html elements. How to cook tasty tests

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 59: Html elements. How to cook tasty tests

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 60: Html elements. How to cook tasty tests

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 61: Html elements. How to cook tasty tests

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 62: Html elements. How to cook tasty tests

Converters

Page 63: Html elements. How to cook tasty tests

@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 64: Html elements. How to cook tasty tests

@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 65: Html elements. How to cook tasty tests

Добавление элементов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 66: Html elements. How to cook tasty tests

Конструктор

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

Страница

Page 67: Html elements. How to cook tasty tests

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

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

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

Page 68: Html elements. How to cook tasty tests

Матчеры

Page 69: Html elements. How to cook tasty tests

Матчеры

assertThat(audience, isPayingAttention())

Page 70: Html elements. How to cook tasty tests

Матчеры

assertThat(audience, isPayingAttention())

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

Page 71: Html elements. How to cook tasty tests

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

Page 72: Html elements. How to cook tasty tests

assertThat(element, exists())

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

Page 73: Html elements. How to cook tasty tests

assertThat(element, exists())

assertThat(element, hasText(“CodeFest”))

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

Page 74: Html elements. How to cook tasty tests

assertThat(element, exists())

assertThat(element, hasText(“CodeFest”))

assertThat(checkBox, isSelected())

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

Page 75: Html elements. How to cook tasty tests

assertThat(element, exists())

assertThat(element, hasText(“CodeFest”))

assertThat(checkBox, isSelected())

assertThat(radio, hasSelectedButton(3))

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

Page 76: Html elements. How to cook tasty tests

public class CommonUserSteps {

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

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

Page 77: Html elements. How to cook tasty tests

public class CommonUserSteps {

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

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

Page 78: Html elements. How to cook tasty tests

public class CommonUserSteps {

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

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

Page 79: Html elements. How to cook tasty tests

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

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

Page 80: Html elements. How to cook tasty tests

Вывод ошибки@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 81: Html elements. How to cook tasty tests

@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 82: Html elements. How to cook tasty tests

public class SearchPage {

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

}

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

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

...

}

Page 83: Html elements. How to cook tasty tests

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

Expected: element existing on page but: was SearchResultBlock

Вывод ошибки

Page 84: Html elements. How to cook tasty tests

Декораторы

Page 85: Html elements. How to cook tasty tests

@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 86: Html elements. How to cook tasty tests

@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 87: Html elements. How to cook tasty tests

@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 88: Html elements. How to cook tasty tests

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

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

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

Page 89: Html elements. How to cook tasty tests

71

Будущее

Page 90: Html elements. How to cook tasty tests

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

Page 91: Html elements. How to cook tasty tests

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

Page 92: Html elements. How to cook tasty tests

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

Page 93: Html elements. How to cook tasty tests

Страница

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

Page 94: Html elements. How to cook tasty tests

@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 95: Html elements. How to cook tasty tests

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

Page 96: Html elements. How to cook tasty tests

Steps

Tests

Element

PageObject

Page 97: Html elements. How to cook tasty tests

HtmlElements

Page 98: Html elements. How to cook tasty tests

Технологии

Converter = LambdaJ

Step FRWK = 2CDDs

Matchers = Hamcrest


Top Related