Использование паттерна Page Object.

Page object

Page Object - один из наиболее полезных и используемых архитектурных решений в автоматизации. Данный шаблон проектирования помогает инкапсулировать работу с отдельными элементами страницы, что позволяет уменьшить количество кода и упростить его поддержку. Если, к примеру, дизайн одной из страниц изменён, то нам нужно будет переписать только соответствующий класс, описывающий эту страницу.
Основные преимущества:
  • Разделение кода тестов и описания страниц
  • Объединение всех действий по работе с веб-странией в одном месте
Давайте посмотрим, как с этим работать. Для примера возьмём страницу логина, которая есть практически на всех сайтах. Создадим класс с описание этой страницы, используя шаблон Page Object:
1
public class LoginPage {
2
By usernameLocator = By.id("username");
3
By passwordLocator = By.id("passwd");
4
By loginButtonLocator = By.id("login");
5
6
private final WebDriver driver;
7
8
public LoginPage(WebDriver driver) {
9
this.driver = driver;
10
11
if (!"Login".equals(driver.getTitle())) {
12
throw new IllegalStateException("This is not the login page");
13
}
14
}
15
16
public LoginPage typeUsername(String username) {
17
driver.findElement(usernameLocator).sendKeys(username);
18
return this;
19
}
20
21
public LoginPage typePassword(String password) {
22
driver.findElement(passwordLocator).sendKeys(password);
23
return this;
24
}
25
26
public HomePage submitLogin() {
27
driver.findElement(loginButtonLocator).submit();
28
return new HomePage(driver);
29
}
30
31
public LoginPage submitLoginExpectingFailure() {
32
driver.findElement(loginButtonLocator).submit();
33
return new LoginPage(driver);
34
}
35
36
public HomePage loginAs(String username, String password) {
37
typeUsername(username);
38
typePassword(password);
39
return submitLogin();
40
}
Copied!
}

Page Factory

Еще одним вариантом применения page object шаблона является использование класса Page Factory из библиотеки Selenium. Давайте разберёмся, как с ним работать. Сначала нам нужно создать простой page object:
1
public class GoogleSearchPage {
2
private WebElement q;
3
4
public void searchFor(String text) {
5
q.sendKeys(text);
6
q.submit();
7
}
8
}
Copied!
Теперь, чтобы всё работало корректно, нам нужно инициализировать наш page object. Это выглядит так:
1
package org.openqa.selenium.example;
2
3
import org.openqa.selenium.WebDriver;
4
import org.openqa.selenium.WebElement;
5
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
6
import org.openqa.selenium.support.PageFactory;
7
8
public class UsingGoogleSearchPage {
9
public static void main(String[] args) {
10
WebDriver driver = new HtmlUnitDriver();
11
12
driver.get("http://www.google.com/");
13
14
GoogleSearchPage page = PageFactory.initElements(driver, GoogleSearchPage.class);
15
16
page.searchFor("Cheese");
17
}
18
}
Copied!
Copy link