Common Design Patterns every Test Automation Engineer should know

In software design, design patterns are created to solve common problems. This doesn’t seem to be widely discussed in software automation, because the topic sounds complicated. There are sophisticated design patterns used to solve complex issues in software development. Also there are easy to understand and easily adoptable design patterns that can significantly improve readability and maintainability of our test automation code. In this article, you will see complete details of Page Object Model (POM) design pattern with Page Factory in selenium with practical examples.
Page Object Model
POM is a design pattern which has become popular in Selenium Test Automation. It is a widely used design pattern in Selenium for enhancing test maintenance and reducing code duplication. To get started with POM, I would like to take you through the following basic example.



What’s your first name?
Login
Last name?
Page Object
Tell us more about your family
Everyone from my family is a page Object.
Each of us knows everything about a page.
The page that I specialize in is the login page.
My brother, Result Page Object Knows about the results page.
And our sister, Detail Page Object is the expert on details page.

What makes you an expert in login pages?
I know a lot about login page, I know the info that makes the page unique, the title and url.
I also know about elements of the login page, their values and attributes. And my knowledge does not end at login page information.
I can tell this information to anyone interested in it. Just the other day, someone from the unit tests family asked about these details.

Awesome. What else do you know about the login page?
I know what can be done on a page.
Like clicking links, typing in a textbox, selecting values in a listbox. And to see what an expert I am, I can even do these things on behalf of others.
The same unit test that asked the other day about the page title and url wanted more things from me.

Such as…
First let me tell you his name. It is testThatLoginWorks. Weird name, isn’t it?
So, he wanted me to type some text in the username textbox.
Then, to type other text in the Password textbox. And finally, to click the login button. I did so many things for him.
That was a busy day for me.

So you know many things about the login page. Do you know about other pages as well?
Login page is the only thing that I know of.
About other pages, you should talk to the other members of the Page Object family.
My brother, my sister and the everybody else.
Each of them is an expert in one page as well.


Excellent. Can you summarize for our audience what you do best?
I am the number 1 expert in login page.
I know all the information about the login page and its elements. I also know everything that can happen on a login page.
And I can even do these things when asked nicely. I am a Page Object.
Thank you very much!
Consider the below example of simple selenium script which has applied POM concept.
public class GmailLoginPage {
WebDriver driver;
By userName = By.name("uid");
By password = By.name("password");
By login = By.name("btnLogin");
public GmailLoginPage (WebDriver driver){
this.driver = driver;
}
//Set user name in textbox
public void setUserName(String strUserName){
driver.findElement(userName).sendKeys(strUserName);
}
//Set password in password textbox
public void setPassword(String strPassword){
driver.findElement(password).sendKeys(strPassword);
}
//Click on login button
public void clickLogin(){
driver.findElement(login).click();
}
/**
* This POM method will be exposed in test case to login in the application
* @param strUserName
* @param strPasword
*/
public void loginToGmail(String strUserName, String strPasword){
//Fill user name
this.setUserName(strUserName);
//Fill password
this.setPassword(strPasword);
//Click Login button
this.clickLogin();
}
Why POM should be used?
Here are the main advantages of Page Object Pattern using:
- Easy to Maintain
- Easy Readability of scripts
- Reduce or Eliminate duplicate
- Reusability of code
- Reliability
Page Factory Model
Page Factory is an inbuilt Page Object Model concept for selenium webdriver but it is optimized. Using Page Factory under test file, you can access these page objects in other java file. Used annotations @FindBy to find WebElement and initElements method to initialize web elements. Consider the below example of simple selenium script which has applied Page Factory concept.
public class GmailLoginPage {
/**
* All WebElements are identified by @FindBy annotation
*/
WebDriver driver;
@FindBy(name="uid")
WebElement userName;
@FindBy(name="password")
WebElement password;
@FindBy(name="btnLogin")
WebElement login;
public GmailLoginPage(WebDriver driver){
this.driver = driver;
//This initElements method will create all WebElements
PageFactory.initElements(driver, this);
}
//Set user name in textbox
public void setUserName(String strUserName){
userName.sendKeys(strUserName);
}
//Set password in password textbox
public void setPassword(String strPassword){
password.sendKeys(strPassword);
}
//Click on login button
public void clickLogin(){
login.click();
}
/**
* This POM method will be exposed in test case to login in the application
* @param strUserName
* @param strPasword
*/
public void loginToGmail(String strUserName, String strPasword){
//Fill user name
this.setUserName(strUserName);
//Fill password
this.setPassword(strPasword);
//Click Login button
this.clickLogin();
}
}
References
What is the page object in Selenium?
Design Patterns In Test Automation World
Page Object Model (POM) & Page Factory: Selenium WebDriver Tutorial