83
H tmlElements

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

  • Upload
    sqalab

  • View
    1.201

  • Download
    2

Embed Size (px)

DESCRIPTION

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

Citation preview

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

HtmlElements

Page 2: HtmlElements – естественное расширение PageObject
Page 3: HtmlElements – естественное расширение PageObject

PageObjects

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

Steps

PageObjects

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

Steps

Tests

PageObjects

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

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

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

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

Page 8: HtmlElements – естественное расширение PageObject
Page 9: HtmlElements – естественное расширение PageObject

PageObjects

Page 10: HtmlElements – естественное расширение 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 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: HtmlElements – естественное расширение PageObject

Steps

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

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: HtmlElements – естественное расширение PageObject

Tests

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

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

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

Steps

Tests

PageObjects

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

Steps

Tests

PageObjects

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

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

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

Steps

Tests

PageObjects

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

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

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

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

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

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

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

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

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

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

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

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: HtmlElements – естественное расширение PageObject

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: HtmlElements – естественное расширение PageObject

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: HtmlElements – естественное расширение PageObject

Недостатки

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

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

Недостатки

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

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

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

Недостатки

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

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

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

Steps

Tests

Element

PageObject

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

Element

PageObject

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

HtmlElements

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

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

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

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

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

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

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

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

Page 36: HtmlElements – естественное расширение PageObject
Page 37: HtmlElements – естественное расширение PageObject
Page 38: HtmlElements – естественное расширение PageObject

Element

PageObject

Page 39: HtmlElements – естественное расширение 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(); } }

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

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

@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: HtmlElements – естественное расширение PageObject

Element

PageObject

Page 42: HtmlElements – естественное расширение 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); } ...}

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

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: HtmlElements – естественное расширение PageObject

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

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

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: HtmlElements – естественное расширение PageObject

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

...

}

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

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

}

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

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

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

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

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

Типизация

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

в чем смысл

Типизация

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

в чем смысл

Типизация

Page 51: HtmlElements – естественное расширение 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;

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

Page 52: HtmlElements – естественное расширение 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;

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

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

Стандартные

TextBlock

TextInput

Link

Button

FileInput

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

Расширенные

Select

Radio

Table

Form

Checkbox

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

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: HtmlElements – естественное расширение PageObject

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: HtmlElements – естественное расширение PageObject

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: HtmlElements – естественное расширение PageObject

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: HtmlElements – естественное расширение PageObject

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

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

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

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

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 62: HtmlElements – естественное расширение PageObject

public class User {

@WebInput("login") public String login;

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

Login Passwd

eroshenkoam c4fmUDTmbCzy8d

autotester 7cRrTT7g

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

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;

}

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

Converters

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

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

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

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

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

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

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

Добавление элементов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 68: HtmlElements – естественное расширение PageObject

Конструктор

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

Страница

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

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

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

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

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

Матчеры

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

Матчеры

assertThat(audience, isPayingAttention())

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

Матчеры

assertThat(audience, isPayingAttention())

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

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

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

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

assertThat(element, exists())

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

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

assertThat(element, exists())

assertThat(element, hasText(“Yandex”))

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

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

assertThat(element, exists())

assertThat(element, hasText(“Yandex”))

assertThat(checkBox, isSelected())

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

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

assertThat(element, exists())

assertThat(element, hasText(“Yandex”))

assertThat(checkBox, isSelected())

assertThat(radio, hasSelectedButton(3))

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

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

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

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

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

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

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

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

Steps

Tests

Element

PageObject

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

HtmlElements

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

Технологии

Converter = LambdaJ

Step FRWK = 2CDDs

Matchers = Hamcrest