Creating Selenium test cases can result in an unmaintainable
project. One of the reasons is that too many duplicated code is used.
Duplicated code could be caused by duplicated functionality and this will
result in duplicated usage of locators. The disadvantage of duplicated code is
that the project is less maintainable. If some locator will change, you have to
walk through the whole test code to adjust locators where necessary. By using
the page object model we can make non-breakable test code and reduce or
eliminate duplicate test code. Beside of that it improves the readability and
allows us to create interactive documentation. Last but not least, we can
create tests with less keystroke. An implementation of the page object model can
be achieved by separating the abstraction of the test object and the test
scripts.
Steps to
follow:
1. Create a ‘New Package’ file and name it
as ‘pageObjects’, by right click on the Project and
select New > Package. We will be creating
different packages for Page Objects, Utilities, Test Data, Test Cases and
Modular actions. It is always recommended to use this structure, as it is easy
to understand, easy to use and easy to maintain.
2.
Create a ‘New Class’ file and refer the
name to the actual page from the test object, by right click on the above
created Package and select New > Class. In our case it is Login Page and Home Page.3. Now create a Static Method for each Element (Object) in the Login Page. Each method will have an Argument (driver) and a Return value (element).
package pageObjects;
import
org.openqa.selenium.By;
import
org.openqa.selenium.WebDriver;
import
org.openqa.selenium.WebElement;
public class Login_Page {
private static WebElement element = null;
public static WebElement
txtbx_UserName(WebDriver driver){
element = driver.findElement(By.id("TxtEmail"));
return element;
}
public static WebElement
txtbx_Password(WebDriver driver){
element = driver.findElement(By.id("TxtPassword"));
return element;
}
public static WebElement
btn_Login(WebDriver driver){
element = driver.findElement(By.id("BtnLogin"));
return element;
}
}
Driver
is being passed as an Argument
so that Selenium is able to locate the element on the browser (driver).Element is returned, so that an Action can be performed on it.
Method is declared as Public Static, so that it can be called in any other method without instantiate the class.
Follow the same rule for creating Home Page class.
package pageObjects;
import
org.openqa.selenium.By;
import
org.openqa.selenium.WebDriver;
import
org.openqa.selenium.WebElement;
public class Home_Page {
private static WebElement element = null;
public static WebElement
btn_Paybills(WebDriver driver){
element =
driver.findElement(By.id("aBillListToPay"));
return element;
}
public static WebElement
lnk_LogOut(WebDriver driver){
element =
driver.findElement(By.xpath("//*[@id='divHeader']/UL[1]/LI[1]/UL[1]/LI[3]/A[1]"));
return element;
}
}
4. Create a ‘New
Class‘ and name it
as PageObjectModel
by right click on the ‘automationFramework‘ Package and select New > Class.
We will be creating all our test cases under this package.
package automationFramework;
import
java.util.concurrent.TimeUnit;
import
org.openqa.selenium.WebDriver;
import
org.openqa.selenium.firefox.FirefoxDriver;
import pageObjects.Home_Page;
import pageObjects.Login_Page;
public class PageObjectModel {
private static WebDriver driver = null;
public static void main(String[] args)
{
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10,
TimeUnit.SECONDS);
driver.get("ApplicationURL");
// Use page Object library now
Login_Page.txtbx_UserName(driver).sendKeys("testuser_1@gmail.com");
Login_Page.txtbx_Password(driver).sendKeys("Test@123");
Login_Page.btn_Login(driver).click();
System.out.println(" Login
Successfully.");
Home_Page.btn_Paybills(driver).click();
Home_Page.lnk_LogOut(driver).click();
driver.quit();
}
}
You will notice that once you type Login_Page in your test
script and the moment you press dot, all the methods in the Login Page will be displayed.
We can expose methods in order to reduce duplicated code. We are able to call
these method multiple times. This will ensure a better maintainable test code,
because we only have to make adjustments and improvements in one particular
place.
No comments:
Post a Comment