HtmlElements – естественное расширение PageObject
- 10. public class SearchPage {
@FindBy(id = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(name = "b-form-button__input")
private WebElement authorizeButton;
public SearchPage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
public void searchFor(String request) {
requestInput.sendKeys(request);
searchButton.click();
}
public void authorize (String login, String password) {
loginInput.sendKeys(login);
passwordInput.sendKeys(login);
authorizeButton.click();
}
}
- 12. public class CommonUserSteps {
public CommonUserSteps(WebDriver driver) {
...
}
public SearchPage onSearchPage() {
return searchPage;
}
public void loginAsCommonUser() {
User user = UserFactory.getCommonUser();
onSearchPage().authorize(user.getLogin, user.getPassword);
}
public void searchFor(String request) {
onSearchPage().searchFor(request);
}
public void shouldSeeSearchResults() {
assertTrue(onSearchPage().isSearchResultsBlockDisplayed());
}
}
- 14. public class SearchResultsTest {
private WebDriver driver = new FirefoxDriver();
private CommonUserSteps user = new CommonUserSteps(driver);
@Before
public void loadPage() {
driver.get("http://www.yandex.ru");
}
@Test
public void shouldSeeSearchResultsWhenLookingUp() {
user.searchFor("PageObject");
user.shouldSeeSearchResults();
}
@After
public void closeDriver() {
driver.quit();
}
}
- 24. public class AutoHomePage {
@FindBy(name = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(xpath = "//div[@class='b-domik__button']//input")
private WebElement loginButton;
@FindBy(name = "twoweeks")
private WebElement rememberMeCheckBox;
@FindBy(name = "text")
Загромождение
- 25. public class AutoHomePage {
@FindBy(name = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(xpath = "//div[@class='b-domik__button']//input")
private WebElement loginButton;
@FindBy(name = "twoweeks")
private WebElement rememberMeCheckBox;
@FindBy(name = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(xpath = "//div[@class='b-domik__button']//input")
private WebElement loginButton;
@FindBy(name = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(xpath = "//div[@class='b-domik__button']//input")
private WebElement loginButton;
Загромождение
- 26. public class AutoHomePage {
@FindBy(name = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(xpath = "//div[@class='b-domik__button']//input")
private WebElement loginButton;
@FindBy(name = "twoweeks")
private WebElement rememberMeCheckBox;
@FindBy(name = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(xpath = "//div[@class='b-domik__button']//input")
private WebElement loginButton;
@FindBy(name = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(xpath = "//div[@class='b-domik__button']//input")
private WebElement loginButton;
@FindBy(name = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(xpath = "//div[@class='b-domik__button']//input")
private WebElement loginButton;
@FindBy(name = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(xpath = "//div[@class='b-domik__button']//input")
private WebElement loginButton;
@FindBy(name = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(xpath = "//div[@class='b-domik__button']//input")
private WebElement loginButton;
@FindBy(name = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
Загромождение
- 39. @Block(@FindBy(className = "b-head-search"))
public class SearchArrow extends HtmlElement {
@FindBy(id = "text")
private WebElement requestInput;
@FindBy(className = "b-form-button__input")
private WebElement searchButton;
public void searchFor(String request) {
requestInput.sendKeys(request);
searchButton.click();
}
}
Поисковая форма
- 40. @Block(@FindBy(className = "b-domik"))
public class AuthorizationForm extends HtmlElement {
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(className = "b-form-button__input")
private WebElement authorizeButton;
public void authorize(String login, String pass) {
loginInput.sendKeys(login);
passwordInput.sendKeys(password);
authorizeButton.click();
}
}
Форма авторизации
- 42. Главная страница
public class SearchPage {
@FindBy(id = "text")
private WebElement requestInput;
@FindBy(xpath = "//input[@type='submit']")
private WebElement searchButton;
@FindBy(name = "login")
private WebElement loginInput;
@FindBy(name = "passwd")
private WebElement passwordInput;
@FindBy(name = "b-form-button__input")
private WebElement authorizeButton;
public SearchPage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
...
}
- 43. public class SearchPage {
private SearchArrow searchArrow;
private AuthorizationForm authorizationForm;
public SearchPage(WebDriver driver) {
HtmlElementLoader.populatePageObject(this, driver);
}
public void searchFor(String request) {
searchArrow.searchFor(request);
}
public void login(String login, String password) {
authorizationForm.login(login, password);
}
}
Главная страница
- 45. public class AutoSearchPage {
@FindBy(className = "b-search")
private SearchArrow searchArrow;
private SearchResultsBlock searchResultsBlock;
public SearchResultsPage(WebDriver driver) {
HtmlElementLoader.populatePageObject(this, driver);
}
public void searchFor(String request) {
searchArrow.searchFor(request);
}
public boolean isSearchResultsBlockDisplayed() {
return searchResultsBlock.isDisplayed();
}
}
Переопределение
- 51. Поисковая форма
в чем смысл
@Block(@FindBy(className = "b-head-search"))
public class SearchArrow extends HtmlElement {
@FindBy(id = "text")
private WebElement requestInput;
@FindBy(className = "b-form-button__input")
private WebElement searchButton;
@FindBy(xpath = "//div[@class='i-popup__content']//li")
private List<WebElement> suggest;
public void searchBySuggest(String request, int suggestItemNumber) {
requestInput.sendKeys(request);
suggest.get(suggestItemNumber).click();
}
}
- 52. Поисковая форма
в чем смысл
@Block(@FindBy(className = "b-head-search"))
public class SearchArrow extends HtmlElement {
@FindBy(id = "text")
private WebElement requestInput;
@FindBy(className = "b-form-button__input")
private WebElement searchButton;
@FindBy(xpath = "//div[@class='i-popup__content']//li")
private List<WebElement> suggest;
public void searchBySuggest(String request, int suggestItemNumber) {
requestInput.sendKeys(request);
suggest.get(suggestItemNumber).click();
}
}
@Block(@FindBy(className = "b-head-search"))
public class SearchArrow extends HtmlElement {
@FindBy(id = "text")
private TextInput requestInput;
@FindBy(className = "b-form-button__input")
private Button searchButton;
@FindBy(className = "i-popup__content")
private Suggest suggest;
public void searchBySuggest(String request, int suggestItemNumber) {
requestInput.sendKeys(request);
suggest.selectByIndex(suggestItemNumber);
}
}
- 55. public class Checkbox extends TypifiedElement {
public WebElement getLabel(){...}
public String getLabelText(){...}
public String getText(){...}
public void select(){...}
public void deselect(){...}
public void set(boolean checked){...}
public boolean isSelected(){...}
}
Checkbox
- 56. public class Radio extends TypifiedElement {
public List<WebElement> getButtons(){...}
public WebElement getSelectedButton(){...}
public void selectByValue(String value){...}
public void selectByIndex(int index){...}
}
Radio
- 57. public class Select extends TypifiedElement {
public boolean isMultiple(){...}
public List<WebElements> getOptions(){...}
public List<WebElement> getAllSelectedOptions(){...}
public WebElement getFirstSelectedOption(){...}
public void selectByVisibleText(String text){...}
public void selectByIndex(int index){...}
public void selectByValue(String value){...}
public void deselectAll(){...}
public void deselectByValue(String value){...}
public void deselectByIndex(int index){...}
public void deselectByVisibleText(String text){...}
}
Select
- 58. Form
public class Form extends TypifiedElement {
public void fill(Map<String, Object> data){...}
public <T> void fill(T bean, Converter Converter){...}
protected WebElement findFiledByKey(String key){...}
protected void fillField(WebElement e, Object value){...}
public WebElement findFirstField(By by){...}
public List<WebElement> findFields(By by){...}
public List<WebElement> findSelectsBy(By by){...}
}
- 60. public class SearchPage {
@FindBy(className = "b-domik")
private Form authorizationForm;
}
public class CommonUserSteps {
public void loginAsCommonUser() {
User user = UserFactory.getCommonUser();
HashMap<String, Object> userHash = convert(user);
onSearchPage().getAuthorizationForm.fill(userHash);
}
}
public class CommonUserSteps {
public void loginAsCommonUser() {
User user = UserFactory.getCommonUser();
HashMap<String, Object> userHash = convert(user);
onSearchPage().getAuthorizationForm.fill(userHash);
}
}
public class User {
@WebInput("login")
public String login;
@WebInput("passwd")
public String password;
}
- 61. public class Table extends TypifiedElement {
public List<WebElement> getHeadings(){...}
public List<String> getHeadingsAsString(){...}
public List<List<WebElement>> getRows(){...}
public List<List<WebElement>> getColumns(){...}
public WebElement getCellAt(int i, int j){...}
public List<Map> getRowsMappedToHeadings() {...}
public List<Map> getRowsMappedToHeadings(List<String> h){...}
public List<Map> getRowsAsStringMappedToHeadings(){...}
public List<Map> getRowsAsStringMappedToHeadings(List h){...}
}
Table
- 62. public class User {
@WebInput("login")
public String login;
@WebInput("passwd")
public String password;
}
Login Passwd
eroshenkoam c4fmUDTmbCzy8d
autotester 7cRrTT7g
- 63. public class User {
@WebInput("login")
public String login;
@WebInput("passwd")
public String password;
}
public class SearchUserSteps {
public List<User> findAllUsers() {
Table usersTable = onSomeSecretPage().getUsersTable();
List<Map> hash = usersTable.getRowsMappedToHeadings();
List<User> users = convert(hash);
return users;
}
}
public class SomeSecretePage {
@FindBy(className = "b-secret")
private Table users;
}
- 65. Поисковая форма
в чем смысл
@Block(@FindBy(className = "b-head-search"))
public class SearchArrow extends HtmlElement {
@FindBy(id = "text")
private TextInput requestInput;
@FindBy(className = "b-form-button__input")
private Button searchButton;
@FindBy(className = "i-popup__content")
private Suggest suggest;
public void searchBySuggest(String request, int suggestItemNumber) {
requestInput.sendKeys(request);
suggest.selectByIndex(suggestItemNumber);
}
}
- 66. Поисковая форма
в чем смысл
@Block(@FindBy(className = "b-head-search"))
public class SearchArrow extends HtmlElement {
@FindBy(id = "text")
private TextInput requestInput;
@FindBy(className = "b-form-button__input")
private Button searchButton;
@FindBy(className = "i-popup__content")
private Suggest suggest;
public void searchBySuggest(String request, int suggestItemNumber) {
requestInput.sendKeys(request);
suggest.selectByIndex(suggestItemNumber);
}
}
- 67. Добавление элементов
public class Suggest extends TypifiedElement {
public Suggest(WebElement wrappedElement) {
super(wrappedElement);
}
private List<WebElement> getItems() {
return getWrappedElement().findElements(By.xpath("//li"));
}
public void selectByIndex(int itemIndex) {
getItems().get(itemIndex).click();
}
public void selectByValue(String itemValue) {
for (WebElement item : getItems()) {
if (itemValue.equals(item.getText())) {
item.click();
return;
}
}
throw new NoSuchElementException();
}
}