htmlelements – естественное расширение pageobject
DESCRIPTION
Доклад Артема Ерошенко и Александра Толмачева, SQA Days-13, 26-27 апреля 2013, www.sqadays.comTRANSCRIPT
![Page 1: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/1.jpg)
HtmlElements
![Page 2: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/2.jpg)
![Page 3: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/3.jpg)
PageObjects
![Page 4: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/4.jpg)
Steps
PageObjects
![Page 5: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/5.jpg)
Steps
Tests
PageObjects
![Page 6: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/6.jpg)
Рецепт приготовления
![Page 7: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/7.jpg)
Вкусных тестов
![Page 8: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/8.jpg)
![Page 9: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/9.jpg)
PageObjects
![Page 10: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/10.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/11.jpg)
Steps
![Page 12: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/12.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/13.jpg)
Tests
![Page 14: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/15.jpg)
Steps
Tests
PageObjects
![Page 16: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/16.jpg)
Steps
Tests
PageObjects
![Page 17: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/17.jpg)
Модель устойчива
![Page 18: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/18.jpg)
Steps
Tests
PageObjects
![Page 19: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/19.jpg)
Шаблонизаторы
![Page 20: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/20.jpg)
Шаблонизаторы
![Page 21: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/21.jpg)
Шаблонизаторы
![Page 22: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/22.jpg)
Загромождение
![Page 23: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/23.jpg)
Загромождение
![Page 24: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/24.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/25.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/26.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/27.jpg)
Недостатки
![Page 28: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/28.jpg)
Дублирование кода
Недостатки
![Page 29: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/29.jpg)
Дублирование кода
Загромождение
Недостатки
![Page 30: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/30.jpg)
Коронное блюдо
![Page 31: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/31.jpg)
Steps
Tests
Element
PageObject
![Page 32: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/32.jpg)
Element
PageObject
![Page 33: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/33.jpg)
HtmlElements
![Page 34: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/34.jpg)
Блоки элементов
Типизация элементов
Библиотека матчеров
![Page 35: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/35.jpg)
Блоки элементов
Типизация элементов
Библиотека матчеров
![Page 36: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/36.jpg)
![Page 37: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/37.jpg)
![Page 38: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/38.jpg)
Element
PageObject
![Page 39: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/39.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/40.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/41.jpg)
Element
PageObject
![Page 42: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/42.jpg)
Главная страница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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/43.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/44.jpg)
Структура страницы
![Page 45: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/45.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/46.jpg)
@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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/47.jpg)
Блоки элементов
Типизация элементов
Библиотека матчеров
![Page 48: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/48.jpg)
Типизация
![Page 49: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/49.jpg)
в чем смысл
Типизация
![Page 50: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/50.jpg)
в чем смысл
Типизация
![Page 51: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/51.jpg)
Поисковая формав чем смысл
@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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/52.jpg)
Поисковая формав чем смысл
@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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/53.jpg)
Стандартные
TextBlock
TextInput
Link
Button
FileInput
![Page 54: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/54.jpg)
Расширенные
Select
Radio
Table
Form
Checkbox
![Page 55: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/55.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/56.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/57.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/58.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/59.jpg)
<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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/60.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/61.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/62.jpg)
public class User {
@WebInput("login") public String login;
@WebInput("passwd") public String password;}
Login Passwd
eroshenkoam c4fmUDTmbCzy8d
autotester 7cRrTT7g
![Page 63: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/63.jpg)
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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/64.jpg)
Converters
![Page 65: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/65.jpg)
Поисковая формав чем смысл
@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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/66.jpg)
Поисковая формав чем смысл
@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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/67.jpg)
Добавление элементов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](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/68.jpg)
Конструктор
Типизированные элементы
Страница
![Page 69: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/69.jpg)
Блоки элементов
Типизация элементов
Библиотека матчеров
![Page 70: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/70.jpg)
Матчеры
![Page 71: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/71.jpg)
Матчеры
assertThat(audience, isPayingAttention())
![Page 72: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/72.jpg)
Матчеры
assertThat(audience, isPayingAttention())
assertThat(audience, is(not(sleeping())))
![Page 73: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/73.jpg)
Матчеры элементов
![Page 74: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/74.jpg)
assertThat(element, exists())
Матчеры элементов
![Page 75: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/75.jpg)
assertThat(element, exists())
assertThat(element, hasText(“Yandex”))
Матчеры элементов
![Page 76: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/76.jpg)
assertThat(element, exists())
assertThat(element, hasText(“Yandex”))
assertThat(checkBox, isSelected())
Матчеры элементов
![Page 77: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/77.jpg)
assertThat(element, exists())
assertThat(element, hasText(“Yandex”))
assertThat(checkBox, isSelected())
assertThat(radio, hasSelectedButton(3))
Матчеры элементов
![Page 78: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/78.jpg)
Блоки элементов
Типизация элементов
Библиотека матчеров
![Page 79: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/79.jpg)
Попробуйтесами
![Page 80: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/80.jpg)
Steps
Tests
Element
PageObject
![Page 81: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/81.jpg)
HtmlElements
![Page 82: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/82.jpg)
Технологии
Converter = LambdaJ
Step FRWK = 2CDDs
Matchers = Hamcrest
![Page 83: HtmlElements – естественное расширение PageObject](https://reader034.vdocuments.net/reader034/viewer/2022051609/547c048bb4af9fa5158b4f70/html5/thumbnails/83.jpg)
https://groups.google.com/forum/?fromgroups#!forum/yandex-qatools-htmlelements
@eroshenkoam
https://github.com/yandex-qatools/htmlelements