Design Test Automation Framework using Java, Selenium, TestNG, POM

Create a Test Automation Framework from scratch using Java, Selenium, TestNG, and the Page Object Model (POM) involves several steps. Here’s a guide to help you set up a robust framework:

Project Setup

  • Create a Maven Project:
  • Use an Integrated Development Environment (IDE) like IntelliJ IDEA or Eclipse.
  • Create a new Maven project to manage dependencies easily.

Add Dependencies

Add necessary dependencies in the pom.xml file.

 <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.23.0</version>
</dependency>


<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.10.2</version>
    <scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-chrome-driver -->
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-chrome-driver</artifactId>
    <version>4.23.0</version>
</dependency>

Project Structure

Organize your project directories as follows:

Session 1: Basic Set for Automation

Page Object Model (POM)
Create Page Classes: Each application page will have a corresponding Page class.

Example: HomePage.java

package com.carparkingautomation.page;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class HomePage {
 
 WebDriver driver;
 
 public HomePage(WebDriver driver) {
  
  this.driver =driver;
  PageFactory.initElements(driver, this);	
 }
 
 // Page Elements..
 
 @FindBy(xpath = "//a[contains(text(), 'Car Parking Management System')]")
 private WebElement headerHeading;
 
 
 @FindBy(xpath = "//a[contains(text(), 'Home')]")
 private WebElement homeLink;
 
 
 @FindBy(xpath = "//a[contains(text(), 'SignUp')]")
 private WebElement signUpLink;
 
 
 
 @FindBy(xpath = "//a[contains(text(), 'Login')]")
 private WebElement loginLink;
 
 @FindBy(xpath = "//h1[contains(text(), 'Student Car Parking Booking System')]")
 private WebElement bodyText;
 
 
 // Method..
 public void ClickToHomePage() {
  homeLink.click();
 }
 
 public String bodyHeadingText() {
  return bodyText.getText();
 }
 
 
 public String homeLinkText() {
  return homeLink.getText();
 }
 
 public String signUpLinkText() {
  return signUpLink.getText();
 }
 
 public String loginLinkText() {
  return loginLink.getText();
 }
 
 public String headerHeadingText() {
  return headerHeading.getText();
 }
 

}

Base Test Class

Create a Base Test Class: This class will handle common setup and teardown methods.

Example: BaseTest.java

package com.carparkingautomation.base;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;

public class BaseTest {
 
 public WebDriver driver;
 
 @BeforeClass
 public void setup() {
  
  System.setProperty("webdriver.chrome.driver", "Driver_Path");
  driver = new ChromeDriver();
  driver.manage().window().maximize();
  driver.get("http://localhost:8081/CarParkingMgt/");
  
 }
 
 @AfterClass
 public void teardown() {
  if(driver != null) {
   driver.quit();
  }
 }
 

}

Test Classes

Create Test Classes: Write test methods using TestNG annotations.

Example: HomeTest.java

package com.carparkingautomation.test;

import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import com.carparkingautomation.base.BaseTest;
import com.carparkingautomation.page.HomePage;

public class HomeTest extends BaseTest {
 
 public HomePage page;
 
 @BeforeMethod
 public void beforeMethod() {
   page = new HomePage(driver);
 }
 
 @Test
 public void navToHome() {
  
  Assert.assertTrue(driver.getTitle().contains("Home"));
  
  try {
   Thread.sleep(10000);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
 
 @Test
 public void VerifyHeaderHeading() {
  
  
  String text = page.headerHeadingText();
  
  System.out.println("Page heading is: "+text);
  
  Assert.assertTrue(text.contains("Car Parking Management System"));
  
 }
 
 @Test
 public void verifyParimaryHeaderText() {

  Assert.assertTrue(page.homeLinkText().contains("Home"));
  Assert.assertTrue(page.signUpLinkText().contains("SignUp"));
  Assert.assertTrue(page.loginLinkText().contains("Login"));
  
 }
 
 @Test
 public void verifybodyHeadingText() {	
  Assert.assertTrue(page.bodyHeadingText().contains("Student Car Parking Booking System"));
   
 }
 
 
 
 

}

Session 2: Automate Home Page

Write automation scripts to automate the below testcases from the home page.

Testcase 1:

– Navigate to the home page.
– Verify the page title name as Home.

Testcase 2:

– Navigate to the home page.
– Verify header tiles as “Car Parking Management System”.

Testcase 3:

– Navigate to the home page.
– Verify the primary header menu link for Home, SignUp, and Login.

Testcase 4:

– Navigate to the home page.
– Verify Page Body Text as “Student Car Parking Booking System”.

Session 3: Automate Login Page

Write automation scripts to automate the below testcases from the home page.

Testcase 1:

– Navigate to the Login page.
– Enter the correct username and Password
– Verify valid user can login.

Testcase 2:

– Navigate to the Login page.
– Enter InCorrect username and Password
– Verify that the InValid user is not able to login.

Session 3: Configure testng.xml and system.properties

  • How to create testng.xml and run the test suite in testng.
  • Read data from system.properties file.