This Comprehensive Tutorial on Keyword Driven Framework Explains Various Components of the Framework & How to Create One in Selenium:
In general, Framework is a set of guidelines, which when followed will give beneficial results.
The Keyword-Driven framework is a technique to externalize keywords/actions that are used in the script in a separate Object Repository (here, it is a Java Class file), which will give positive outcomes like increased code-reusability, reduced script maintenance, and higher portability.
=> Take A Look At The Selenium Beginners Guide Here.
Table of Contents:
What Is A Keyword Driven Framework In Selenium?
Here are the Video Tutorials:
Keyword Driven Framework – Plan & Design
Creation of Keyword Driven Framework Part – I
Creation of Keyword Driven Framework Part – II
Components Of Keyword Driven Testing Framework
Given below are the list of components that are involved in the Keyword Driven Framework.
- Function Library
- Excel Sheet to store Keywords
- Design Test Case Template
- Object Repository for Elements/Locators
- Test Scripts or Driver Script
#1) Function Library
This is usually a Java Class file where the Keywords are defined. In other words, all the actions that are performed on the application are defined as user-defined methods (which are keywords) in the library class file.
For Example:
Let us assume that our application has to perform the following actions in one or more test cases:
- Enter the URL.
- Click on an element.
- Type in a textbox.
Then, the library file is created by defining individual methods for all these actions as shown below:
Here, we are creating a user-defined method for the action – ‘Enter URL’.
The name provided for the user-defined method is called a Keyword.
So, here ‘enter_URL’ is the Keyword
public void enter_URL(WebDriver driver,String TestData) throws IOException { driver.get(TestData); }
Parameters:
driver – The driver is initialized in the Main Class and is passed in here.
TestData – is read from the external source by the Main Class and passed it in here.
Function:
Here, driver.get() – is the function of Selenium that performs the action ‘enter URL’.
Keywords.java
package Keywords.Defined; import java.io.File; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class Keywords { String path = System.getProperty("user.dir"); WebDriver driver; // driver object is declared //method for entering URL – Keyword is ‘enter_URL’ public void enter_URL(WebDriver driver,String TestData) throws IOException { driver.get(TestData); } //method for typing action – Keyword is ‘type’ public void type(WebDriver driver, String ObjectName, String locatorType, String testdata) { driver.findElement(this.getObject(ObjectName,locatorType)).sendKeys(testdata); } //method for click action – Keyword is ‘click’ public void click(WebDriver driver,String ObjectName, String locatorType) { driver.findElement(this.getObject(ObjectName,locatorType)).click(); } }
#2) Excel Sheet To Store Keywords
All the user-defined methods along with its functionality details should be mentioned in the excel sheet so that the user can understand what Keyword the library file holds.
Excel sheet acts as a summary for the library file and becomes useful while creating the test case template, where the user looks at the excel sheet keyword list and picks the corresponding Keyword for each action in the test case.
For Example:
package Keywords.Defined; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; public class Keywords { String path = System.getProperty("user.dir"); WebDriver driver; public void enter_URL(WebDriver driver,String TestData) throws IOException{ driver.get(TestData); } public void type(WebDriver driver, String ObjectName, String locatorType, String testdata) throws IOException{ driver.findElement(this.getObject(ObjectName,locatorType)).sendKeys(testdata); //driver.findElement(By.xpath("//")).sendKeys(testdata); } public void wait(WebDriver driver,String ObjectName, String locatorType) throws IOException{ WebDriverWait wait = new WebDriverWait(driver, 60); wait.until(ExpectedConditions.visibilityOf(driver.findElement(this.getObject(ObjectName,locatorType)))); } public void click(WebDriver driver,String ObjectName, String locatorType) throws IOException{ driver.findElement(this.getObject(ObjectName,locatorType)).click(); } public String get_currentURL(WebDriver driver){ String URL = driver.getCurrentUrl(); System.out.println("print URL "+URL); return URL; } By getObject(String ObjectName, String locatorType) throws IOException{ File file = new File(path+"\\Externals\\Object Repository.properties"); FileInputStream fileInput = new FileInputStream(file); Properties prop = new Properties(); //find by xpath if(locatorType.equalsIgnoreCase("XPATH")){ return By.xpath(prop.getProperty(ObjectName)); } //find by class else if(locatorType.equalsIgnoreCase("CLASSNAME")){ return By.className(prop.getProperty(ObjectName)); } //find by name else if(locatorType.equalsIgnoreCase("NAME")){ return By.name(prop.getProperty(ObjectName)); } //Find by css else if(locatorType.equalsIgnoreCase("CSS")){ return By.cssSelector(prop.getProperty(ObjectName)); } //find by link else if(locatorType.equalsIgnoreCase("LINK")){ return By.linkText(prop.getProperty(ObjectName)); } //find by partial link else if(locatorType.equalsIgnoreCase("PARTIALLINK")){ return By.partialLinkText(prop.getProperty(ObjectName)); } return null; } }
#3) Design Test Case Template
Test Case Template can be created according to project convenience. There is no particular rule to create a template. It is designed depending on how much the project needs the framework to externalize. The externalization might be only for Keywords, or sometimes even Test Data and UI Elements are also externalized.
A sample test case template is created:
In the given example, the template is created in such a way that:
- Each sheet corresponds to a Test Case and the last sheet is the one that holds the ‘Keywords list’.
- Each row corresponds to the test steps of a TC.
- Each Column is the parameters that are necessary for each action.
How to Fill in the Test Case Template:
#1) From the provided test case sheet, read each test case and its corresponding test steps. For each test step, locate the action and find the corresponding keyword from the library file.
#2) Once the action is matched with the keyword, fill in the test case template in the test case order and also pass the other required parameters as necessary.
#4) Object Repository For Locators
UI locator can be identified and its value can be either mentioned in the test case template or maintained in a separate Object Repository.
In the below example, the element identification properties
- Locator Type – The identification technique used is id, Xpath, ClassName, etc.
- Locator Value – Value of that attribute – For Example: If its Id attribute, then the value of id and so on.
Another way is to maintain in the Object Repository and mention the Object Name in the Excel Sheet.
- Locator Type – The identification technique used is id, Xpath, ClassName, etc.
- Locator Name –The name of the Object from the Object repository where the locator value is stored. For Example, If the repository holds the Xpath value of an element with the ObjectName as ‘Username’, then the LocatorName is mentioned as ‘UserName’.
NOTE: According to the LocatorType mentioned in the excel sheet, its value should be stored in the Object Repository. For Example: If Xpath is specified as LocatorType, then the Repository should store Xpath of that element, if the id is specified as Locatortype, then the id should be stored and so on.
#5) Test Scripts Or Driver Script
This is the main script that reads all the contents of the excel sheet and performs the corresponding action. The script is designed based on how the template is created.
In our case, as each test sheet acts as a test case and each row as a test step, the driver script can be created by iterating across sheets and then rows.
In each particular row, a keyword is read and its corresponding method in the library file is executed and so on. This continues until all the test steps in the test case are executed. Then, it proceeds to the next test case/sheet and executes it.
package Automation.KeywordFramework; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.LinkedList; import java.util.Properties; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.ie.InternetExplorerDriver; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Reporter; import org.testng.annotations.BeforeTest; import org.testng.annotations.Parameters; import org.testng.annotations.Test; import org.testng.asserts.Assertion; import Keywords.Defined.Assertions; import Keywords.Defined.Keywords; public class IrctcLogic { WebDriver driver; String path = System.getProperty("user.dir"); Keywords keyword = new Keywords(); Assertions assertion = new Assertions(); @Test public void readExcelandexecute() throws IOException, InterruptedException{ //From excelfile String excelFilePath = path+"\\Externals\\Test Cases.xlsx"; FileInputStream fileInputStream = new FileInputStream(excelFilePath); XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream); int testcasescount = workbook.getNumberOfSheets()-1; System.out.println("Total test cases :"+testcasescount); for (int testcase=0;testcase<testcasescount;testcase++){ System.setProperty("webdriver.chrome.driver", path+"\\Drivers\\chromedriver.exe"); driver = new ChromeDriver(); XSSFSheet worksheet = workbook.getSheetAt(testcase); System.out.println("worksheet Number "+testcase+":"+worksheet.getSheetName()); int row = worksheet.getLastRowNum(); int column = worksheet.getRow(1).getLastCellNum(); for(int i=1;i<=row;i++){ LinkedList<String> Testexecution = new LinkedList<>(); System.out.println('Row value :"+i+"It has first cell value as : "+worksheet.getRow(i).getCell(0)); for(int j=0;j<column-1;j++){ System.out.println("Column index :"+j); Cell Criteria = worksheet.getRow(i).getCell(j); String CriteriaText; if(Criteria==null){ CriteriaText = null; }else{ CriteriaText = Criteria.getStringCellValue(); } Testexecution.add(CriteriaText); } System.out.println("List :"+Testexecution); String TestStep = Testexecution.get(0); String ObjectName = Testexecution.get(1); String LocatorType = Testexecution.get(2); String Testdata = Testexecution.get(3); String AssertionType = Testexecution.get(4); String ExpectedValue = Testexecution.get(5); String ActualValue = Testexecution.get(6); perform(TestStep,ObjectName,LocatorType,Testdata,AssertionType,ExpectedValue,ActualValue); System.out.println("Row"+i+" is read and action performed"); } driver.close(); System.out.println("************************TEST CASE "+worksheet.getSheetName()+" is executed*******************"); } } public void perform(String operation, String objectName, String locatorType, String testdata, String assertionType, String expectedValue, String actualValue) throws IOException, InterruptedException { switch (operation) { case "enter_URL": //Perform click keyword.enter_URL(driver,testdata); break; case "get_currentURL": //Set text on control keyword.get_currentURL(driver); break; case "type": keyword.type(driver, objectName, locatorType, testdata); case "click": keyword.click(driver, objectName, locatorType); /* case "wait": keyword.wait(driver, objectName, locatorType);*/ case "implicitWait": Thread.sleep(8000); default: break; } if(operation.contains("AssertURL")){ switch(assertionType){ case "contains": assertion.AssertURLContains(driver, keyword.get_currentURL(driver), expectedValue); case "equals": assertion.AssertURLEquals(driver, keyword.get_currentURL(driver), expectedValue); } } if(operation.contains("AssertElement"){ assertion.AssertElement(driver, assertionType, objectName, locatorType); } } }
Conclusion
Thus, once a framework is created, it is re-usable for multiple test cases/projects. In this way, it reduces the man-hours of creating an automation script for each project.
In the next chapter, we will discuss the creation of the Hybrid driven framework which is a combination of the Keyword-Driven framework and the Data-Driven framework.
=> Read Through The Easy Selenium Training Series.