Menu

Patterns

Michael Bulla

Until now we described just Webelements on pages. But maybe you want to add some more value to your PageObjectws

add valuable methods to locator-methods

:::java
@Page(name="Login")
public abstract class LoginPO {
  @PageAccessor(uri="login.html")
  public abstract void open();

  public void doLogin(String username, String password) {
    usernameTextbox().type(username);
    passwordTextbox().type(password);
    submitLoginButton().click();
  }

  @Locator(name="Username", xpath="//input[@name='username']")
  public abstract ITextBox usernameTextbox();

  @Locator(name="Password", xpath="//input[@name='password']")
  public abstract ITextBox passwordTextbox();

  @Locator(name="Login Submit", cssSelector=".submitLoginButton")
  public abstract IButton submitLoginButton();
}

replace locator-methods by valuable methods

:::java
@Page(name="Login")
public abstract class LoginPO {
  @PageAccessor(uri="login.html")
  public abstract void open();

  public void doLogin(String username, String password) {
    usernameTextbox().type(username);
    passwordTextbox().type(password);
    submitLoginButton().click();
  }

  @Locator(name="Username", xpath="//input[@name='username']")
  abstract ITextBox usernameTextbox();

  @Locator(name="Password", xpath="//input[@name='password']")
  abstract ITextBox passwordTextbox();

  @Locator(name="Login Submit", cssSelector=".submitLoginButton")
  abstract IButton submitLoginButton();
}

Locator-methods are now package-private, so only valuable methods are visible in your tests

separate Locators from POs

:::java

@Page(name="Login")
public abstract class LoginPO implements LoginLocator {
  public void doLogin(String username, String password) {
    usernameTextbox().type(username);
    passwordTextbox().type(password);
    submitLoginButton().click();
  }
}

public interface LoginLocator {
  @PageAccessor(uri="login.html")
  void open();

  @Locator(name="Username", xpath="//input[@name='username']")
  ITextBox usernameTextbox();

  @Locator(name="Password", xpath="//input[@name='password']")
  ITextBox passwordTextbox();

  @Locator(name="Login Submit", cssSelector=".submitLoginButton")
  IButton submitLoginButton();
}

separate Locators from POs and make Locators not visible

:::java

@Page(name="Login")
public abstract class LoginPO implements LoginLocator {
  public void doLogin(String username, String password) {
    usernameTextbox().type(username);
    passwordTextbox().type(password);
    submitLoginButton().click();
  }
}

public abstract class LoginLocator {
  @PageAccessor(uri="login.html")
  public abstract void open();

  @Locator(name="Username", xpath="//input[@name='username']")
  abstract ITextBox usernameTextbox();

  @Locator(name="Password", xpath="//input[@name='password']")
  abstract ITextBox passwordTextbox();

  @Locator(name="Login Submit", cssSelector=".submitLoginButton")
  abstract IButton submitLoginButton();
}

Related

Wiki: Home

MongoDB Logo MongoDB