SlideShare a Scribd company logo
1 of 123
1CONFIDENTIAL
Out of box Page Object
Design Pattern, Java
Anton Semenchenko
2CONFIDENTIAL
1. Page Object – just to “refresh”
2. State-less or state-full solution - just to “refresh”
3. How to select a proper PO implementation?
Agenda, part 1 (to refresh)
3CONFIDENTIAL
1. Hypothetical project context
2. Compare complexity
3. Compare “tech” limitations
4. Compare “business” limitations
5. Rationale “business” limitations
6. How to find and “update” a balance for your own project?
Agenda, part 2 (to refresh)
4CONFIDENTIAL
1. “raw” Selenium Page Objects
2. Page Factory from Selenium library
3. HMTL Element framework from Yandex
4. Selenide
5. JDI framework from EPAM
6. SWD Page Recorder
Agenda, part 3 (solutions)
5CONFIDENTIAL
1. A real-life example
2. “Homework”
3. “Rules” and principles
4. A set of useful links
5. What’s next?
6. Questions
Agenda, part 4 (take away points)
6CONFIDENTIAL
1. Page Objects – encapsulates the way of identification and logical grouping of widgets.
2. Page Object == Logical Page
3. Page Object != Physical Page
Page Object – just to “refresh”
7CONFIDENTIAL
Page Object – “example” 
8CONFIDENTIAL
Page Object – “example” 
9CONFIDENTIAL
1. Let’s compare:
– Photo
• Share – looks like parallelism (easy parallelism).
– Video
• Share – looks like parallelism (not trivial parallelism).
State-less or state-full solution?
10CONFIDENTIAL
1. How easy transform solution from “single” to “multi” threading (to decrease “QA
Automation Windows”)
– State-less – like share a photo
• Just 5 minutes of work.
– State-full – like share a video
• Not trivial task, could be a night mare.
2. Summary
– prefer state-less solutions to state-full solutions in mooooost cases;
– before start implementation a state-full solution, please, take a break for a minute, and re-
thing everything again, possibly you can find a proper state-less solution.
State-less or state-full solution?
11CONFIDENTIAL
1. Static class
– could be implemented as a state-less solution easily
2. Object
– State-full solution in 99,99% cases
3. Summary
– prefer static class based solutions (state-less) to object based (state-full) in mooooost cases;
– before start implementation based on objects, please, take a break for a minute, and re-thing
everything again, possibly you can find a proper solution based on static classes.
Object or static class  State-full or state-less solution?
12CONFIDENTIAL
1. Too complicated business logic due to Domain
2. Too complicated business logic due to System size (thousands test-cases)
3. Too many “contexts”
– Browser versions
– Environments
– Customers with a tiny nuances of functionality
– Platforms (cross-browser Web plus cross-platform Mobile)
– Combination 
4. Combination 
Page Objects – state-full, general case
13CONFIDENTIAL
1. Web UI that behaves like a Wizard
2. Web UI in combination with Mobile in one use case
3. Internet of Things (in most cases)
4. More then 1 page during 1 test (for example several portals or several instances of one
portal to implement one “business use case”):
– Really seldom;
– Looks like integration tests (in most cases):
• Std solution- some type of White Box Testing.
5. Many others “special cases”
Page Objects – state-full, special cases
14CONFIDENTIAL
How to select a proper PO implementation?
15CONFIDENTIAL
1. 30 Physical Pages
2. Standard Header, footer and search functionality for all physical pages
3. Each Physical Page consists of
– Header – H
– Footer – F
– Search – S
– Some functionality, specific for the Page – U (unique)
Hypothetical project context – to compare
16CONFIDENTIAL
1. 33 Static Page Objects = Logical Pages
2. 0 explicit and 30 implicit Physical Pages
3. Just share 33 Static Page Objects between 30 implicit Physical Pages
– For example, Header Static Page Object (static class) is used in test cases for all 30 Physical
Page Objects
4. Complexity – just 33 static state-less entities (plus limitations due to state-less solutions)
Compare complexity – Static Page Object based
17CONFIDENTIAL
1. 33 Dynamic Page Objects = Logical Pages
2. It depends on implementation (one of the ways):
– 0 explicit and 30 implicit Physical Pages
– implicit Physical Page implements on Action layer (limitations example)
– Action for Physical Page aggregates all necessary Dynamic Logical Pages
• Physical Pages are implemented in a next way: create all necessary instances of logical pages, aggregate in
some way, use Action layer as an point of aggregation in most cases, free resources
Compare complexity – Dynamic Page Object based (option 1)
18CONFIDENTIAL
1. 120 objects (min), each with some state, dynamically created and frees to implement
necessary behavior - to implement 30 implicit Physical Pages
2. Complexity – 120 dynamic, state-full entities min (plus some limitations due to state-full
solution implementation nuances)
Compare complexity – Dynamic Page Object based (option 1)
19CONFIDENTIAL
1. 33 Dynamic Page Objects = Logical Pages
2. It depends on implementation (another way):
– 30 explicit Physical Pages
– Multiple Interface inheritance
– Combine Page Objects and Actions layer (in most cases)
– Action-Physical Page (limitations example)
• Implements all Logical Pages interfaces using aggregation and “delegation”
• Aggregate all Dynamic Logical Page Objects
• Create and frees resources (Dynamic Logical Page Objects)
Compare complexity – Dynamic Page Object based (option 2)
20CONFIDENTIAL
1. 150 objects, each with some state, dynamically created and frees to implement necessary
behavior - to implement 30 explicit Physical Pages
2. Complexity – 150 dynamic, state-full not trivial entities with a multiple interface
inheritance (plus some limitations due to state-full solution implementation nuances)
Compare complexity – Dynamic Page Object based (option 2)
21CONFIDENTIAL
1. Can be used together with next Design Patterns  Approaches
– Action (both static – preferable and dynamic)
– Key-word driven
– DSL – external only
– BDD – partially, it depends on exact BDD engine implementation limitations
2. Can’t be used together with next Design Patterns
– Factory
– Flow (Fluent Interface)
– Navigator (for Web)
Compare “tech” limitations - Static Page Object based
22CONFIDENTIAL
1. No limitations, but …
– For example, in most cases it’s hard to isolate Action and Page Objects layers
Compare “tech” limitations - Dynamic Page Object based
23CONFIDENTIAL
1. Too complicated business logic due to Domain
2. Too complicated business logic due to System size (thousands test-cases)
3. Too many “contexts”
– Browser versions
– Environments
– Customers with a tiny nuances of functionality
– Platforms (cross-browser Web plus cross-platform Mobile)
– Combination 
4. Combination 
Compare “business” limitations - Static
24CONFIDENTIAL
1. State-less approach - you have a conditional that chooses different behavior depending on
…
2. Solution to simplify the project – refactoring “Replace Conditional with Polymorphism”
3. Polymorphism = object = State-full approach
Rationale “business” limitations - Static
25CONFIDENTIAL
1. “From refactoring to Patterns”
– There is a set of specific Design Patterns
2. The trickiest part – find a balance for your project now and update point of balance in time
Rationale “business” limitations - Static
26CONFIDENTIAL
1. Relatively simple business logic due to Domain
2. Relatively simple business logic due to System size (hundreds test-cases)
3. Not so many “contexts”
– Browser versions
– Environments
– Customers with a tiny nuances of functionality
– Platforms (cross-browser Web plus cross-platform Mobile)
Compare “business” limitations - Dynamic
27CONFIDENTIAL
1. State-full approach - you have a set of objects  classes, which developed, possibly, using
several Design Patterns to implement necessary functionality – to choose different behavior
depending on …
2. Solution to simplify the project – refactoring “Replace Polymorphism with Conditional”
3. Polymorphism ~= object ~= State-full approach
4. No Polymorphism ~= no objects ~= State-less approach
Rationale “business” limitations - Dynamic
28CONFIDENTIAL
1. “From Patterns to refactoring”
– There is no need to use a set of specific Design Patterns
2. The trickiest part – find a balance for your project now and update point of balance in time
Rationale “business” limitations - Dynamic
29CONFIDENTIAL
Find and “update” a balance for your own project
30CONFIDENTIAL
Page Factory from Selenium library
31CONFIDENTIAL
Page Factory - definition
1. Page Factory is an inbuilt page object model concept for Selenium WebDriver but it is very
optimized.
2. We use initElements method to initialize web elements
3. Additionally with the help of PageFactory class - use annotations @FindBy to find WebElement.
4. @FindBy can accept as attributes:
1. tagName
2. name
3. partialLinkText
4. linkText
5. Id
6. Css
7. className
8. Xpath
32CONFIDENTIAL
Page Factory - notes
1. If you use the PageFactory, you can assume that the fields are initialized. If you don't use the
PageFactory, then NullPointerExceptions will be thrown if you make the assumption that the fields
are already initialized.
2. List<WebElement> fields are decorated if and only if they have @FindBy or @FindBys annotation.
Default search strategy "by id or name" that works for WebElement fields is hardly suitable for
lists because it is rare to have several elements with the same id or name on a page.
33CONFIDENTIAL
Page Factory - notes
1. WebElements are evaluated lazily. That is, if you never use a WebElement field in a PageObject,
there will never be a call to "findElement" for it.
2. The functionality works using dynamic proxies. This means that you shouldn't expect a
WebElement to be a particular subclass, even if you know the type of the driver. For example, if
you are using the HtmlUnitDriver, you shouldn't expect the WebElement field to be initialized with
an instance of HtmlUnitWebElement.
34CONFIDENTIAL
Login Page
1.public class LoginPage {
2. private WebDriver driver;
3. @FindBy(id = "id_username")
4. private WebElement usernameInput;
5. @FindBy(id = "id_password")
6. private WebElement passwordInput;
7. @FindBy(id = "main_action_form_button")
8. private WebElement loginButton;
9.}
35CONFIDENTIAL
Login Page
1. public class LoginPage {
2. public LoginPage(WebDriver driver) {
3. this.driver = driver;
4. PageFactory.initElements(driver, this);
5. }
6. public void login(String username, String password) {
7. usernameInput.sendKeys(username);
8. passwordInput.sendKeys(password);
9. loginButton.click();
10. }
11.}
36CONFIDENTIAL
Home Page
1. public class HomePage {
2. private WebDriver driver;
3. @FindBy(css = "a[href*="login"]")
4. private WebElement loginButton;
5. public HomePage(WebDriver driver) {
6. this.driver = driver;
7. PageFactory.initElements(driver, this);
8. }
9. }
37CONFIDENTIAL
Home Page
1. public class HomePage {
2. public void login() {
3. login(Creds.username, Creds.password);}
4. private LoginPage clickLoginButton() {
5. loginButton.click();
6. return new LoginPage(driver);}
7. private void login(String username, String password) {
8. LoginPage loginPage = clickLoginButton();
9. loginPage.login(username, password);
38CONFIDENTIAL
Login test
1. public class LoginTest {
2. private WebDriver driver;
3. @BeforeMethod
4. public void setup() {
5. driver = new FirefoxDriver();
6. driver.manage().window().maximize();
7. driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
8. driver.get("https://www.pandadoc.com/");}
9. @AfterMethod
10. public void teardown() {
11. driver.close();}}
39CONFIDENTIAL
Login test
1. public class LoginTest {
2. private void assertSignedUp() {
3. new WebDriverWait(driver,
30000).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("
.header-avatar")));}
4. @Test
5. public void loginTest() {
6. HomePage homePage = new HomePage(driver);
7. homePage.login();
8. assertSignedUp();}}
40CONFIDENTIAL
Implementation is based on
• Reflection
• Annotation
• Templates
41CONFIDENTIAL
Page Factory from Selenium library - info
1. Page Object Model and Page Factory
2. Page Factory detailed desription
3. Page Object (Page Factory context)
4. AjaxElementLocatorFactory (obsolete)
5. Source code example
6. PageFactory.java (source code)
7. Book with a brief summary of Selenium WebDriver plus Java bindings (Ru only)
42CONFIDENTIAL
HMTL Elements framework from Yandex
1. Designed to provide easy-to-use way of interaction with web-page elements in your tests.
2. It may be considered as an extension of WebDriver Page Object (PageFactory).
3. With the help of Html Elements framework you can group web-page elements into blocks (Logical
Pages), encapsulate logic of interaction with them and then easily use created blocks in page
objects (Physical Pages).
43CONFIDENTIAL
HMTL Element framework from Yandex
1. Dividing page on blocks using @Block annotation
2. Separating different types of elements (button, checkbox)
3. Provides an ability to annotate methods as steps – annotation @Step for work in step-based style
4. Provides a set of helpful matchers to use with web-page elements and blocks
44CONFIDENTIAL
Login Page
1. public class LoginPage {
2. private WebDriver driver;
3. @FindBy(id = "id_username")
4. private static TextInput usernameInput;
5. @FindBy(id = "id_password")
6. private static TextInput passwordInput;
7. @FindBy(id = "main_action_form_button")
8. private static Button loginButton;
9. }
45CONFIDENTIAL
Login Page
1. public class LoginPage {
2. public LoginPage(WebDriver driver) {
3. this.driver = driver;
4. HtmlElementLoader.populatePageObject(this, driver);
5. }
6. public void login(String username, String password) {
7. usernameInput.sendKeys(username);
8. passwordInput.sendKeys(password);
9. loginButton.click();
10. }
11.}
46CONFIDENTIAL
Home Page
1. public class HomePage {
2. private WebDriver driver;
3. @FindBy(css = "a[href*="login"]")
4. private static Button loginButton;
5. public HomePage(WebDriver driver) {
6. this.driver = driver;
7. HtmlElementLoader.populatePageObject(this, driver);
8. }
9. }
47CONFIDENTIAL
Home Page
1. public class HomePage {
2. public void login() {
3. login(Creds.username, Creds.password); }
4. private LoginPage clickLoginButton() {
5. loginButton.click();
6. return new LoginPage(driver); }
7. private void login(String username, String password) {
8. LoginPage loginPage = clickLoginButton();
9. loginPage.login(username, password);}}
48CONFIDENTIAL
Login test
1. public class LoginTest {
2. private WebDriver driver;
3. @BeforeMethod
4. public void setup() {
5. driver = new FirefoxDriver();
6. driver.manage().window().maximize();
7. driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
8. driver.get("https://www.pandadoc.com/"); }
9. @AfterMethod
10. public void teardown() {
11. driver.close(); }}
49CONFIDENTIAL
Login test
1. public class LoginTest {
2. private WebDriver driver;
3. private void assertSignedUp() {
4. new WebDriverWait(driver,
30000).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("
.header-avatar"))); }
5. @Test
6. public void loginTest() {
7. HomePage homePage = new HomePage(driver);
8. homePage.login();
9. assertSignedUp(); }}
50CONFIDENTIAL
Implementation is based on
• Reflection
• Annotation
• Templates
51CONFIDENTIAL
HMTL Elements framework from Yandex - info
1. Official site of the tool
2. Examples
3. Source code example
4. Book with a brief summary of Selenium WebDriver plus Java bindings (Ru only)
52CONFIDENTIAL
Selenide
Selenide is a wrapper for Selenium Webdriver, oriented, as Geb, on fast and laconic automation but
using Java. Just focus on your business logic and let Selenide do the rest! Main advantages of that
tool:
1. Concise fluent API for tests
2. True Page Objects
53CONFIDENTIAL
Selenide
1. Webdriver access
2. jQuery style selectors
3. Ajax support for stable tests
4. Auto-start and browser destructions
5. You don't need to think how to shutdown browser, handle timeouts and StaleElement Exceptions
or search for relevant log lines, debugging your tests.
54CONFIDENTIAL
Login Page
1. public class LoginPage {
2. private static final By USERNAME_INPUT = By.id("id_username");
3. private static final By PASSWORD_INPUT = By.id("id_password");
4. private static final By LOGIN_BUTTON =
By.id("main_action_form_button");
5. public void login(String username, String password) {
6. $(USERNAME_INPUT).val(username);
7. $(PASSWORD_INPUT).val(password);
8. $(LOGIN_BUTTON).click();
9. }}
55CONFIDENTIAL
Login Page
Source code – where …?
56CONFIDENTIAL
Home Page
1. public class HomePage {
2. private static final By LOGIN_BUTTON =
By.cssSelector("a[href*="login"]");
3. public void login() {
4. login(Creds.username, Creds.password); }
5. private LoginPage clickLoginButton() {
6. $(LOGIN_BUTTON).click();
7. return page(LoginPage.class);}
8. private void login(String username, String password) {
9. LoginPage loginPage = clickLoginButton();
10. loginPage.login(username, password); }}
57CONFIDENTIAL
Home Page
Source code – where …?
58CONFIDENTIAL
Login test
public class LoginTest {
private HomePage homePage;
private void assertSignedUp() {
$(By.cssSelector(".header-avatar")).waitUntil(Condition.visible, 30000); }
@BeforeMethod
public void setup() {
Configuration.timeout = 10000;
homePage = open("https://www.pandadoc.com/", HomePage.class); }
@Test
public void loginTest() {
homePage.login();
assertSignedUp(); } }
59CONFIDENTIAL
Login test
Source code – where …?
60CONFIDENTIAL
Implementation is based on
• Reflection
• Annotation
• Templates
61CONFIDENTIAL
Selenide - info
1. Official site of the tool
2. Examples
3. Source code example
4. Book with a brief summary of Selenium WebDriver plus Java bindings (Ru only)
62CONFIDENTIAL
GDI – from EPAM Systems
JDI Goals
1. Accumulate best practices of UI automation (open source, page objects, logging, parallelism etc.)
2. Multiplatform framework
3. Intuitive test framework
4. Stable framework
5. Flexible framework
63CONFIDENTIAL
GDI features
• Interfaces based elements
• Complex UI Objects
• Simple + Complex UI elements + standard Forms = 31
• Cascade UI Objects Initialization
• Multiplatform
• Logging for all actions
• Stabilization mechanism
• Wide Customization abilities
• Module-based architecture
• Parallel test runs support
64CONFIDENTIAL
PageObject “infrastructure”
UI Objects
– UI elements for Web (Button, Label, Table…)
– IU elements for other platforms (any UI)
– “Standard” PageObjects
• Form
• Search
• Pagination
• Login
• others
Page Objects
– UI elements
– Actions with UI elements
65CONFIDENTIAL
Simple UI Elements – 10
1. Text
2. Button/Label
3. Link
4. Image
5. Checkbox
6. TextField
7. DatePicker
8. FileInput
9. TextArea
10. And others :)
66CONFIDENTIAL
Complex UI Elements – 12
• Selector
• RadioButtons
• Dropdown
• Tabs/Menu
• CheckList
• DropList
• ComboBox
• TextList
• Table
• Tree
• Range
• And others :)
67CONFIDENTIAL
Standard Pages - 9
• Page
• Section
• Form
• Pop
• PopupForm
• Search
• Pagination
• NavigationPane
68CONFIDENTIAL
PageObject std example, 1 (GDI)
@JPage(url = "http://www.epam.com")
public class JacketPage extends WebPage {
@FindBy(css=“someSelector") public Menu menu;
@FindBy(css="someSelector") public CheckList sizes;
@FindBy(css=" someSelector") public Button searchButton;
@FindBy(css=" someSelector") public Table results;
}
69CONFIDENTIAL
Test std example, 1 (GDI)
1. @Test
2. public void menuTest() {
3. menu.select("Man");
4. sizes.check("M", "L");
5. searchButton.click();
6. Assert.areEquals(results.rows().count(), 4);
7. Assert.isNotEmpty(results.row("Best Jacket", column("Title")));
8. }
70CONFIDENTIAL
PageObject std example, 1 (Selenium)
public class JacketPage {
@FindBy(css="") public List<WebElement> menuElements;
@FindBy(css="") public WebElement menuIsSelected;
@FindBy(css="") public List<WebElement> sizesElements;
@FindBy(css="") public WebElement sizesIsChecked;
@FindBy(css="") public List<WebElement> sizesLabels;
@FindBy(css="") public WebElement searchButton;
@FindBy(css="") public List<WebElement> resultsColumnHeaders;
@FindBy(css="") public List<WebElement> resultsRowsHeaders;
@FindBy(css="") public List<WebElement>resultsCellsHeaders;
@FindBy(css="") public List<WebElement> resultsColumn;
@FindBy(css="") public List<WebElement> resultsRow;
…
}
71CONFIDENTIAL
PageObject std example, 1 (Selenium)
public class JacketPage {
@FindBy(css="") public List<WebElement> menuElements;
...
@FindBy(css="") public List<WebElement> resultsRow;
public void selectElementFromMenu(String name) { … }
public String getSelectedMenuItem() { … }
public boolean isMenuItemSelected(String name) { … }
public void selectElementFromMenu(String name) { … }
…
public int getResultsCount() { … }
public boolean isResultPresent(String name) { … }
public WebElement getSomeAttributeForResult(String name) { … }
…
public List<WebElement> findAllResultsMatch(String name) { … }
}
72CONFIDENTIAL
PageObject std example, 2 (GDI)
1. @JPage(url = "/login", title = "EPAM - Login page")
2. public class LoginPage extends PageForm {
3. @FindBy(css = “.login”) private ITextField login;
4. @FindBy(css = “.password”) private ITextField password;
5. @FindBy(css = “.loginButton”) private IButton loginButton;
6. }
73CONFIDENTIAL
Test std sexample, 2 (GDI)
1. @Test
2. public void exampleTest(String searchText) {
3. loginPage.login(client);
4. searchPage.search(searchText);
5. resultsPage.results.eachContains(searchText);
6. resultsPage.openFirstResult();
7. productPage.check.productHasNoEmptyData();
8. }
74CONFIDENTIAL
Test std example, 3 (GDI)
@Test
public void shopTest() {
loginPage.open();
loginForm.login(new User(“user", "password"));
search.find("best jacket");
productForm.submit(Products.TestJacket);
pagination.next();
pagination.selectPage(5);
}
75CONFIDENTIAL
PageObject std example, 4 (GDI, “model” based)
1. public class LoginForm extends Form<User> {
2. @FindBy(css=“someLocator")
3. public TextField name;
4. @FindBy(css=“someLocator")
5. public TextField password;
6. @FindBy(css=“someLocator")
7. public Button loginButton;
8. }
76CONFIDENTIAL
PageObject std example, 4 (GDI , “model” based)
public class User {
public String name;
public String password;
public User(String name,
String password) {
this.name = name;
this.password = password;
}
}
77CONFIDENTIAL
PageObject std example, 5 (GDI)
1. @JSite(domain = "https://www.epam.com")
2. public class EpamSite extends WebSite {
3. @JPage(url = "/")
4. public static HomePage homePage;
5. @JPage(url = "/careers", title = "Careers")
6. public static CareerPage careerPage;
7. @JPage(url = "/careers/job-listings", title = "Job Listings",
8. urlCheckType = CONTAIN, titleCheckType = CONTAIN)
9. public static JobPage jobPage;
10....
11.}
WebSite.init(EpamSite.class);
78CONFIDENTIAL
“Forms” Page Object (GDI)
1. public class AddCVForm extends Form<Attendee> {
2. @FindBy(css = “.first-name“) private ITextField name;
3. @FindBy(css = “.last-name“) private ITextField lastName;
4. @FindBy(css = “.email“) private ITextField email;
5. @FindBy(css = “.file-upload“) private RFileInput cv;
6. @FindBy(css = “.comment-input“) private ITextArea comment;
7. @FindBy(xpath = “//*[.='Submit']“) private IButton submit;
8. @FindBy(xpath = “//*[.='Cancel']“) private IButton cancel;
9. }
79CONFIDENTIAL
Entities driven testing (GDI)
@Test(dataProvider = “attendees”)
public void menuTest(Attendee attendee) {
searchFilter.fill(attendee);
checkSuggestionsContains(attendee);
searchFilter.search(attendee);
assertEquals(results.rows().count(), 1);
results.row(attendee.name, column(“Name”))
addCVForm.submit(attendee.cv);
checkCVInDB(attendee.cv);
previewForm.verify(attendee);
}
80CONFIDENTIAL
Java examples
public class HomePage extends WebPage {
@FindBy(css="div.tabs-ui[data-path*=
'/content/epam/en/jcr:content/content_container/
section_4/section-par/tabs']")
public EpamCoreSection epamCoreSection;
}
81CONFIDENTIAL
Java examples
public class EpamCoreSection extends Section {
@FindBy(css="div.tab-1>div.text>div.text-ui >p>span.font-size-26")
public Text whoWeAreText;
@FindBy(css="div.tab-2>div.text>div.text-ui >p>span.font-size-26")
public Text whatWeDoText;
@FindBy(css="div.tab-3>div.text>div.text-ui >p>span.font-size-26")
public Text whoWeServeText;
@FindBy(xpath="//div[.='Who we serve']")
public Button whoWeServe;
@FindBy(xpath="//div[.='Who we are']")
public Button whoWeAre;
@FindBy(xpath="//div[.='What we do']")
public Button whatWeDo;
}
82CONFIDENTIAL
Java examples
@Test
public void presentationSimpleTest() {
homePage.checkOpened();
homePage.epamCoreSection.whoWeAre.highlight();
homePage.epamCoreSection.whoWeAreText.highlight();
new Check("Tab text").areEquals("" +
"We are more than developers.
We are the experts that
will take your business into the digital future.",
homePage.epamCoreSection.whoWeAreText.getText());
homePage.epamCoreSection.highlight();
homePage.epamCoreSection.whoWeServe.highlight();
homePage.epamCoreSection.whoWeServe.click();
}
83CONFIDENTIAL
Java examples
@Test
public void presentationComplexTest() {
homePage.checkOpened();
textToTest(HomeTabs.WHATWEDO, homePage.epamCoreSection);
textToTest(HomeTabs.WHOWEARE, homePage.epamCoreSection);
textToTest(HomeTabs.WHOWESERVE, homePage.epamCoreSection);
}
84CONFIDENTIAL
Java examples
public void textToTest(HomeTabs tab, EpamCoreSection epamCoreSection){
switch (tab) {
case WHOWEARE:
chooseTab(epamCoreSection.whoWeAre,
epamCoreSection.whoWeAreText, HomeTabsTextToCheck.WHOWEARE);
break;
case WHATWEDO:
chooseTab(epamCoreSection.whatWeDo,
epamCoreSection.whatWeDoText, HomeTabsTextToCheck.WHATWEDO);
break;
case WHOWESERVE:
chooseTab(epamCoreSection.whoWeServe,
epamCoreSection.whoWeServeText, HomeTabsTextToCheck.WHOWESERVE);
break;
}
}
85CONFIDENTIAL
Java examples
public void chooseTab(Button tab, Text text, String textToCheck){
tab.highlight();
tab.click();
text.highlight();
new Check("Tab text").areEquals(textToCheck,
text.getText());
}
86CONFIDENTIAL
Java examples
public static class HomeTabsTextToCheck {
public static final String WHOWEARE="We are more than developers." +
" We are the experts that will take your business into the digital future.";
public final static String WHATWEDO="We transform businesses through the art of digitization." +
" Our expertise spans multiple disciplines," +
" providing our clients with software solutions that dramatically drive results and outcomes.";
public final static String WHOWESERVE="The right technology translates business strategies into results." +
" We deliver domain-specific, transformative software solutions that reshape the way you do business.";
}
87CONFIDENTIAL
Customization
1. Customize method’s behavior
2. Customize element’s behavior
3. Customize all objects behavior
4. Develop new UI element
5. Modules
1. Logger
2. Asserter
3. Driver
4. etc.
88CONFIDENTIAL
Architecture  Modules structure
89CONFIDENTIAL
Architecture  Modules structure
90CONFIDENTIAL
Implementation is based on
Implementation is based on … what?
Let’s:
• download source code
• familiarize
• investigate
• develop a tiny prototype
• try to use
• try to improve (for example, add Decorator DP based features)
• welcome to QA Automation tools development
• welcome to Open Source
91CONFIDENTIAL
JDI - info
• http://jdi.epam.com/
• http://jdi.epam.com/download
• https://github.com/epam/JDI/tree/master/Java/Tests
• https://github.com/epam/JDI/tree/master/Java
• https://github.com/epam/JDI/tree/master/C%23.Net/Tests
• https://github.com/epam/JDI/tree/master/C%23.Net
• IT-Saturday video (Ru only)
• “JDI - EPAM Framework (IT-Subbotnik, with listings).pptx” (RU)
• “JDI - QA Conf 2016.pptx” (Ru)
• “JDI – Secon 2016.pptx” (EN)
92CONFIDENTIAL
Serenity (ex. Thucydides)
1. Serenity (Thucydides) – is an open-source tool, oriented on effective acceptance testing and
detailed documentation and reports of the project.
2. It works with Junit and BDD tools like JBehave and Cucumber-JVM, and gives a wide API for
automated testing with integrity with Selenium Webdriver.
3. It is made for the following tasks:
• Creating more flexible tests, which are easier to be supported
• Getting illustrated story-based reports
• Clear context of connection between tests and requirements
• Measurement of requirements coverage.
93CONFIDENTIAL
Serenity (ex. Thucydides) workflow
• Step 1: Defining requirement and acceptance criteria
It starts from requirements, which are need to be tested. For every requirement there is an
acceptance criteria which describing the requirement better. Thucydides automate acceptance
criteria
• Step 2: Modelling the requirements
With the help of Thucydides you create a simple model of requirements made on Java language. There
are some ways of modelling requirements, including simple Java class, using convention and structure
of directories of integrating with other tools like Jira. That approach allows the developer what
requirement is tested each of the test, and give Thucydides the ability to track testing features and
requirements
94CONFIDENTIAL
Serenity (ex. Thucydides) workflow
• Step 3: Automation of acceptance testing
Next is describing acceptance criteria by business language is following, and automation engineers
implement them using BDD such as jBehave or Cucumber-JVM, or using Java and Junit, in order for
Thucydides to run it with “pending” status (body is not implemented)
• Step 4: Test implementation
Automation Engineers now can implement acceptance criteria in a form of real-time AUT test. Tests
can be divided into steps for better readability and easiness of support. Webdriver is used for testing.
95CONFIDENTIAL
Serenity (ex. Thucydides) workflow
• Step 5: Test results report
Thucydides allow you to create detailed test reports about test runs, including:
History for ach test
Screenshot for each test step
Result of test run including time and error messages
• Step 6: Requirements coverage report
Besides test run reports, Thucideds also provide information about:
Number of tested requirements
Number of passed requirements
Number of requirements which need to be run
96CONFIDENTIAL
Serenity (ex. Thucydides) workflow
• Step 7: Project progress report
Thucydides provide information about project history progress:
Change in number of features implemented in time
Change in quantity of implemented and tested features in time
Change of failed tests in time
• Summary
As we can see, Thucydides is a rather complex tool, build around BDD concept and acceptance testing,
using Webdriver for testing web applications.
• Info
Official website
Official documentation
97CONFIDENTIAL
Page Object
And what about Page Object supports …?
98CONFIDENTIAL
Page Object “default” implementation
Framework implements Page Object pattern and let’s you decrease code duplication another one type
of classes between tests and pages, called “steps”. Let’s look at “steps” with page object class:
1. public class StepsinBook extends ScenarioSteps {
2. public StepsinBook(Pages pages) {
3. super(pages);
4. }
5. public BookPage getPageBook()
6. {
7. return getPages().currentPageAt(BookPage.class);
8. }
9. }
99CONFIDENTIAL
Page Object “default” implementation
1. public class StepsinBook extends ScenarioSteps {
2. @Step public void getMain(String url)
3. {
4. getPageBook().getMainPage(url);
5. }
6. @Step public void AllBooks()
7. {
8. getPageBook().allBooks();
9. }
10. @Step public void search(){
11. getPageBook().search(“Book");
12. }
13. @Step public void catalog(){
14. getPageBook().catalog();
15. }}
100CONFIDENTIAL
Page Object “default” implementation
1. public class BookPage extends PageObject {
2. @FindBy(linkText = “All books")
3. WebElement allbooksButton;
4. @FindBy(linkText = “Search")
5. WebElement searchButton;
6. @FindBy(name = "query")
7. WebElement searchField;
8. @FindBy(css = "button")
9. WebElement searchBegin;
10. }
101CONFIDENTIAL
Page Object “default” implementation
1. public class BookPage extends PageObject {
2. public BookPage(WebDriver driver) {
3. super(driver);
4. }
5. public void getMainPage(String url) {
6. getDriver().get(url);
7. }
8. public void allBooks() {
9. allbooksButton.click();
10. }
11. public void search(String searchWord) {
12. searchButton.click();
13. searchField.sendKeys(searchWord);
14. searchBegin.click();
15. }
16. }
102CONFIDENTIAL
Implementation is based on
• Reflection
• Annotation
• Templates
103CONFIDENTIAL
Geb – general info
1. Tool for browser automation, made on Groovy (JVM-based) and based on Selenium Webdriver.
2. It using:
1. Selenium for browser automation
2. jQuery selectors for locating elements
3. Page object pattern
.
3. In the bounds of testing it can be easily integrated with different test frameworks like:
1. Junit
2. TestNG
3. Spock
104CONFIDENTIAL
Geb – general info
If to compare with Webdriver API, Geb provides more comfortable interface in the following areas:
• Working with Webdriver instance (creating, configuration, moves, destruction)
• Locating elements (jQuery locators)
• Page object pattern
• Waiters
• Page interactions
• Work with AJAX elements
• Integration with build-tools (maven, gradle, grails)
• Integration with cloud services (Sauce labs, Browser Stack)
Official website
Official documentation
105CONFIDENTIAL
Geb - example
1. import geb.Browser
2. Browser.drive {
3. go "http://myapp.com/login"
4. assert $("h1").text() == "Please Login"
5. $("form.login").with {
6. username = "admin"
7. password = "password"
8. login().click()
9. }
10. assert $("h1").text() == "Admin Section"
11.}
106CONFIDENTIAL
SWD Page Recorder
1. SWD Page Recorder helps you to create locators of web-page, debug them in the application and
generate PageObject code for classes on C#, Java, Python, Ruby, Perl for using them in Selenium
Webdriver tests.
2. That tool not only lets you find locator needed, but also optimize it and generate all the code
needed for further element declaration in the code.
3. SWD Page Recorder is a unified tool for working with locators in every browser which are
supported by Selenium.
4. Important moment that Page Recorder tests the selectors using Webdriver – so you’re not going to
have cases when locator find other way will not work in Webdriver.
107CONFIDENTIAL
SWD Page Recorder
Sources, documentation and so on
108CONFIDENTIAL
How to select an appropriate solution?
109CONFIDENTIAL
1. Business context
2. Tech context
– Challenge
– Solution
– Technology Stack
3. QA Automation process context
4. Source code example
5. Summary
A real-life example
110CONFIDENTIAL
1. Example and “home work”
– How to setting up environment
• This is task 0 
– Where to download (https://github.com/comaqaby/Patterns/tree/master/C%23)
– How to build
– How to configure
– How to run
Example
111CONFIDENTIAL
1. Download example’ source code (for each “solution”)
2. “Investigate”
3. Develop a TODO list with a set of improvements
4. Setting up environment
5. Compile and Run
6. “Play”
7. Improve  Update TODO list with a set of improvements
“Homework”, part 1 
112CONFIDENTIAL
1. Read recommended books and articles
2. Improve  Update TODO list with a set of improvements
3. Provide me via email with an intermediate and final list of improvements
4. Develop at least 1 more auto-test (for each “solution”)
5. Develop a set of metrics to “compare” solutions
6. Develop an algorithm “How to select a proper solution”
7. Provide me via email with a set of metrics + algorithm
8. Next iteration 
“Homework”, part 2 
113CONFIDENTIAL
1. Play with GDI “attentively”
2. Join QA Automation tools development
3. Join Open Source “world”
“Homework”, part 3 
114CONFIDENTIAL
1. Could you please “refresh” your theoretical knowledge, slides 1-31, thanks
“Rules” and principles
115CONFIDENTIAL
1. Martin Fowler “Refactoring”
– http://martinfowler.com/books/refactoring.html
– http://refactoring.com/
– http://refactoring.com/catalog/
– http://refactoring.com/catalog/replaceConditionalWithPolymorphism.html
Useful links
116CONFIDENTIAL
1. Refactoring to Patterns and vice versa
– https://industriallogic.com/xp/refactoring/
– https://industriallogic.com/xp/refactoring/catalog.html
– https://industriallogic.com/xp/refactoring/conditionDispatcherWithCommand.html
– https://industriallogic.com/xp/refactoring/conditionalWithStrategy.html
– http://martinfowler.com/books/r2p.html
Useful links
117CONFIDENTIAL
1. https://sourcemaking.com/
– https://sourcemaking.com/refactoring
– https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism
– https://sourcemaking.com/design_patterns
– https://sourcemaking.com/antipatterns
• https://sourcemaking.com/antipatterns/software-development-antipatterns
• https://sourcemaking.com/antipatterns/software-architecture-antipatterns
– https://sourcemaking.com/uml
Useful links
118CONFIDENTIAL
Tech “basement”
• Grady Butch «Object oriented analysis and design with examples of apps on C++
Notes: IMHO No need to be afraid of C++, 95% of the material is conceptual, there is no strict
connection to chosen language. From my point of view is one of the best books for true getting to
know with OOP.
• Martin Fowler «Refactoring»
Notes: IMHO strongly recommend to read from cover to cover, twice, in order to have contents of
the book – you active professional luggage.
• Gang of four “Design patterns”
Notes: IMHO strongly recommend to read from cover to cover, twice, in order to have contents of
the book – you active professional luggage.
119CONFIDENTIAL
Tech “basement”
• D. Thomas, Andrew Hunt “Pragmatic Programmer, The: From Journeyman to Master”
Notes: IMHO Amazing book that consists of a ton of advices. IMHO strongly recommend to read
from cover to cover, twice, in order to have contents of the book – you active professional
luggage. And then look through different chapters before talking to a customer.
• Steve McConnel “Code complete”
Notes: IMHO No need to be afraid of the size of the book ... it should be read or before “going to
bed”, or from any place, of separate chapters, just to fresh things in the memory in the chosen f
ield of problem.
120CONFIDENTIAL
What’s next?!
• “Out of box Page Object Design Pattern, Java”
• Dynamic solutions
• Let’s compare with a static one
• “Out of box Page Object Design Pattern, .Net C#”
• Dynamic solutions
• Let’s compare with a static one
Summary: 5/12 - Webinar, 5/13 – send all necessary materials
• “Variants of implementation Page Object Design Pattern from the scratches, without being bind to
any programming language”
• Static solutions
• Dynamic solutions
• Let’s compare static and dynamic
• Answer to all our questions
Summary: 5/19 - Webinar, 5/19 – send all necessary materials
121CONFIDENTIAL
Anton_Semenchenko@epam.com
Skype - semenchenko_anton_v
+375 33 33 46 120
+375 44 74 00 385
https://www.linkedin.com/in/anton-semenchenko-612a926b
https://www.facebook.com/semenchenko.anton.v
https://twitter.com/comaqa
www.comaqa.by
www.corehard.by
122CONFIDENTIAL
Thanks for your attention
Anton Semenchenko
EPAM Systems
www.comaqa.by
www.corehard.by
123CONFIDENTIAL

More Related Content

What's hot

DSL, Page Object and Selenium – a way to reliable functional tests
DSL, Page Object and Selenium – a way to reliable functional testsDSL, Page Object and Selenium – a way to reliable functional tests
DSL, Page Object and Selenium – a way to reliable functional testsMikalai Alimenkou
 
Example of TAF with batch execution of test cases
 Example of TAF with batch execution of test cases  Example of TAF with batch execution of test cases
Example of TAF with batch execution of test cases COMAQA.BY
 
Page Objects Done Right - selenium conference 2014
Page Objects Done Right - selenium conference 2014Page Objects Done Right - selenium conference 2014
Page Objects Done Right - selenium conference 2014Oren Rubin
 
Selenium - The page object pattern
Selenium - The page object patternSelenium - The page object pattern
Selenium - The page object patternMichael Palotas
 
IBM ConnectED 2015 - MAS103 XPages Performance and Scalability
IBM ConnectED 2015 - MAS103 XPages Performance and ScalabilityIBM ConnectED 2015 - MAS103 XPages Performance and Scalability
IBM ConnectED 2015 - MAS103 XPages Performance and ScalabilityPaul Withers
 
Three Simple Chords of Alternative PageObjects and Hardcore of LoadableCompon...
Three Simple Chords of Alternative PageObjects and Hardcore of LoadableCompon...Three Simple Chords of Alternative PageObjects and Hardcore of LoadableCompon...
Three Simple Chords of Alternative PageObjects and Hardcore of LoadableCompon...Iakiv Kramarenko
 
Automation Abstractions: Page Objects and Beyond
Automation Abstractions: Page Objects and BeyondAutomation Abstractions: Page Objects and Beyond
Automation Abstractions: Page Objects and BeyondTechWell
 
Breaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit TestingBreaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit TestingSteven Smith
 
Selenium withnet
Selenium withnetSelenium withnet
Selenium withnetVlad Maniak
 
Improving the Quality of Existing Software - DevIntersection April 2016
Improving the Quality of Existing Software - DevIntersection April 2016Improving the Quality of Existing Software - DevIntersection April 2016
Improving the Quality of Existing Software - DevIntersection April 2016Steven Smith
 
Introduce Flux & react in practices (KKBOX)
Introduce Flux & react in practices (KKBOX)Introduce Flux & react in practices (KKBOX)
Introduce Flux & react in practices (KKBOX)Hsuan Fu Lien
 
Better Page Object Handling with Loadable Component Pattern
Better Page Object Handling with Loadable Component PatternBetter Page Object Handling with Loadable Component Pattern
Better Page Object Handling with Loadable Component PatternSQALab
 
Improving the Quality of Existing Software
Improving the Quality of Existing SoftwareImproving the Quality of Existing Software
Improving the Quality of Existing SoftwareSteven Smith
 
The Many Ways to Test Your React App
The Many Ways to Test Your React AppThe Many Ways to Test Your React App
The Many Ways to Test Your React AppAll Things Open
 
Java EE changes design pattern implementation: JavaDays Kiev 2015
Java EE changes design pattern implementation: JavaDays Kiev 2015Java EE changes design pattern implementation: JavaDays Kiev 2015
Java EE changes design pattern implementation: JavaDays Kiev 2015Alex Theedom
 
Java Basics for selenium
Java Basics for seleniumJava Basics for selenium
Java Basics for seleniumapoorvams
 
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...seleniumconf
 

What's hot (20)

DSL, Page Object and Selenium – a way to reliable functional tests
DSL, Page Object and Selenium – a way to reliable functional testsDSL, Page Object and Selenium – a way to reliable functional tests
DSL, Page Object and Selenium – a way to reliable functional tests
 
Example of TAF with batch execution of test cases
 Example of TAF with batch execution of test cases  Example of TAF with batch execution of test cases
Example of TAF with batch execution of test cases
 
Page Objects Done Right - selenium conference 2014
Page Objects Done Right - selenium conference 2014Page Objects Done Right - selenium conference 2014
Page Objects Done Right - selenium conference 2014
 
Selenium - The page object pattern
Selenium - The page object patternSelenium - The page object pattern
Selenium - The page object pattern
 
IBM ConnectED 2015 - MAS103 XPages Performance and Scalability
IBM ConnectED 2015 - MAS103 XPages Performance and ScalabilityIBM ConnectED 2015 - MAS103 XPages Performance and Scalability
IBM ConnectED 2015 - MAS103 XPages Performance and Scalability
 
Testing Angular
Testing AngularTesting Angular
Testing Angular
 
Three Simple Chords of Alternative PageObjects and Hardcore of LoadableCompon...
Three Simple Chords of Alternative PageObjects and Hardcore of LoadableCompon...Three Simple Chords of Alternative PageObjects and Hardcore of LoadableCompon...
Three Simple Chords of Alternative PageObjects and Hardcore of LoadableCompon...
 
Automation Abstractions: Page Objects and Beyond
Automation Abstractions: Page Objects and BeyondAutomation Abstractions: Page Objects and Beyond
Automation Abstractions: Page Objects and Beyond
 
COScheduler
COSchedulerCOScheduler
COScheduler
 
Breaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit TestingBreaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit Testing
 
Selenium withnet
Selenium withnetSelenium withnet
Selenium withnet
 
Improving the Quality of Existing Software - DevIntersection April 2016
Improving the Quality of Existing Software - DevIntersection April 2016Improving the Quality of Existing Software - DevIntersection April 2016
Improving the Quality of Existing Software - DevIntersection April 2016
 
Introduce Flux & react in practices (KKBOX)
Introduce Flux & react in practices (KKBOX)Introduce Flux & react in practices (KKBOX)
Introduce Flux & react in practices (KKBOX)
 
Better Page Object Handling with Loadable Component Pattern
Better Page Object Handling with Loadable Component PatternBetter Page Object Handling with Loadable Component Pattern
Better Page Object Handling with Loadable Component Pattern
 
Improving the Quality of Existing Software
Improving the Quality of Existing SoftwareImproving the Quality of Existing Software
Improving the Quality of Existing Software
 
The Many Ways to Test Your React App
The Many Ways to Test Your React AppThe Many Ways to Test Your React App
The Many Ways to Test Your React App
 
Asp.Net MVC Intro
Asp.Net MVC IntroAsp.Net MVC Intro
Asp.Net MVC Intro
 
Java EE changes design pattern implementation: JavaDays Kiev 2015
Java EE changes design pattern implementation: JavaDays Kiev 2015Java EE changes design pattern implementation: JavaDays Kiev 2015
Java EE changes design pattern implementation: JavaDays Kiev 2015
 
Java Basics for selenium
Java Basics for seleniumJava Basics for selenium
Java Basics for selenium
 
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
Testing Rapidly Changing Applications With Self-Testing Object-Oriented Selen...
 

Similar to Out of box page object design pattern, java

Comparing Angular and React JS for SPAs
Comparing Angular and React JS for SPAsComparing Angular and React JS for SPAs
Comparing Angular and React JS for SPAsJennifer Estrada
 
Contentful with Netgen Layouts workshop
Contentful with Netgen Layouts workshopContentful with Netgen Layouts workshop
Contentful with Netgen Layouts workshopIvo Lukac
 
Single Page Applications Workshop Part I: Interesting Topics in HTML5, CSS an...
Single Page Applications Workshop Part I: Interesting Topics in HTML5, CSS an...Single Page Applications Workshop Part I: Interesting Topics in HTML5, CSS an...
Single Page Applications Workshop Part I: Interesting Topics in HTML5, CSS an...Jalal Mostafa
 
Modern Web Applications with Sightly
Modern Web Applications with SightlyModern Web Applications with Sightly
Modern Web Applications with SightlyRadu Cotescu
 
LINQ 2 SQL Presentation To Palmchip And Trg, Technology Resource Group
LINQ 2 SQL Presentation To Palmchip  And Trg, Technology Resource GroupLINQ 2 SQL Presentation To Palmchip  And Trg, Technology Resource Group
LINQ 2 SQL Presentation To Palmchip And Trg, Technology Resource GroupShahzad
 
High Performance Ajax Applications 1197671494632682 2
High Performance Ajax Applications 1197671494632682 2High Performance Ajax Applications 1197671494632682 2
High Performance Ajax Applications 1197671494632682 2Niti Chotkaew
 
High Performance Ajax Applications
High Performance Ajax ApplicationsHigh Performance Ajax Applications
High Performance Ajax ApplicationsJulien Lecomte
 
Automation Abstraction Layers: Page Objects and Beyond
Automation Abstraction Layers: Page Objects and BeyondAutomation Abstraction Layers: Page Objects and Beyond
Automation Abstraction Layers: Page Objects and BeyondAlan Richardson
 
Présentation du générateur de site statique eleventy
Présentation du générateur de site statique eleventyPrésentation du générateur de site statique eleventy
Présentation du générateur de site statique eleventyGilles Vauvarin
 
Architecture Specification - Visual Modeling Tool
Architecture Specification - Visual Modeling ToolArchitecture Specification - Visual Modeling Tool
Architecture Specification - Visual Modeling ToolAdriaan Venter
 
Web Development with Delphi and React - ITDevCon 2016
Web Development with Delphi and React - ITDevCon 2016Web Development with Delphi and React - ITDevCon 2016
Web Development with Delphi and React - ITDevCon 2016Marco Breveglieri
 
Getting Started with React, When You’re an Angular Developer
Getting Started with React, When You’re an Angular DeveloperGetting Started with React, When You’re an Angular Developer
Getting Started with React, When You’re an Angular DeveloperFabrit Global
 
Application Express - A web development environment for the masses - and for ...
Application Express - A web development environment for the masses - and for ...Application Express - A web development environment for the masses - and for ...
Application Express - A web development environment for the masses - and for ...Sage Computing Services
 
Super applied in a sitecore migration project
Super applied in a sitecore migration projectSuper applied in a sitecore migration project
Super applied in a sitecore migration projectdodoshelu
 
AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)Igor Talevski
 
Diff sand box and farm
Diff sand box and farmDiff sand box and farm
Diff sand box and farmRajkiran Swain
 
Tips for Developing and Testing IBM HATS Applications
Tips for Developing and Testing IBM HATS ApplicationsTips for Developing and Testing IBM HATS Applications
Tips for Developing and Testing IBM HATS ApplicationsStrongback Consulting
 

Similar to Out of box page object design pattern, java (20)

Comparing Angular and React JS for SPAs
Comparing Angular and React JS for SPAsComparing Angular and React JS for SPAs
Comparing Angular and React JS for SPAs
 
Hibernate tutorial
Hibernate tutorialHibernate tutorial
Hibernate tutorial
 
Contentful with Netgen Layouts workshop
Contentful with Netgen Layouts workshopContentful with Netgen Layouts workshop
Contentful with Netgen Layouts workshop
 
Single Page Applications Workshop Part I: Interesting Topics in HTML5, CSS an...
Single Page Applications Workshop Part I: Interesting Topics in HTML5, CSS an...Single Page Applications Workshop Part I: Interesting Topics in HTML5, CSS an...
Single Page Applications Workshop Part I: Interesting Topics in HTML5, CSS an...
 
Modern Web Applications with Sightly
Modern Web Applications with SightlyModern Web Applications with Sightly
Modern Web Applications with Sightly
 
LINQ 2 SQL Presentation To Palmchip And Trg, Technology Resource Group
LINQ 2 SQL Presentation To Palmchip  And Trg, Technology Resource GroupLINQ 2 SQL Presentation To Palmchip  And Trg, Technology Resource Group
LINQ 2 SQL Presentation To Palmchip And Trg, Technology Resource Group
 
High Performance Ajax Applications 1197671494632682 2
High Performance Ajax Applications 1197671494632682 2High Performance Ajax Applications 1197671494632682 2
High Performance Ajax Applications 1197671494632682 2
 
High Performance Ajax Applications
High Performance Ajax ApplicationsHigh Performance Ajax Applications
High Performance Ajax Applications
 
Automation Abstraction Layers: Page Objects and Beyond
Automation Abstraction Layers: Page Objects and BeyondAutomation Abstraction Layers: Page Objects and Beyond
Automation Abstraction Layers: Page Objects and Beyond
 
Présentation du générateur de site statique eleventy
Présentation du générateur de site statique eleventyPrésentation du générateur de site statique eleventy
Présentation du générateur de site statique eleventy
 
Architecture Specification - Visual Modeling Tool
Architecture Specification - Visual Modeling ToolArchitecture Specification - Visual Modeling Tool
Architecture Specification - Visual Modeling Tool
 
Web Development with Delphi and React - ITDevCon 2016
Web Development with Delphi and React - ITDevCon 2016Web Development with Delphi and React - ITDevCon 2016
Web Development with Delphi and React - ITDevCon 2016
 
JS Essence
JS EssenceJS Essence
JS Essence
 
Getting Started with React, When You’re an Angular Developer
Getting Started with React, When You’re an Angular DeveloperGetting Started with React, When You’re an Angular Developer
Getting Started with React, When You’re an Angular Developer
 
70487.pdf
70487.pdf70487.pdf
70487.pdf
 
Application Express - A web development environment for the masses - and for ...
Application Express - A web development environment for the masses - and for ...Application Express - A web development environment for the masses - and for ...
Application Express - A web development environment for the masses - and for ...
 
Super applied in a sitecore migration project
Super applied in a sitecore migration projectSuper applied in a sitecore migration project
Super applied in a sitecore migration project
 
AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)
 
Diff sand box and farm
Diff sand box and farmDiff sand box and farm
Diff sand box and farm
 
Tips for Developing and Testing IBM HATS Applications
Tips for Developing and Testing IBM HATS ApplicationsTips for Developing and Testing IBM HATS Applications
Tips for Developing and Testing IBM HATS Applications
 

More from COMAQA.BY

Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...COMAQA.BY
 
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...COMAQA.BY
 
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...COMAQA.BY
 
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важностьRoman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важностьCOMAQA.BY
 
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...COMAQA.BY
 
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...COMAQA.BY
 
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...COMAQA.BY
 
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...COMAQA.BY
 
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.COMAQA.BY
 
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.COMAQA.BY
 
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...COMAQA.BY
 
Моя роль в конфликте
Моя роль в конфликтеМоя роль в конфликте
Моя роль в конфликтеCOMAQA.BY
 
Организация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиковОрганизация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиковCOMAQA.BY
 
Развитие или смерть
Развитие или смертьРазвитие или смерть
Развитие или смертьCOMAQA.BY
 
Эффективная работа с рутинными задачами
Эффективная работа с рутинными задачамиЭффективная работа с рутинными задачами
Эффективная работа с рутинными задачамиCOMAQA.BY
 
Open your mind for OpenSource
Open your mind for OpenSourceOpen your mind for OpenSource
Open your mind for OpenSourceCOMAQA.BY
 
JDI 2.0. Not only UI testing
JDI 2.0. Not only UI testingJDI 2.0. Not only UI testing
JDI 2.0. Not only UI testingCOMAQA.BY
 
Battle: BDD vs notBDD
Battle: BDD vs notBDDBattle: BDD vs notBDD
Battle: BDD vs notBDDCOMAQA.BY
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?COMAQA.BY
 
Аспектно ориентированное программирование для Java автоматизаторов
Аспектно ориентированное программирование для Java автоматизаторовАспектно ориентированное программирование для Java автоматизаторов
Аспектно ориентированное программирование для Java автоматизаторовCOMAQA.BY
 

More from COMAQA.BY (20)

Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
 
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
 
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
 
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важностьRoman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
 
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
 
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
 
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
 
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
 
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
 
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
 
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
 
Моя роль в конфликте
Моя роль в конфликтеМоя роль в конфликте
Моя роль в конфликте
 
Организация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиковОрганизация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиков
 
Развитие или смерть
Развитие или смертьРазвитие или смерть
Развитие или смерть
 
Эффективная работа с рутинными задачами
Эффективная работа с рутинными задачамиЭффективная работа с рутинными задачами
Эффективная работа с рутинными задачами
 
Open your mind for OpenSource
Open your mind for OpenSourceOpen your mind for OpenSource
Open your mind for OpenSource
 
JDI 2.0. Not only UI testing
JDI 2.0. Not only UI testingJDI 2.0. Not only UI testing
JDI 2.0. Not only UI testing
 
Battle: BDD vs notBDD
Battle: BDD vs notBDDBattle: BDD vs notBDD
Battle: BDD vs notBDD
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?
 
Аспектно ориентированное программирование для Java автоматизаторов
Аспектно ориентированное программирование для Java автоматизаторовАспектно ориентированное программирование для Java автоматизаторов
Аспектно ориентированное программирование для Java автоматизаторов
 

Recently uploaded

Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Science&tech:THE INFORMATION AGE STS.pdf
Science&tech:THE INFORMATION AGE STS.pdfScience&tech:THE INFORMATION AGE STS.pdf
Science&tech:THE INFORMATION AGE STS.pdfjimielynbastida
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDGMarianaLemus7
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 

Recently uploaded (20)

Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Science&tech:THE INFORMATION AGE STS.pdf
Science&tech:THE INFORMATION AGE STS.pdfScience&tech:THE INFORMATION AGE STS.pdf
Science&tech:THE INFORMATION AGE STS.pdf
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDG
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 

Out of box page object design pattern, java

  • 1. 1CONFIDENTIAL Out of box Page Object Design Pattern, Java Anton Semenchenko
  • 2. 2CONFIDENTIAL 1. Page Object – just to “refresh” 2. State-less or state-full solution - just to “refresh” 3. How to select a proper PO implementation? Agenda, part 1 (to refresh)
  • 3. 3CONFIDENTIAL 1. Hypothetical project context 2. Compare complexity 3. Compare “tech” limitations 4. Compare “business” limitations 5. Rationale “business” limitations 6. How to find and “update” a balance for your own project? Agenda, part 2 (to refresh)
  • 4. 4CONFIDENTIAL 1. “raw” Selenium Page Objects 2. Page Factory from Selenium library 3. HMTL Element framework from Yandex 4. Selenide 5. JDI framework from EPAM 6. SWD Page Recorder Agenda, part 3 (solutions)
  • 5. 5CONFIDENTIAL 1. A real-life example 2. “Homework” 3. “Rules” and principles 4. A set of useful links 5. What’s next? 6. Questions Agenda, part 4 (take away points)
  • 6. 6CONFIDENTIAL 1. Page Objects – encapsulates the way of identification and logical grouping of widgets. 2. Page Object == Logical Page 3. Page Object != Physical Page Page Object – just to “refresh”
  • 7. 7CONFIDENTIAL Page Object – “example” 
  • 8. 8CONFIDENTIAL Page Object – “example” 
  • 9. 9CONFIDENTIAL 1. Let’s compare: – Photo • Share – looks like parallelism (easy parallelism). – Video • Share – looks like parallelism (not trivial parallelism). State-less or state-full solution?
  • 10. 10CONFIDENTIAL 1. How easy transform solution from “single” to “multi” threading (to decrease “QA Automation Windows”) – State-less – like share a photo • Just 5 minutes of work. – State-full – like share a video • Not trivial task, could be a night mare. 2. Summary – prefer state-less solutions to state-full solutions in mooooost cases; – before start implementation a state-full solution, please, take a break for a minute, and re- thing everything again, possibly you can find a proper state-less solution. State-less or state-full solution?
  • 11. 11CONFIDENTIAL 1. Static class – could be implemented as a state-less solution easily 2. Object – State-full solution in 99,99% cases 3. Summary – prefer static class based solutions (state-less) to object based (state-full) in mooooost cases; – before start implementation based on objects, please, take a break for a minute, and re-thing everything again, possibly you can find a proper solution based on static classes. Object or static class State-full or state-less solution?
  • 12. 12CONFIDENTIAL 1. Too complicated business logic due to Domain 2. Too complicated business logic due to System size (thousands test-cases) 3. Too many “contexts” – Browser versions – Environments – Customers with a tiny nuances of functionality – Platforms (cross-browser Web plus cross-platform Mobile) – Combination  4. Combination  Page Objects – state-full, general case
  • 13. 13CONFIDENTIAL 1. Web UI that behaves like a Wizard 2. Web UI in combination with Mobile in one use case 3. Internet of Things (in most cases) 4. More then 1 page during 1 test (for example several portals or several instances of one portal to implement one “business use case”): – Really seldom; – Looks like integration tests (in most cases): • Std solution- some type of White Box Testing. 5. Many others “special cases” Page Objects – state-full, special cases
  • 14. 14CONFIDENTIAL How to select a proper PO implementation?
  • 15. 15CONFIDENTIAL 1. 30 Physical Pages 2. Standard Header, footer and search functionality for all physical pages 3. Each Physical Page consists of – Header – H – Footer – F – Search – S – Some functionality, specific for the Page – U (unique) Hypothetical project context – to compare
  • 16. 16CONFIDENTIAL 1. 33 Static Page Objects = Logical Pages 2. 0 explicit and 30 implicit Physical Pages 3. Just share 33 Static Page Objects between 30 implicit Physical Pages – For example, Header Static Page Object (static class) is used in test cases for all 30 Physical Page Objects 4. Complexity – just 33 static state-less entities (plus limitations due to state-less solutions) Compare complexity – Static Page Object based
  • 17. 17CONFIDENTIAL 1. 33 Dynamic Page Objects = Logical Pages 2. It depends on implementation (one of the ways): – 0 explicit and 30 implicit Physical Pages – implicit Physical Page implements on Action layer (limitations example) – Action for Physical Page aggregates all necessary Dynamic Logical Pages • Physical Pages are implemented in a next way: create all necessary instances of logical pages, aggregate in some way, use Action layer as an point of aggregation in most cases, free resources Compare complexity – Dynamic Page Object based (option 1)
  • 18. 18CONFIDENTIAL 1. 120 objects (min), each with some state, dynamically created and frees to implement necessary behavior - to implement 30 implicit Physical Pages 2. Complexity – 120 dynamic, state-full entities min (plus some limitations due to state-full solution implementation nuances) Compare complexity – Dynamic Page Object based (option 1)
  • 19. 19CONFIDENTIAL 1. 33 Dynamic Page Objects = Logical Pages 2. It depends on implementation (another way): – 30 explicit Physical Pages – Multiple Interface inheritance – Combine Page Objects and Actions layer (in most cases) – Action-Physical Page (limitations example) • Implements all Logical Pages interfaces using aggregation and “delegation” • Aggregate all Dynamic Logical Page Objects • Create and frees resources (Dynamic Logical Page Objects) Compare complexity – Dynamic Page Object based (option 2)
  • 20. 20CONFIDENTIAL 1. 150 objects, each with some state, dynamically created and frees to implement necessary behavior - to implement 30 explicit Physical Pages 2. Complexity – 150 dynamic, state-full not trivial entities with a multiple interface inheritance (plus some limitations due to state-full solution implementation nuances) Compare complexity – Dynamic Page Object based (option 2)
  • 21. 21CONFIDENTIAL 1. Can be used together with next Design Patterns Approaches – Action (both static – preferable and dynamic) – Key-word driven – DSL – external only – BDD – partially, it depends on exact BDD engine implementation limitations 2. Can’t be used together with next Design Patterns – Factory – Flow (Fluent Interface) – Navigator (for Web) Compare “tech” limitations - Static Page Object based
  • 22. 22CONFIDENTIAL 1. No limitations, but … – For example, in most cases it’s hard to isolate Action and Page Objects layers Compare “tech” limitations - Dynamic Page Object based
  • 23. 23CONFIDENTIAL 1. Too complicated business logic due to Domain 2. Too complicated business logic due to System size (thousands test-cases) 3. Too many “contexts” – Browser versions – Environments – Customers with a tiny nuances of functionality – Platforms (cross-browser Web plus cross-platform Mobile) – Combination  4. Combination  Compare “business” limitations - Static
  • 24. 24CONFIDENTIAL 1. State-less approach - you have a conditional that chooses different behavior depending on … 2. Solution to simplify the project – refactoring “Replace Conditional with Polymorphism” 3. Polymorphism = object = State-full approach Rationale “business” limitations - Static
  • 25. 25CONFIDENTIAL 1. “From refactoring to Patterns” – There is a set of specific Design Patterns 2. The trickiest part – find a balance for your project now and update point of balance in time Rationale “business” limitations - Static
  • 26. 26CONFIDENTIAL 1. Relatively simple business logic due to Domain 2. Relatively simple business logic due to System size (hundreds test-cases) 3. Not so many “contexts” – Browser versions – Environments – Customers with a tiny nuances of functionality – Platforms (cross-browser Web plus cross-platform Mobile) Compare “business” limitations - Dynamic
  • 27. 27CONFIDENTIAL 1. State-full approach - you have a set of objects classes, which developed, possibly, using several Design Patterns to implement necessary functionality – to choose different behavior depending on … 2. Solution to simplify the project – refactoring “Replace Polymorphism with Conditional” 3. Polymorphism ~= object ~= State-full approach 4. No Polymorphism ~= no objects ~= State-less approach Rationale “business” limitations - Dynamic
  • 28. 28CONFIDENTIAL 1. “From Patterns to refactoring” – There is no need to use a set of specific Design Patterns 2. The trickiest part – find a balance for your project now and update point of balance in time Rationale “business” limitations - Dynamic
  • 29. 29CONFIDENTIAL Find and “update” a balance for your own project
  • 31. 31CONFIDENTIAL Page Factory - definition 1. Page Factory is an inbuilt page object model concept for Selenium WebDriver but it is very optimized. 2. We use initElements method to initialize web elements 3. Additionally with the help of PageFactory class - use annotations @FindBy to find WebElement. 4. @FindBy can accept as attributes: 1. tagName 2. name 3. partialLinkText 4. linkText 5. Id 6. Css 7. className 8. Xpath
  • 32. 32CONFIDENTIAL Page Factory - notes 1. If you use the PageFactory, you can assume that the fields are initialized. If you don't use the PageFactory, then NullPointerExceptions will be thrown if you make the assumption that the fields are already initialized. 2. List<WebElement> fields are decorated if and only if they have @FindBy or @FindBys annotation. Default search strategy "by id or name" that works for WebElement fields is hardly suitable for lists because it is rare to have several elements with the same id or name on a page.
  • 33. 33CONFIDENTIAL Page Factory - notes 1. WebElements are evaluated lazily. That is, if you never use a WebElement field in a PageObject, there will never be a call to "findElement" for it. 2. The functionality works using dynamic proxies. This means that you shouldn't expect a WebElement to be a particular subclass, even if you know the type of the driver. For example, if you are using the HtmlUnitDriver, you shouldn't expect the WebElement field to be initialized with an instance of HtmlUnitWebElement.
  • 34. 34CONFIDENTIAL Login Page 1.public class LoginPage { 2. private WebDriver driver; 3. @FindBy(id = "id_username") 4. private WebElement usernameInput; 5. @FindBy(id = "id_password") 6. private WebElement passwordInput; 7. @FindBy(id = "main_action_form_button") 8. private WebElement loginButton; 9.}
  • 35. 35CONFIDENTIAL Login Page 1. public class LoginPage { 2. public LoginPage(WebDriver driver) { 3. this.driver = driver; 4. PageFactory.initElements(driver, this); 5. } 6. public void login(String username, String password) { 7. usernameInput.sendKeys(username); 8. passwordInput.sendKeys(password); 9. loginButton.click(); 10. } 11.}
  • 36. 36CONFIDENTIAL Home Page 1. public class HomePage { 2. private WebDriver driver; 3. @FindBy(css = "a[href*="login"]") 4. private WebElement loginButton; 5. public HomePage(WebDriver driver) { 6. this.driver = driver; 7. PageFactory.initElements(driver, this); 8. } 9. }
  • 37. 37CONFIDENTIAL Home Page 1. public class HomePage { 2. public void login() { 3. login(Creds.username, Creds.password);} 4. private LoginPage clickLoginButton() { 5. loginButton.click(); 6. return new LoginPage(driver);} 7. private void login(String username, String password) { 8. LoginPage loginPage = clickLoginButton(); 9. loginPage.login(username, password);
  • 38. 38CONFIDENTIAL Login test 1. public class LoginTest { 2. private WebDriver driver; 3. @BeforeMethod 4. public void setup() { 5. driver = new FirefoxDriver(); 6. driver.manage().window().maximize(); 7. driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 8. driver.get("https://www.pandadoc.com/");} 9. @AfterMethod 10. public void teardown() { 11. driver.close();}}
  • 39. 39CONFIDENTIAL Login test 1. public class LoginTest { 2. private void assertSignedUp() { 3. new WebDriverWait(driver, 30000).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(" .header-avatar")));} 4. @Test 5. public void loginTest() { 6. HomePage homePage = new HomePage(driver); 7. homePage.login(); 8. assertSignedUp();}}
  • 40. 40CONFIDENTIAL Implementation is based on • Reflection • Annotation • Templates
  • 41. 41CONFIDENTIAL Page Factory from Selenium library - info 1. Page Object Model and Page Factory 2. Page Factory detailed desription 3. Page Object (Page Factory context) 4. AjaxElementLocatorFactory (obsolete) 5. Source code example 6. PageFactory.java (source code) 7. Book with a brief summary of Selenium WebDriver plus Java bindings (Ru only)
  • 42. 42CONFIDENTIAL HMTL Elements framework from Yandex 1. Designed to provide easy-to-use way of interaction with web-page elements in your tests. 2. It may be considered as an extension of WebDriver Page Object (PageFactory). 3. With the help of Html Elements framework you can group web-page elements into blocks (Logical Pages), encapsulate logic of interaction with them and then easily use created blocks in page objects (Physical Pages).
  • 43. 43CONFIDENTIAL HMTL Element framework from Yandex 1. Dividing page on blocks using @Block annotation 2. Separating different types of elements (button, checkbox) 3. Provides an ability to annotate methods as steps – annotation @Step for work in step-based style 4. Provides a set of helpful matchers to use with web-page elements and blocks
  • 44. 44CONFIDENTIAL Login Page 1. public class LoginPage { 2. private WebDriver driver; 3. @FindBy(id = "id_username") 4. private static TextInput usernameInput; 5. @FindBy(id = "id_password") 6. private static TextInput passwordInput; 7. @FindBy(id = "main_action_form_button") 8. private static Button loginButton; 9. }
  • 45. 45CONFIDENTIAL Login Page 1. public class LoginPage { 2. public LoginPage(WebDriver driver) { 3. this.driver = driver; 4. HtmlElementLoader.populatePageObject(this, driver); 5. } 6. public void login(String username, String password) { 7. usernameInput.sendKeys(username); 8. passwordInput.sendKeys(password); 9. loginButton.click(); 10. } 11.}
  • 46. 46CONFIDENTIAL Home Page 1. public class HomePage { 2. private WebDriver driver; 3. @FindBy(css = "a[href*="login"]") 4. private static Button loginButton; 5. public HomePage(WebDriver driver) { 6. this.driver = driver; 7. HtmlElementLoader.populatePageObject(this, driver); 8. } 9. }
  • 47. 47CONFIDENTIAL Home Page 1. public class HomePage { 2. public void login() { 3. login(Creds.username, Creds.password); } 4. private LoginPage clickLoginButton() { 5. loginButton.click(); 6. return new LoginPage(driver); } 7. private void login(String username, String password) { 8. LoginPage loginPage = clickLoginButton(); 9. loginPage.login(username, password);}}
  • 48. 48CONFIDENTIAL Login test 1. public class LoginTest { 2. private WebDriver driver; 3. @BeforeMethod 4. public void setup() { 5. driver = new FirefoxDriver(); 6. driver.manage().window().maximize(); 7. driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 8. driver.get("https://www.pandadoc.com/"); } 9. @AfterMethod 10. public void teardown() { 11. driver.close(); }}
  • 49. 49CONFIDENTIAL Login test 1. public class LoginTest { 2. private WebDriver driver; 3. private void assertSignedUp() { 4. new WebDriverWait(driver, 30000).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(" .header-avatar"))); } 5. @Test 6. public void loginTest() { 7. HomePage homePage = new HomePage(driver); 8. homePage.login(); 9. assertSignedUp(); }}
  • 50. 50CONFIDENTIAL Implementation is based on • Reflection • Annotation • Templates
  • 51. 51CONFIDENTIAL HMTL Elements framework from Yandex - info 1. Official site of the tool 2. Examples 3. Source code example 4. Book with a brief summary of Selenium WebDriver plus Java bindings (Ru only)
  • 52. 52CONFIDENTIAL Selenide Selenide is a wrapper for Selenium Webdriver, oriented, as Geb, on fast and laconic automation but using Java. Just focus on your business logic and let Selenide do the rest! Main advantages of that tool: 1. Concise fluent API for tests 2. True Page Objects
  • 53. 53CONFIDENTIAL Selenide 1. Webdriver access 2. jQuery style selectors 3. Ajax support for stable tests 4. Auto-start and browser destructions 5. You don't need to think how to shutdown browser, handle timeouts and StaleElement Exceptions or search for relevant log lines, debugging your tests.
  • 54. 54CONFIDENTIAL Login Page 1. public class LoginPage { 2. private static final By USERNAME_INPUT = By.id("id_username"); 3. private static final By PASSWORD_INPUT = By.id("id_password"); 4. private static final By LOGIN_BUTTON = By.id("main_action_form_button"); 5. public void login(String username, String password) { 6. $(USERNAME_INPUT).val(username); 7. $(PASSWORD_INPUT).val(password); 8. $(LOGIN_BUTTON).click(); 9. }}
  • 56. 56CONFIDENTIAL Home Page 1. public class HomePage { 2. private static final By LOGIN_BUTTON = By.cssSelector("a[href*="login"]"); 3. public void login() { 4. login(Creds.username, Creds.password); } 5. private LoginPage clickLoginButton() { 6. $(LOGIN_BUTTON).click(); 7. return page(LoginPage.class);} 8. private void login(String username, String password) { 9. LoginPage loginPage = clickLoginButton(); 10. loginPage.login(username, password); }}
  • 58. 58CONFIDENTIAL Login test public class LoginTest { private HomePage homePage; private void assertSignedUp() { $(By.cssSelector(".header-avatar")).waitUntil(Condition.visible, 30000); } @BeforeMethod public void setup() { Configuration.timeout = 10000; homePage = open("https://www.pandadoc.com/", HomePage.class); } @Test public void loginTest() { homePage.login(); assertSignedUp(); } }
  • 60. 60CONFIDENTIAL Implementation is based on • Reflection • Annotation • Templates
  • 61. 61CONFIDENTIAL Selenide - info 1. Official site of the tool 2. Examples 3. Source code example 4. Book with a brief summary of Selenium WebDriver plus Java bindings (Ru only)
  • 62. 62CONFIDENTIAL GDI – from EPAM Systems JDI Goals 1. Accumulate best practices of UI automation (open source, page objects, logging, parallelism etc.) 2. Multiplatform framework 3. Intuitive test framework 4. Stable framework 5. Flexible framework
  • 63. 63CONFIDENTIAL GDI features • Interfaces based elements • Complex UI Objects • Simple + Complex UI elements + standard Forms = 31 • Cascade UI Objects Initialization • Multiplatform • Logging for all actions • Stabilization mechanism • Wide Customization abilities • Module-based architecture • Parallel test runs support
  • 64. 64CONFIDENTIAL PageObject “infrastructure” UI Objects – UI elements for Web (Button, Label, Table…) – IU elements for other platforms (any UI) – “Standard” PageObjects • Form • Search • Pagination • Login • others Page Objects – UI elements – Actions with UI elements
  • 65. 65CONFIDENTIAL Simple UI Elements – 10 1. Text 2. Button/Label 3. Link 4. Image 5. Checkbox 6. TextField 7. DatePicker 8. FileInput 9. TextArea 10. And others :)
  • 66. 66CONFIDENTIAL Complex UI Elements – 12 • Selector • RadioButtons • Dropdown • Tabs/Menu • CheckList • DropList • ComboBox • TextList • Table • Tree • Range • And others :)
  • 67. 67CONFIDENTIAL Standard Pages - 9 • Page • Section • Form • Pop • PopupForm • Search • Pagination • NavigationPane
  • 68. 68CONFIDENTIAL PageObject std example, 1 (GDI) @JPage(url = "http://www.epam.com") public class JacketPage extends WebPage { @FindBy(css=“someSelector") public Menu menu; @FindBy(css="someSelector") public CheckList sizes; @FindBy(css=" someSelector") public Button searchButton; @FindBy(css=" someSelector") public Table results; }
  • 69. 69CONFIDENTIAL Test std example, 1 (GDI) 1. @Test 2. public void menuTest() { 3. menu.select("Man"); 4. sizes.check("M", "L"); 5. searchButton.click(); 6. Assert.areEquals(results.rows().count(), 4); 7. Assert.isNotEmpty(results.row("Best Jacket", column("Title"))); 8. }
  • 70. 70CONFIDENTIAL PageObject std example, 1 (Selenium) public class JacketPage { @FindBy(css="") public List<WebElement> menuElements; @FindBy(css="") public WebElement menuIsSelected; @FindBy(css="") public List<WebElement> sizesElements; @FindBy(css="") public WebElement sizesIsChecked; @FindBy(css="") public List<WebElement> sizesLabels; @FindBy(css="") public WebElement searchButton; @FindBy(css="") public List<WebElement> resultsColumnHeaders; @FindBy(css="") public List<WebElement> resultsRowsHeaders; @FindBy(css="") public List<WebElement>resultsCellsHeaders; @FindBy(css="") public List<WebElement> resultsColumn; @FindBy(css="") public List<WebElement> resultsRow; … }
  • 71. 71CONFIDENTIAL PageObject std example, 1 (Selenium) public class JacketPage { @FindBy(css="") public List<WebElement> menuElements; ... @FindBy(css="") public List<WebElement> resultsRow; public void selectElementFromMenu(String name) { … } public String getSelectedMenuItem() { … } public boolean isMenuItemSelected(String name) { … } public void selectElementFromMenu(String name) { … } … public int getResultsCount() { … } public boolean isResultPresent(String name) { … } public WebElement getSomeAttributeForResult(String name) { … } … public List<WebElement> findAllResultsMatch(String name) { … } }
  • 72. 72CONFIDENTIAL PageObject std example, 2 (GDI) 1. @JPage(url = "/login", title = "EPAM - Login page") 2. public class LoginPage extends PageForm { 3. @FindBy(css = “.login”) private ITextField login; 4. @FindBy(css = “.password”) private ITextField password; 5. @FindBy(css = “.loginButton”) private IButton loginButton; 6. }
  • 73. 73CONFIDENTIAL Test std sexample, 2 (GDI) 1. @Test 2. public void exampleTest(String searchText) { 3. loginPage.login(client); 4. searchPage.search(searchText); 5. resultsPage.results.eachContains(searchText); 6. resultsPage.openFirstResult(); 7. productPage.check.productHasNoEmptyData(); 8. }
  • 74. 74CONFIDENTIAL Test std example, 3 (GDI) @Test public void shopTest() { loginPage.open(); loginForm.login(new User(“user", "password")); search.find("best jacket"); productForm.submit(Products.TestJacket); pagination.next(); pagination.selectPage(5); }
  • 75. 75CONFIDENTIAL PageObject std example, 4 (GDI, “model” based) 1. public class LoginForm extends Form<User> { 2. @FindBy(css=“someLocator") 3. public TextField name; 4. @FindBy(css=“someLocator") 5. public TextField password; 6. @FindBy(css=“someLocator") 7. public Button loginButton; 8. }
  • 76. 76CONFIDENTIAL PageObject std example, 4 (GDI , “model” based) public class User { public String name; public String password; public User(String name, String password) { this.name = name; this.password = password; } }
  • 77. 77CONFIDENTIAL PageObject std example, 5 (GDI) 1. @JSite(domain = "https://www.epam.com") 2. public class EpamSite extends WebSite { 3. @JPage(url = "/") 4. public static HomePage homePage; 5. @JPage(url = "/careers", title = "Careers") 6. public static CareerPage careerPage; 7. @JPage(url = "/careers/job-listings", title = "Job Listings", 8. urlCheckType = CONTAIN, titleCheckType = CONTAIN) 9. public static JobPage jobPage; 10.... 11.} WebSite.init(EpamSite.class);
  • 78. 78CONFIDENTIAL “Forms” Page Object (GDI) 1. public class AddCVForm extends Form<Attendee> { 2. @FindBy(css = “.first-name“) private ITextField name; 3. @FindBy(css = “.last-name“) private ITextField lastName; 4. @FindBy(css = “.email“) private ITextField email; 5. @FindBy(css = “.file-upload“) private RFileInput cv; 6. @FindBy(css = “.comment-input“) private ITextArea comment; 7. @FindBy(xpath = “//*[.='Submit']“) private IButton submit; 8. @FindBy(xpath = “//*[.='Cancel']“) private IButton cancel; 9. }
  • 79. 79CONFIDENTIAL Entities driven testing (GDI) @Test(dataProvider = “attendees”) public void menuTest(Attendee attendee) { searchFilter.fill(attendee); checkSuggestionsContains(attendee); searchFilter.search(attendee); assertEquals(results.rows().count(), 1); results.row(attendee.name, column(“Name”)) addCVForm.submit(attendee.cv); checkCVInDB(attendee.cv); previewForm.verify(attendee); }
  • 80. 80CONFIDENTIAL Java examples public class HomePage extends WebPage { @FindBy(css="div.tabs-ui[data-path*= '/content/epam/en/jcr:content/content_container/ section_4/section-par/tabs']") public EpamCoreSection epamCoreSection; }
  • 81. 81CONFIDENTIAL Java examples public class EpamCoreSection extends Section { @FindBy(css="div.tab-1>div.text>div.text-ui >p>span.font-size-26") public Text whoWeAreText; @FindBy(css="div.tab-2>div.text>div.text-ui >p>span.font-size-26") public Text whatWeDoText; @FindBy(css="div.tab-3>div.text>div.text-ui >p>span.font-size-26") public Text whoWeServeText; @FindBy(xpath="//div[.='Who we serve']") public Button whoWeServe; @FindBy(xpath="//div[.='Who we are']") public Button whoWeAre; @FindBy(xpath="//div[.='What we do']") public Button whatWeDo; }
  • 82. 82CONFIDENTIAL Java examples @Test public void presentationSimpleTest() { homePage.checkOpened(); homePage.epamCoreSection.whoWeAre.highlight(); homePage.epamCoreSection.whoWeAreText.highlight(); new Check("Tab text").areEquals("" + "We are more than developers. We are the experts that will take your business into the digital future.", homePage.epamCoreSection.whoWeAreText.getText()); homePage.epamCoreSection.highlight(); homePage.epamCoreSection.whoWeServe.highlight(); homePage.epamCoreSection.whoWeServe.click(); }
  • 83. 83CONFIDENTIAL Java examples @Test public void presentationComplexTest() { homePage.checkOpened(); textToTest(HomeTabs.WHATWEDO, homePage.epamCoreSection); textToTest(HomeTabs.WHOWEARE, homePage.epamCoreSection); textToTest(HomeTabs.WHOWESERVE, homePage.epamCoreSection); }
  • 84. 84CONFIDENTIAL Java examples public void textToTest(HomeTabs tab, EpamCoreSection epamCoreSection){ switch (tab) { case WHOWEARE: chooseTab(epamCoreSection.whoWeAre, epamCoreSection.whoWeAreText, HomeTabsTextToCheck.WHOWEARE); break; case WHATWEDO: chooseTab(epamCoreSection.whatWeDo, epamCoreSection.whatWeDoText, HomeTabsTextToCheck.WHATWEDO); break; case WHOWESERVE: chooseTab(epamCoreSection.whoWeServe, epamCoreSection.whoWeServeText, HomeTabsTextToCheck.WHOWESERVE); break; } }
  • 85. 85CONFIDENTIAL Java examples public void chooseTab(Button tab, Text text, String textToCheck){ tab.highlight(); tab.click(); text.highlight(); new Check("Tab text").areEquals(textToCheck, text.getText()); }
  • 86. 86CONFIDENTIAL Java examples public static class HomeTabsTextToCheck { public static final String WHOWEARE="We are more than developers." + " We are the experts that will take your business into the digital future."; public final static String WHATWEDO="We transform businesses through the art of digitization." + " Our expertise spans multiple disciplines," + " providing our clients with software solutions that dramatically drive results and outcomes."; public final static String WHOWESERVE="The right technology translates business strategies into results." + " We deliver domain-specific, transformative software solutions that reshape the way you do business."; }
  • 87. 87CONFIDENTIAL Customization 1. Customize method’s behavior 2. Customize element’s behavior 3. Customize all objects behavior 4. Develop new UI element 5. Modules 1. Logger 2. Asserter 3. Driver 4. etc.
  • 90. 90CONFIDENTIAL Implementation is based on Implementation is based on … what? Let’s: • download source code • familiarize • investigate • develop a tiny prototype • try to use • try to improve (for example, add Decorator DP based features) • welcome to QA Automation tools development • welcome to Open Source
  • 91. 91CONFIDENTIAL JDI - info • http://jdi.epam.com/ • http://jdi.epam.com/download • https://github.com/epam/JDI/tree/master/Java/Tests • https://github.com/epam/JDI/tree/master/Java • https://github.com/epam/JDI/tree/master/C%23.Net/Tests • https://github.com/epam/JDI/tree/master/C%23.Net • IT-Saturday video (Ru only) • “JDI - EPAM Framework (IT-Subbotnik, with listings).pptx” (RU) • “JDI - QA Conf 2016.pptx” (Ru) • “JDI – Secon 2016.pptx” (EN)
  • 92. 92CONFIDENTIAL Serenity (ex. Thucydides) 1. Serenity (Thucydides) – is an open-source tool, oriented on effective acceptance testing and detailed documentation and reports of the project. 2. It works with Junit and BDD tools like JBehave and Cucumber-JVM, and gives a wide API for automated testing with integrity with Selenium Webdriver. 3. It is made for the following tasks: • Creating more flexible tests, which are easier to be supported • Getting illustrated story-based reports • Clear context of connection between tests and requirements • Measurement of requirements coverage.
  • 93. 93CONFIDENTIAL Serenity (ex. Thucydides) workflow • Step 1: Defining requirement and acceptance criteria It starts from requirements, which are need to be tested. For every requirement there is an acceptance criteria which describing the requirement better. Thucydides automate acceptance criteria • Step 2: Modelling the requirements With the help of Thucydides you create a simple model of requirements made on Java language. There are some ways of modelling requirements, including simple Java class, using convention and structure of directories of integrating with other tools like Jira. That approach allows the developer what requirement is tested each of the test, and give Thucydides the ability to track testing features and requirements
  • 94. 94CONFIDENTIAL Serenity (ex. Thucydides) workflow • Step 3: Automation of acceptance testing Next is describing acceptance criteria by business language is following, and automation engineers implement them using BDD such as jBehave or Cucumber-JVM, or using Java and Junit, in order for Thucydides to run it with “pending” status (body is not implemented) • Step 4: Test implementation Automation Engineers now can implement acceptance criteria in a form of real-time AUT test. Tests can be divided into steps for better readability and easiness of support. Webdriver is used for testing.
  • 95. 95CONFIDENTIAL Serenity (ex. Thucydides) workflow • Step 5: Test results report Thucydides allow you to create detailed test reports about test runs, including: History for ach test Screenshot for each test step Result of test run including time and error messages • Step 6: Requirements coverage report Besides test run reports, Thucideds also provide information about: Number of tested requirements Number of passed requirements Number of requirements which need to be run
  • 96. 96CONFIDENTIAL Serenity (ex. Thucydides) workflow • Step 7: Project progress report Thucydides provide information about project history progress: Change in number of features implemented in time Change in quantity of implemented and tested features in time Change of failed tests in time • Summary As we can see, Thucydides is a rather complex tool, build around BDD concept and acceptance testing, using Webdriver for testing web applications. • Info Official website Official documentation
  • 97. 97CONFIDENTIAL Page Object And what about Page Object supports …?
  • 98. 98CONFIDENTIAL Page Object “default” implementation Framework implements Page Object pattern and let’s you decrease code duplication another one type of classes between tests and pages, called “steps”. Let’s look at “steps” with page object class: 1. public class StepsinBook extends ScenarioSteps { 2. public StepsinBook(Pages pages) { 3. super(pages); 4. } 5. public BookPage getPageBook() 6. { 7. return getPages().currentPageAt(BookPage.class); 8. } 9. }
  • 99. 99CONFIDENTIAL Page Object “default” implementation 1. public class StepsinBook extends ScenarioSteps { 2. @Step public void getMain(String url) 3. { 4. getPageBook().getMainPage(url); 5. } 6. @Step public void AllBooks() 7. { 8. getPageBook().allBooks(); 9. } 10. @Step public void search(){ 11. getPageBook().search(“Book"); 12. } 13. @Step public void catalog(){ 14. getPageBook().catalog(); 15. }}
  • 100. 100CONFIDENTIAL Page Object “default” implementation 1. public class BookPage extends PageObject { 2. @FindBy(linkText = “All books") 3. WebElement allbooksButton; 4. @FindBy(linkText = “Search") 5. WebElement searchButton; 6. @FindBy(name = "query") 7. WebElement searchField; 8. @FindBy(css = "button") 9. WebElement searchBegin; 10. }
  • 101. 101CONFIDENTIAL Page Object “default” implementation 1. public class BookPage extends PageObject { 2. public BookPage(WebDriver driver) { 3. super(driver); 4. } 5. public void getMainPage(String url) { 6. getDriver().get(url); 7. } 8. public void allBooks() { 9. allbooksButton.click(); 10. } 11. public void search(String searchWord) { 12. searchButton.click(); 13. searchField.sendKeys(searchWord); 14. searchBegin.click(); 15. } 16. }
  • 102. 102CONFIDENTIAL Implementation is based on • Reflection • Annotation • Templates
  • 103. 103CONFIDENTIAL Geb – general info 1. Tool for browser automation, made on Groovy (JVM-based) and based on Selenium Webdriver. 2. It using: 1. Selenium for browser automation 2. jQuery selectors for locating elements 3. Page object pattern . 3. In the bounds of testing it can be easily integrated with different test frameworks like: 1. Junit 2. TestNG 3. Spock
  • 104. 104CONFIDENTIAL Geb – general info If to compare with Webdriver API, Geb provides more comfortable interface in the following areas: • Working with Webdriver instance (creating, configuration, moves, destruction) • Locating elements (jQuery locators) • Page object pattern • Waiters • Page interactions • Work with AJAX elements • Integration with build-tools (maven, gradle, grails) • Integration with cloud services (Sauce labs, Browser Stack) Official website Official documentation
  • 105. 105CONFIDENTIAL Geb - example 1. import geb.Browser 2. Browser.drive { 3. go "http://myapp.com/login" 4. assert $("h1").text() == "Please Login" 5. $("form.login").with { 6. username = "admin" 7. password = "password" 8. login().click() 9. } 10. assert $("h1").text() == "Admin Section" 11.}
  • 106. 106CONFIDENTIAL SWD Page Recorder 1. SWD Page Recorder helps you to create locators of web-page, debug them in the application and generate PageObject code for classes on C#, Java, Python, Ruby, Perl for using them in Selenium Webdriver tests. 2. That tool not only lets you find locator needed, but also optimize it and generate all the code needed for further element declaration in the code. 3. SWD Page Recorder is a unified tool for working with locators in every browser which are supported by Selenium. 4. Important moment that Page Recorder tests the selectors using Webdriver – so you’re not going to have cases when locator find other way will not work in Webdriver.
  • 107. 107CONFIDENTIAL SWD Page Recorder Sources, documentation and so on
  • 108. 108CONFIDENTIAL How to select an appropriate solution?
  • 109. 109CONFIDENTIAL 1. Business context 2. Tech context – Challenge – Solution – Technology Stack 3. QA Automation process context 4. Source code example 5. Summary A real-life example
  • 110. 110CONFIDENTIAL 1. Example and “home work” – How to setting up environment • This is task 0  – Where to download (https://github.com/comaqaby/Patterns/tree/master/C%23) – How to build – How to configure – How to run Example
  • 111. 111CONFIDENTIAL 1. Download example’ source code (for each “solution”) 2. “Investigate” 3. Develop a TODO list with a set of improvements 4. Setting up environment 5. Compile and Run 6. “Play” 7. Improve Update TODO list with a set of improvements “Homework”, part 1 
  • 112. 112CONFIDENTIAL 1. Read recommended books and articles 2. Improve Update TODO list with a set of improvements 3. Provide me via email with an intermediate and final list of improvements 4. Develop at least 1 more auto-test (for each “solution”) 5. Develop a set of metrics to “compare” solutions 6. Develop an algorithm “How to select a proper solution” 7. Provide me via email with a set of metrics + algorithm 8. Next iteration  “Homework”, part 2 
  • 113. 113CONFIDENTIAL 1. Play with GDI “attentively” 2. Join QA Automation tools development 3. Join Open Source “world” “Homework”, part 3 
  • 114. 114CONFIDENTIAL 1. Could you please “refresh” your theoretical knowledge, slides 1-31, thanks “Rules” and principles
  • 115. 115CONFIDENTIAL 1. Martin Fowler “Refactoring” – http://martinfowler.com/books/refactoring.html – http://refactoring.com/ – http://refactoring.com/catalog/ – http://refactoring.com/catalog/replaceConditionalWithPolymorphism.html Useful links
  • 116. 116CONFIDENTIAL 1. Refactoring to Patterns and vice versa – https://industriallogic.com/xp/refactoring/ – https://industriallogic.com/xp/refactoring/catalog.html – https://industriallogic.com/xp/refactoring/conditionDispatcherWithCommand.html – https://industriallogic.com/xp/refactoring/conditionalWithStrategy.html – http://martinfowler.com/books/r2p.html Useful links
  • 117. 117CONFIDENTIAL 1. https://sourcemaking.com/ – https://sourcemaking.com/refactoring – https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism – https://sourcemaking.com/design_patterns – https://sourcemaking.com/antipatterns • https://sourcemaking.com/antipatterns/software-development-antipatterns • https://sourcemaking.com/antipatterns/software-architecture-antipatterns – https://sourcemaking.com/uml Useful links
  • 118. 118CONFIDENTIAL Tech “basement” • Grady Butch «Object oriented analysis and design with examples of apps on C++ Notes: IMHO No need to be afraid of C++, 95% of the material is conceptual, there is no strict connection to chosen language. From my point of view is one of the best books for true getting to know with OOP. • Martin Fowler «Refactoring» Notes: IMHO strongly recommend to read from cover to cover, twice, in order to have contents of the book – you active professional luggage. • Gang of four “Design patterns” Notes: IMHO strongly recommend to read from cover to cover, twice, in order to have contents of the book – you active professional luggage.
  • 119. 119CONFIDENTIAL Tech “basement” • D. Thomas, Andrew Hunt “Pragmatic Programmer, The: From Journeyman to Master” Notes: IMHO Amazing book that consists of a ton of advices. IMHO strongly recommend to read from cover to cover, twice, in order to have contents of the book – you active professional luggage. And then look through different chapters before talking to a customer. • Steve McConnel “Code complete” Notes: IMHO No need to be afraid of the size of the book ... it should be read or before “going to bed”, or from any place, of separate chapters, just to fresh things in the memory in the chosen f ield of problem.
  • 120. 120CONFIDENTIAL What’s next?! • “Out of box Page Object Design Pattern, Java” • Dynamic solutions • Let’s compare with a static one • “Out of box Page Object Design Pattern, .Net C#” • Dynamic solutions • Let’s compare with a static one Summary: 5/12 - Webinar, 5/13 – send all necessary materials • “Variants of implementation Page Object Design Pattern from the scratches, without being bind to any programming language” • Static solutions • Dynamic solutions • Let’s compare static and dynamic • Answer to all our questions Summary: 5/19 - Webinar, 5/19 – send all necessary materials
  • 121. 121CONFIDENTIAL Anton_Semenchenko@epam.com Skype - semenchenko_anton_v +375 33 33 46 120 +375 44 74 00 385 https://www.linkedin.com/in/anton-semenchenko-612a926b https://www.facebook.com/semenchenko.anton.v https://twitter.com/comaqa www.comaqa.by www.corehard.by
  • 122. 122CONFIDENTIAL Thanks for your attention Anton Semenchenko EPAM Systems www.comaqa.by www.corehard.by