Framework using Selenium WebDriver, RestAssured, Page Factory Pattern, Docker, and Kubernetes.

Selenium WebDriver, RestAssured, Page Factory Pattern, Docker, and Kubernetes.

Here's a step-by-step guide to creating a robust testing framework that integrates Selenium WebDriver, RestAssured, Page Factory Pattern, Docker, and Kubernetes.


1. Framework Structure

Create a Maven-based project with the following structure:

project-root/
│
├── src/main/java/
│   ├── com.framework.base/
│   │   ├── BaseTest.java
│   │   └── DriverFactory.java
│   ├── com.framework.pages/
│   │   ├── LoginPage.java
│   │   └── HomePage.java
│
├── src/test/java/
│   ├── com.framework.tests/
│   │   ├── ApiTests.java
│   │   └── UITests.java
│
├── src/test/resources/
│   ├── application.properties
│
├── Dockerfile
├── docker-compose.yaml
├── pom.xml
├── README.md

2. Maven Dependencies

Add these dependencies to your pom.xml:

<dependencies>
    <!-- Selenium WebDriver -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.x.x</version>
    </dependency>

    <!-- RestAssured -->
    <dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <version>5.x.x</version>
        <scope>test</scope>
    </dependency>

    <!-- TestNG -->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.x.x</version>
        <scope>test</scope>
    </dependency>

    <!-- Jackson for JSON Parsing -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.x.x</version>
    </dependency>
</dependencies>

3. Framework Components

DriverFactory.java (Selenium WebDriver Setup)

package com.framework.base;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class DriverFactory {
    private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();

    public static WebDriver getDriver() {
        if (driver.get() == null) {
            ChromeOptions options = new ChromeOptions();
            options.addArguments("--headless", "--no-sandbox", "--disable-dev-shm-usage");
            System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
            driver.set(new ChromeDriver(options));
        }
        return driver.get();
    }

    public static void quitDriver() {
        if (driver.get() != null) {
            driver.get().quit();
            driver.remove();
        }
    }
}

BaseTest.java (Test Setup)

package com.framework.base;

import io.restassured.RestAssured;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;

public class BaseTest {
    protected WebDriver driver;

    @BeforeClass
    public void setup() {
        driver = DriverFactory.getDriver();
        RestAssured.baseURI = "http://localhost:8080";
    }

    @AfterClass
    public void tearDown() {
        DriverFactory.quitDriver();
    }
}

Page Object Classes

LoginPage.java

package com.framework.pages;

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

public class LoginPage {
    WebDriver driver;

    @FindBy(id = "username")
    WebElement usernameField;

    @FindBy(id = "password")
    WebElement passwordField;

    @FindBy(id = "loginButton")
    WebElement loginButton;

    public LoginPage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    public void login(String username, String password) {
        usernameField.sendKeys(username);
        passwordField.sendKeys(password);
        loginButton.click();
    }
}

UITests.java

package com.framework.tests;

import com.framework.base.BaseTest;
import com.framework.pages.LoginPage;
import org.testng.annotations.Test;

public class UITests extends BaseTest {
    @Test
    public void testLogin() {
        driver.get("http://localhost:8080");
        LoginPage loginPage = new LoginPage(driver);
        loginPage.login("admin", "password");
    }
}

ApiTests.java

package com.framework.tests;

import io.restassured.RestAssured;
import org.testng.annotations.Test;

import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.equalTo;

public class ApiTests {
    @Test
    public void testGetApi() {
        given()
            .when()
            .get("/api/resource")
            .then()
            .statusCode(200)
            .body("message", equalTo("Success"));
    }
}

4. Docker Integration

Dockerfile

FROM maven:3.8.4-openjdk-17 AS builder
WORKDIR /app
COPY . .
RUN mvn clean install -DskipTests

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

docker-compose.yaml

version: "3.9"
services:
  app:
    build: .
    ports:
      - "8080:8080"
  selenium-hub:
    image: selenium/hub:4.1.0
    ports:
      - "4444:4444"
  chrome:
    image: selenium/node-chrome:4.1.0
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    depends_on:
      - selenium-hub

5. Kubernetes Integration

Deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: testing-framework
spec:
  replicas: 1
  selector:
    matchLabels:
      app: testing-framework
  template:
    metadata:
      labels:
        app: testing-framework
    spec:
      containers:
      - name: app
        image: your-dockerhub-user/testing-framework:latest
        ports:
        - containerPort: 8080

Service.yaml

apiVersion: v1
kind: Service
metadata:
  name: testing-framework-service
spec:
  type: NodePort
  selector:
    app: testing-framework
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 30001

6. CI/CD Pipeline

  • Use Jenkins/GitHub Actions to:
    1. Run tests (mvn test).
    2. Build Docker image (docker build).
    3. Push to Docker Hub.
    4. Deploy to Kubernetes (kubectl apply).

This framework combines automation testing with REST API validation, UI testing, and container orchestration to ensure seamless development and deployment.

Prakash Bojja

I have a personality with all the positives, which makes me a dynamic personality with charm. I am a software professional with capabilities far beyond those of anyone who claims to be excellent.

Post a Comment

Previous Post Next Post

Contact Form