CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно...
-
Upload
codefest -
Category
Technology
-
view
1.345 -
download
10
description
Transcript of CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно...
![Page 1: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/1.jpg)
HtmlElements
![Page 2: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/2.jpg)
![Page 3: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/3.jpg)
PageObjects
![Page 4: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/4.jpg)
Steps
PageObjects
![Page 5: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/5.jpg)
Steps
Tests
PageObjects
![Page 6: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/6.jpg)
Рецепт приготовления
![Page 7: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/7.jpg)
Вкусных тестов
![Page 8: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/8.jpg)
![Page 9: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/9.jpg)
PageObjects
![Page 10: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/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: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/11.jpg)
Steps
![Page 12: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/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: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/13.jpg)
Tests
![Page 14: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/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("CodeFest"); user.shouldSeeSearchResults(); } @After public void closeDriver() { driver.quit(); } }
![Page 15: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/15.jpg)
Steps
Tests
PageObjects
![Page 16: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/16.jpg)
Steps
Tests
PageObjects
![Page 17: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/17.jpg)
Модель устройчива
![Page 18: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/18.jpg)
Steps
Tests
PageObjects
![Page 19: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/19.jpg)
Шаблонизаторы
![Page 20: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/20.jpg)
Шаблонизаторы
![Page 21: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/21.jpg)
Шаблонизаторы
![Page 22: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/22.jpg)
Шаблонизаторы
![Page 23: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/23.jpg)
Шаблонизаторы
![Page 24: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/24.jpg)
Шаблонизаторы
![Page 25: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/25.jpg)
Шаблонизаторы
![Page 26: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/26.jpg)
Шаблонизаторы
![Page 27: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/27.jpg)
Загромождение
![Page 28: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/28.jpg)
Загромождение
![Page 29: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/29.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 30: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/30.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 31: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/31.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 32: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/32.jpg)
Недостатки
![Page 33: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/33.jpg)
Дублирование кода
Недостатки
![Page 34: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/34.jpg)
Дублирование кода
Загромождение
Недостатки
![Page 35: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/35.jpg)
Коронное блюдо
![Page 36: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/36.jpg)
Steps
Tests
Element
PageObject
![Page 37: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/37.jpg)
Element
PageObject
![Page 38: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/38.jpg)
HtmlElements
![Page 39: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/39.jpg)
Блоки элементов
Типизация элементов
Библиотека матчеров
![Page 40: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/40.jpg)
Блоки элементов
Типизация элементов
Библиотека матчеров
![Page 41: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/41.jpg)
![Page 42: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/42.jpg)
![Page 43: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/43.jpg)
Element
PageObject
![Page 44: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/44.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 45: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/45.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 46: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/46.jpg)
Element
PageObject
![Page 47: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/47.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 48: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/48.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 49: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/49.jpg)
Структура страницы
![Page 50: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/50.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 51: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/51.jpg)
@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement {
...
}
Переопределениеpublic class SearchPage {
@FindBy(className = "b-search") private SearchArrow searchArrow;
}
![Page 52: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/52.jpg)
Блоки элементов
Типизация элементов
Библиотека матчеров
![Page 53: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/53.jpg)
Типизация
![Page 54: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/54.jpg)
GodeFest
Типизация
![Page 55: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/55.jpg)
GodeFest
Типизация
![Page 56: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/56.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(); } }
Поисковая формаGodeFest
![Page 57: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/57.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); } }
Поисковая формаGodeFest
![Page 58: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/58.jpg)
Стандартные
TextBlock
TextInput
Link
Button
![Page 59: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/59.jpg)
Расширенные
Select
Radio
Table
Form
Checkbox
![Page 60: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/60.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 61: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/61.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 62: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/62.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 63: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/63.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 64: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/64.jpg)
Form
public class CommonUserSteps {
public void loginAsCommonUser() { User user = UserFactory.getCommonUser(); HashMap<String, Object> userHash = convert(user); onSearchPage().getAuthorizationForm.fill(userHash); }}
public class SearchPage {
@FindBy(className = "b-domik") private Form authorizationForm;
}
![Page 65: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/65.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 66: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/66.jpg)
Table
public class SearchUserSteps {
public List<User> findAllUsers() { Table usersTable = onSomeSecretPage().getUsersTable(); List<Map> hash = usersTable.getRowsMappedToHeadings(); List<User> users = convert(hash); return users; }}
public class SomeSecretePage {
@FindBy(className = "b-secret") private Table users;
}
![Page 67: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/67.jpg)
Converters
![Page 68: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/68.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); } }
Поисковая формаGodeFest
![Page 69: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/69.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); } }
Поисковая формаGodeFest
![Page 70: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/70.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 71: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/71.jpg)
Конструктор
Типизированные элементы
Страница
![Page 72: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/72.jpg)
Блоки элементов
Типизация элементов
Библиотека матчеров
![Page 73: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/73.jpg)
Матчеры
![Page 74: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/74.jpg)
Матчеры
assertThat(audience, isPayingAttention())
![Page 75: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/75.jpg)
Матчеры
assertThat(audience, isPayingAttention())
assertThat(audience, is(not(sleeping())))
![Page 76: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/76.jpg)
Матчеры элементов
![Page 77: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/77.jpg)
assertThat(element, exists())
Матчеры элементов
![Page 78: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/78.jpg)
assertThat(element, exists())
assertThat(element, hasText(“CodeFest”))
Матчеры элементов
![Page 79: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/79.jpg)
assertThat(element, exists())
assertThat(element, hasText(“CodeFest”))
assertThat(checkBox, isSelected())
Матчеры элементов
![Page 80: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/80.jpg)
assertThat(element, exists())
assertThat(element, hasText(“CodeFest”))
assertThat(checkBox, isSelected())
assertThat(radio, hasSelectedButton(3))
Матчеры элементов
![Page 81: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/81.jpg)
public class CommonUserSteps {
public void shouldSeeSearchResults() { assertThat( onSearchPage().getSearchResults(), exist() ); }}
Матчеры в степах
![Page 82: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/82.jpg)
public class CommonUserSteps {
public void shouldSeeSearchResults() { assertThat(onSearchPage().getSearchResults(), both(exist()).and(isDisplayed())); }}
Матчеры в степах
![Page 83: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/83.jpg)
public class CommonUserSteps {
public void shouldSeeSearchResults(Matcher mch) { assertThat( onSearchPage().getSearchResults(), mch ); }}
Матчеры в степах
![Page 84: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/84.jpg)
@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( both(exists()).and(isDisplayed()) );}
Матчеры в тестах
![Page 85: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/85.jpg)
Вывод ошибки@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( both(exists()).and(isDisplayed()) );}
Expected: element existing on page but: was <[[FirefoxDriver: firefox on MAC (e3b28f2e-7aa7-a241-8807-40df2a8e0b54)] -> ...]>
![Page 86: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/86.jpg)
@Block(@FindBy(className = "b-head-search")) public class SearchResultBlock extends HtmlElement {
@Name("Список поисковых результатов") @FindBy(id = "results") private List<SearchResult> searchResults;
@FindBy(id = "info") private TextBlock searchInfo;
}
Именование элементов
![Page 87: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/87.jpg)
public class SearchPage {
@Name(“Блок поисковых результатов”) private SearchResultsBlock searchResultsBlock;
}
Переопределение
@Block(@FindBy(className = "b-head-search")) public class SearchResultsBlock extends HtmlElement {
...
}
![Page 88: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/88.jpg)
@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( both(exists()).and(isDisplayed()) );}
Expected: element existing on page but: was SearchResultBlock
Вывод ошибки
![Page 89: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/89.jpg)
Декораторы
![Page 90: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/90.jpg)
@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( should(exists()).whileWaitingUntil(timeoutHasExpired()) );}
Waiter Decorator
Expected: while waiting for [30000] ms element existing on page but: was SearchResultBlock
![Page 91: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/91.jpg)
@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( should(exists()).after(pageRefresh(driver)) );}
Action Decorator
Expected: after page refresh element existing on page but: was SearchResultBlock
![Page 92: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/92.jpg)
@Test public void shouldSeeSearchResultsWhenLookingUp() { user.searchFor("CodeFest"); user.shouldSeeSearchResults( should(isDisplayed()).inCase(exists()); );}
Condition Decorator
Expected: element displayed on page if element exists on page but: was SearchResultBlock
![Page 93: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/93.jpg)
Блоки элементов
Типизация элементов
Библиотека матчеров
![Page 94: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/94.jpg)
71
Будущее
![Page 95: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/95.jpg)
Библиотека элементов
![Page 96: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/96.jpg)
Библиотека элементов
![Page 97: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/97.jpg)
Генерация блоков
![Page 98: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/98.jpg)
Страница
Генерация блоков
![Page 99: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/99.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(); } }
@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }
@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }
@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }
@Block(@FindBy(className = "b-head-search")) public class SearchArrow extends HtmlElement { @FindBy(id = "text") private WebElement requestInput; @FindBy(className = "b-form-button__input") private WebElement searchButton; public void searchFor(String request) { requestInput.sendKeys(request); searchButton.click(); } }
Страница Блоки
Генерация блоков
![Page 100: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/100.jpg)
Попробуйтесами
![Page 101: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/101.jpg)
Steps
Tests
Element
PageObject
![Page 102: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/102.jpg)
HtmlElements
![Page 103: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/103.jpg)
Технологии
Converter = LambdaJ
Step FRWK = 2CDDs
Matchers = Hamcrest
![Page 104: CodeFest 2013. Ерошенко А. — Фреймворк Html Elements или как удобно взаимодействовать с веб-интерфейсами в тестах](https://reader031.fdocuments.us/reader031/viewer/2022020110/5478edc0b4af9fef158b46b4/html5/thumbnails/104.jpg)
https://groups.google.com/forum/?fromgroups#!forum/yandex-qatools-htmlelements
@eroshenkoam
https://github.com/yandex-qatools/htmlelements