SlideShare a Scribd company logo
HtmlElements
HtmlElements – естественное расширение PageObject
PageObjects
Steps
PageObjects
Steps
Tests
PageObjects
Рецепт приготовления
Вкусных тестов
HtmlElements – естественное расширение PageObject
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")
Загромождение
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;
Загромождение
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;
Загромождение
Недостатки
Дублирование кода
Недостатки
Дублирование кода
Загромождение
Недостатки
Коронное
блюдо
Steps
Tests
Element
PageObject
Element
PageObject
HtmlElements
Блоки элементов
Типизация элементов
Библиотека матчеров
Блоки элементов
Типизация элементов
Библиотека матчеров
HtmlElements – естественное расширение PageObject
HtmlElements – естественное расширение PageObject
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
Form
public 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
https://groups.google.com/forum/?fromgroups#!
forum/yandex-qatools-htmlelements
qa-tools@yandex-team.ru
@eroshenkoam
https://github.com/yandex-qatools/htmlelements

More Related Content

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

  • 10. 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(); } }
  • 11. Steps
  • 12. 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()); } }
  • 13. Tests
  • 14. 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(); } }
  • 24. 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") Загромождение
  • 25. 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; Загромождение
  • 26. 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; Загромождение
  • 39. @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(); } } Поисковая форма
  • 40. @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(); } } Форма авторизации
  • 42. Главная страница 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); } ... }
  • 43. 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); } } Главная страница
  • 45. 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(); } } Переопределение
  • 46. @Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { ... } Переопределение public class SearchPage { @FindBy(className = "b-search") private SearchArrow searchArrow; }
  • 51. Поисковая форма в чем смысл @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(); } }
  • 52. Поисковая форма в чем смысл @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); } }
  • 55. 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
  • 56. public class Radio extends TypifiedElement { public List<WebElement> getButtons(){...} public WebElement getSelectedButton(){...} public void selectByValue(String value){...} public void selectByIndex(int index){...} } Radio
  • 57. 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
  • 58. Form public 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){...} }
  • 59. <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; }
  • 60. 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; }
  • 61. 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
  • 62. public class User { @WebInput("login") public String login; @WebInput("passwd") public String password; } Login Passwd eroshenkoam c4fmUDTmbCzy8d autotester 7cRrTT7g
  • 63. 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; }
  • 65. Поисковая форма в чем смысл @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); } }
  • 66. Поисковая форма в чем смысл @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); } }
  • 67. Добавление элементов 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(); } }
  • 77. assertThat(element, exists()) assertThat(element, hasText(“Yandex”)) assertThat(checkBox, isSelected()) assertThat(radio, hasSelectedButton(3)) Матчеры элементов
  • 82. Технологии Converter = LambdaJ Step FRWK = 2CDDs Matchers = Hamcrest