PageObjects
"Page objects are a classic example of encapsulation - they hide the details of the UI structure and widgetry from other components (the tests)." (c) Martin Fowler, PageObject.
Если кратко, весь шаблон PageObject сводится к применению инкапсуляции ради сокрытия технических деталей шагов в тестах. Ниже представлены всего лишь несколько примеров простого теста с использованием инкапсуляции и без.
No Encapsulation
public class GoogleTest {
@BeforeClass
public static void setup() {
Configuration.baseUrl = "http://google.com/ncr"
}
@Test
public void userCanSearch() {
open("/");
$(By.name("q")).val("selenide").pressEnter();
$$(".srg .g").shouldHave(size(10));
$$(".srg .g").get(1).shouldHave(text("Selenide: concise UI tests in Java"));
}
}
Mid-level encapsulation
public class GoogleTest {
@BeforeClass
public static void setup() {
Configuration.baseUrl = "http://google.com/ncr"
}
@Test
public void userCanSearch() {
GooglePage google = new GooglePage();
google.open().searchFor("selenide");
google.results().shouldHave(size(10));
google.results().get(0).shouldHave(text("Selenide: concise UI tests in Java"));
}
}
где:
public class GooglePage {
public GooglePage open() {
Selenide.open("/");
return this;
}
public GooglePage searchFor(String text) {
$(By.name("q")).val(text).pressEnter();
return this;
}
public ElementsCollection results() {
return $$(".srg .g");
}
}
Higher level encapsulation
public class GoogleTest {
GooglePage google = new GooglePage();
SearchResults results = new SearchResults();
@BeforeClass
public static void setup() {
Configuration.baseUrl = "http://google.com/ncr"
}
@Test
public void userCanSearch() {
GooglePage google = new GooglePage();
google.open().searchFor("selenide");
results.shouldHaveSize(10)
.shouldHaveResult(0, "Selenide: concise UI tests in Java");
}
}
где:
public class GooglePage {
public GooglePage open() {
Selenide.open("/");
return this;
}
public SearchResults searchFor(String text) {
$(By.name("q")).val(text).pressEnter();
return new SearchResults();
}
}
public class SearchResults {
private final ElementsCollection elements = $$(".srg .g");
public SearchResults shouldHaveSize(int size) {
elements.shouldHaveSize(size);
return this;
}
public SearchResults shouldHaveResult(int index, String text) {
elements.shouldHave(text(text));
return this;
}
}
More examples
Больше примеров и вариаций реализации шаблона PageObject можно найти в следующих докладах: