You are a QA Lead, and I need your help to create a complete automation framework for the following scenario. The framework should use Java, Selenium WebDriver, Maven, and TestNG, and it must be structured so it can be implemented in a real QA automation project.

The web URL should be read from a text file.

Here is the application URL: https://ifewsteps.web.app/login-qa/

The page contains a username and password field.

  • Username: fewsteps
  • Password: paassword

A user can log in successfully only after clicking the login button. If incorrect credentials are entered, an error should appear and access should be denied.

The framework must also include:

  • Allure reporting
  • Jenkins pipeline integration
  • Data-driven login using Excel or JSON
  • Parallel test execution setup

Please explain the solution briefly and in detail.

Solution 1:

Got it โ€” you want the same full automation framework, but with clear, short, clean explanations below each section, so you understand what each part does.

Here is the improved version โ€” FULL CODE + STEP-BY-STEP EXPLANATION, clean and professional.


๐Ÿš€ COMPLETE TEST AUTOMATION FRAMEWORK (WITH EXPLANATIONS)

Java + Selenium + TestNG + Maven + Allure + Jenkins + Data-Driven + Parallel Execution


=====================================

โœ… 1. PROJECT STRUCTURE

=====================================

automation-framework/
โ”‚
โ”œโ”€โ”€ pom.xml
โ”œโ”€โ”€ Jenkinsfile
โ”‚
โ”œโ”€โ”€ src
โ”‚   โ”œโ”€โ”€ main/java/com/framework/base
โ”‚   โ”‚        โ”œโ”€โ”€ BaseTest.java
โ”‚   โ”‚        โ””โ”€โ”€ DriverFactory.java
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ main/java/com/framework/utils
โ”‚   โ”‚        โ”œโ”€โ”€ FileUtils.java
โ”‚   โ”‚        โ””โ”€โ”€ JsonReader.java
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ main/resources
โ”‚   โ”‚        โ”œโ”€โ”€ url.txt
โ”‚   โ”‚        โ””โ”€โ”€ testdata.json
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ test/java/com/framework/pages
โ”‚   โ”‚        โ””โ”€โ”€ LoginPage.java
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ test/java/com/framework/tests
โ”‚   โ”‚        โ””โ”€โ”€ LoginTest.java
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ test/resources
โ”‚            โ””โ”€โ”€ testng.xml

๐Ÿ” EXPLANATION

  • base/ โ†’ WebDriver setup
  • pages/ โ†’ Page Objects (UI locators + actions)
  • tests/ โ†’ TestNG test files
  • utils/ โ†’ Helper classes (JSON, URL reader)
  • resources/ โ†’ Test data & config
  • testng.xml โ†’ Controls parallel execution
  • Jenkinsfile โ†’ CI/CD pipeline
  • pom.xml โ†’ All dependencies

=====================================

โœ… 2. POM.XML (DEPENDENCIES + PLUGINS)

=====================================

<project xmlns="http://maven.apache.org/POM/4.0.0">

    <modelVersion>4.0.0</modelVersion>
    <groupId>qa.framework</groupId>
    <artifactId>automation</artifactId>
    <version>1.0</version>

    <dependencies>

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

        <!-- TestNG -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.9.0</version>
        </dependency>

        <!-- JSON -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.17.0</version>
        </dependency>

        <!-- Allure Reporting -->
        <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-testng</artifactId>
            <version>2.25.0</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>

            <!-- Run TestNG from Maven -->
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.2.5</version>
                <configuration>
                    <suiteXmlFiles>
                        <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                </configuration>
            </plugin>

            <!-- Allure plugin -->
            <plugin>
                <groupId>io.qameta.allure</groupId>
                <artifactId>allure-maven</artifactId>
                <version>2.12.0</version>
            </plugin>

        </plugins>
    </build>

</project>

๐Ÿ” EXPLANATION

  • Adds Selenium, TestNG, Jackson JSON, Allure
  • Surefire plugin allows Maven to run TestNG
  • Allure plugin generates reporting files

=====================================

โœ… 3. URL TEXT FILE

=====================================

๐Ÿ“Œ src/main/resources/url.txt

https://ifewsteps.web.app/login-qa/

๐Ÿ” EXPLANATION

This file stores the URL so tests are not hard-coded. You can switch QA โ†’ UAT โ†’ PROD without changing code.


=====================================

โœ… 4. TEST DATA (JSON)

=====================================

๐Ÿ“Œ testdata.json

{
  "validLogin": {
    "username": "fewsteps",
    "password": "paassword"
  },
  "invalidLogin": {
    "username": "wrong",
    "password": "bad"
  }
}

๐Ÿ” EXPLANATION

This file contains multiple sets of login credentials used for data-driven testing.


=====================================

โœ… 5. DRIVER FACTORY (WebDriver Manager)

=====================================

๐Ÿ“Œ DriverFactory.java

package com.framework.base;

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

public class DriverFactory {

    private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();

    public static WebDriver getDriver() {
        return driver.get();
    }

    public static void initDriver() {
        WebDriver wd = new ChromeDriver();
        driver.set(wd);
        wd.manage().window().maximize();
    }

    public static void quitDriver() {
        getDriver().quit();
        driver.remove();
    }
}

๐Ÿ” EXPLANATION

  • ThreadLocal enables parallel execution
  • initDriver() launches Chrome
  • quitDriver() closes driver safely
  • getDriver() is used everywhere

=====================================

โœ… 6. BASE TEST

=====================================

๐Ÿ“Œ BaseTest.java

package com.framework.base;

import com.framework.utils.FileUtils;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;

public class BaseTest {

    @BeforeMethod
    public void setUp() {
        DriverFactory.initDriver();
        DriverFactory.getDriver().get(FileUtils.readUrl());
    }

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

๐Ÿ” EXPLANATION

  • Runs before every test
  • Opens browser and loads URL
  • After each test, closes browser

=====================================

โœ… 7. UTILITY: READ URL FROM FILE

=====================================

๐Ÿ“Œ FileUtils.java

package com.framework.utils;

import java.nio.file.Files;
import java.nio.file.Paths;

public class FileUtils {

    public static String readUrl() {
        try {
            return Files.readString(Paths.get("src/main/resources/url.txt")).trim();
        } catch (Exception e) {
            throw new RuntimeException("Error reading URL file");
        }
    }
}

๐Ÿ” EXPLANATION

Reads the application URL from url.txt. Simple, clean, reusable.


=====================================

โœ… 8. UTILITY: JSON DATA READER

=====================================

๐Ÿ“Œ JsonReader.java

package com.framework.utils;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.util.Map;
import java.util.HashMap;

public class JsonReader {

    public static Map<String, String> getCredentials(String key) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode root = mapper.readTree(new File("src/main/resources/testdata.json"));

            Map<String, String> data = new HashMap<>();
            data.put("username", root.get(key).get("username").asText());
            data.put("password", root.get(key).get("password").asText());

            return data;

        } catch (Exception e) {
            throw new RuntimeException("Cannot read JSON test data");
        }
    }
}

๐Ÿ” EXPLANATION

  • Loads JSON test file
  • Returns username & password for any test scenario

=====================================

โœ… 9. PAGE OBJECT MODEL (POM)

=====================================

๐Ÿ“Œ LoginPage.java

package com.framework.pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class LoginPage {

    WebDriver driver;

    By username = By.id("username");
    By password = By.id("password");
    By loginBtn = By.id("loginBtn");
    By errorMsg = By.id("errorMessage");

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

    public void enterUsername(String user) {
        driver.findElement(username).sendKeys(user);
    }

    public void enterPassword(String pass) {
        driver.findElement(password).sendKeys(pass);
    }

    public void clickLogin() {
        driver.findElement(loginBtn).click();
    }

    public boolean isErrorVisible() {
        try {
            return driver.findElement(errorMsg).isDisplayed();
        } catch (Exception e) {
            return false;
        }
    }
}

๐Ÿ” EXPLANATION

This is the Page Object for the login page:

  • Locators stored as variables
  • Functions represent user actions
  • Clean separation from tests

=====================================

โœ… 10. TEST CASES

=====================================

๐Ÿ“Œ LoginTest.java

package com.framework.tests;

import com.framework.base.BaseTest;
import com.framework.base.DriverFactory;
import com.framework.pages.LoginPage;
import com.framework.utils.JsonReader;
import org.testng.Assert;
import org.testng.annotations.Test;

public class LoginTest extends BaseTest {

    @Test
    public void validLoginTest() {
        LoginPage login = new LoginPage(DriverFactory.getDriver());
        var data = JsonReader.getCredentials("validLogin");

        login.enterUsername(data.get("username"));
        login.enterPassword(data.get("password"));
        login.clickLogin();

        Assert.assertFalse(login.isErrorVisible(), "No error expected on valid login");
    }

    @Test
    public void invalidLoginTest() {
        LoginPage login = new LoginPage(DriverFactory.getDriver());
        var data = JsonReader.getCredentials("invalidLogin");

        login.enterUsername(data.get("username"));
        login.enterPassword(data.get("password"));
        login.clickLogin();

        Assert.assertTrue(login.isErrorVisible(), "Error expected on invalid login");
    }
}

๐Ÿ” EXPLANATION

  • Uses JSON data
  • Interacts through Page Object
  • Uses TestNG assertions
  • Valid login โ†’ no error
  • Invalid login โ†’ error visible

=====================================

โœ… 11. PARALLEL EXECUTION

=====================================

๐Ÿ“Œ testng.xml

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">

<suite name="AutomationSuite" parallel="methods" thread-count="2">

    <test name="Login Tests">
        <classes>
            <class name="com.framework.tests.LoginTest"/>
        </classes>
    </test>

</suite>

๐Ÿ” EXPLANATION

  • parallel="methods" โ†’ run tests simultaneously
  • thread-count="2" โ†’ run 2 tests in parallel
  • Uses ThreadLocal WebDriver

=====================================

โœ… 12. JENKINS PIPELINE

=====================================

๐Ÿ“Œ Jenkinsfile

pipeline {
    agent any

    stages {

        stage('Checkout') {
            steps {
                git 'https://your-repo-url.git'
            }
        }

        stage('Install Dependencies') {
            steps {
                sh 'mvn clean install -DskipTests'
            }
        }

        stage('Run Tests') {
            steps {
                sh 'mvn test'
            }
        }

        stage('Allure Report') {
            steps {
                allure results: [[path: 'allure-results']]
            }
        }
    }
}

๐Ÿ” EXPLANATION

  • Git checkout
  • Build project
  • Run tests
  • Publish Allure reports

=====================================

โœ… 13. HOW TO RUN

=====================================

1๏ธโƒฃ Install dependencies

mvn clean install

2๏ธโƒฃ Run tests

mvn test

3๏ธโƒฃ View Allure report

allure serve allure-results