HtmlElements – естественное расширение PageObject

Post on 28-Nov-2014

1.196 views 2 download

description

Доклад Артема Ерошенко и Александра Толмачева, SQA Days-13, 26-27 апреля 2013, www.sqadays.com

Transcript of HtmlElements – естественное расширение PageObject

HtmlElements

PageObjects

Steps

PageObjects

Steps

Tests

PageObjects

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

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

PageObjects

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(); }}

Steps

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()); }}

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("PageObject"); user.shouldSeeSearchResults(); } @After public void closeDriver() { driver.quit(); } }

Steps

Tests

PageObjects

Steps

Tests

PageObjects

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

Steps

Tests

PageObjects

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

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

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

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

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

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(); }

}

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

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(); }

}

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

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(); }

}

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

Недостатки

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

Недостатки

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

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

Недостатки

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

Steps

Tests

Element

PageObject

Element

PageObject

HtmlElements

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

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

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

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

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

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

Element

PageObject

@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-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(); }}

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

Element

PageObject

Главная страница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 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); }}

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

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

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(); } }

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

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

...

}

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

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

}

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

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

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

Типизация

в чем смысл

Типизация

в чем смысл

Типизация

Поисковая формав чем смысл

@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 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); } }

Стандартные

TextBlock

TextInput

Link

Button

FileInput

Расширенные

Select

Radio

Table

Form

Checkbox

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

public class Radio extends TypifiedElement {

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

public WebElement getSelectedButton(){...}

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

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

}

Radio

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

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){...}

}

<form> <some_style_tags> <input name=”login” ...> </some_style_tags> <some_style_tags> <input name=”passwd” ...> </some_style_tags></form>

public class User {

@WebInput("login") public String login;

@WebInput("passwd") public String password;}

public class SearchPage {

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

}

public class CommonUserSteps {

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

public class CommonUserSteps {

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

public class User {

@WebInput("login") public String login;

@WebInput("passwd") public String password;}

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

public class User {

@WebInput("login") public String login;

@WebInput("passwd") public String password;}

Login Passwd

eroshenkoam c4fmUDTmbCzy8d

autotester 7cRrTT7g

public class User {

@WebInput("login") public String login;

@WebInput("passwd") public String password;}

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;

}

Converters

Поисковая формав чем смысл

@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); } }

Поисковая формав чем смысл

@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); } }

Добавление элементов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(); } }

Конструктор

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

Страница

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

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

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

Матчеры

Матчеры

assertThat(audience, isPayingAttention())

Матчеры

assertThat(audience, isPayingAttention())

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

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

assertThat(element, exists())

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

assertThat(element, exists())

assertThat(element, hasText(“Yandex”))

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

assertThat(element, exists())

assertThat(element, hasText(“Yandex”))

assertThat(checkBox, isSelected())

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

assertThat(element, exists())

assertThat(element, hasText(“Yandex”))

assertThat(checkBox, isSelected())

assertThat(radio, hasSelectedButton(3))

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

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

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

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

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

Steps

Tests

Element

PageObject

HtmlElements

Технологии

Converter = LambdaJ

Step FRWK = 2CDDs

Matchers = Hamcrest