A robust, enterprise-level test automation framework using Selenium WebDriver, Cucumber BDD, TestNG, and Gradle.
selenium-cucumber-framework/
βββ src/
β βββ main/
β β βββ java/com/automation/
β β β βββ pages/ # Page Object Model classes
β β β β βββ BasePage.java (100+ reusable methods)
β β β β βββ LoginPage.java
β β β βββ utils/ # Utility classes
β β β βββ ConfigReader.java
β β β βββ DriverManager.java
β β β βββ ScreenshotUtil.java
β β β βββ RetryAnalyzer.java
β β βββ resources/
β β βββ config.properties
β βββ test/
β βββ java/com/automation/
β β βββ runners/ # TestNG Cucumber Runners
β β β βββ TestRunner.java
β β β βββ SmokeTestRunner.java
β β βββ stepdefinitions/ # Cucumber Step Definitions
β β β βββ LoginSteps.java
β β βββ hooks/ # Cucumber Hooks
β β βββ Hooks.java
β βββ resources/
β βββ features/ # Cucumber Feature files
β β βββ Login.feature
β βββ testdata/ # Test data files
β βββ testng.xml # TestNG suite configuration
βββ build.gradle
βββ settings.gradle
βββ gradle.properties
βββ README.md
- β Page Object Model (POM) design pattern
- β Cucumber BDD for behavior-driven testing
- β TestNG for test execution and management
- β Gradle build automation
- β Enterprise-level BasePage with 100+ reusable methods
- β Retry Analyzer for automatic failed test retry
- β Screenshot on Failure capability
- β Allure Reports - Beautiful, interactive HTML reports
- β Multiple Reporting (Cucumber HTML, JSON, XML, Allure)
- β Parallel Execution support
- β Cross-browser testing support
- β WebDriverManager for automatic driver management
The framework includes a comprehensive BasePage with advanced methods organized in categories:
- Standard click, JavaScript click, Actions click
- Double-click, Right-click, Click and hold
- SendKeys with/without clear, JavaScript input
- Slow typing, Field clearing
- Select by text/value/index
- Get all options, Multi-select support
- Deselect operations
- Explicit waits, Fluent waits
- Custom waits, AJAX/jQuery waits
- Page load waits, Element visibility waits
- Hover, Hover and click
- Drag & Drop, Drag by offset
- Scroll to element (smooth/regular)
- Scroll to top/bottom
- Scroll by pixels
- Accept, Dismiss, Get text
- Send text, Check presence
- Switch frames (by index/name/element)
- Switch windows, Close windows
- Navigate between windows
- Execute scripts, Highlight elements
- Set/Remove attributes
- Navigate to URL, Refresh, Back, Forward
- Get current URL and title
- Full page screenshots
- Element-specific screenshots
- Get all elements text
- Click element by text
- Find element by text
- Press Enter/Tab/specific keys
- Keyboard shortcuts
- Copy/Paste operations
- Java JDK: 17 or higher
- Gradle: 7.x or higher (or use Gradle wrapper)
- IDE: IntelliJ IDEA / Eclipse / VS Code
- Browsers: Chrome (default), Firefox, Edge, or Safari
cd /Users/doddakulanagendrababu/Documents/selenium-cucumber-framework./gradlew clean buildOr on Windows:
gradlew.bat clean buildEdit src/main/resources/config.properties:
# Application URL
app.url=https://doddakula-nagendrababu-ai-testcase.vercel.app/login.html
# Browser Configuration
browser=chrome
headless=false
browser.window.maximize=true
# Timeouts
implicit.wait=10
explicit.wait=20
page.load.timeout=30
# Test Credentials
test.username=testuser@example.com
test.password=Test@123
# Retry Configuration
retry.count=2
# Screenshot Configuration
screenshot.on.failure=true
screenshot.path=test-output/screenshots/./gradlew clean test./gradlew clean test -Dsuite=src/test/resources/testng.xml./gradlew clean test -Dcucumber.filter.tags="@Smoke"# Run Login tests
./gradlew clean test -Dcucumber.filter.tags="@Login"
# Run Positive tests
./gradlew clean test -Dcucumber.filter.tags="@Positive"
# Run Negative tests
./gradlew clean test -Dcucumber.filter.tags="@Negative"
# Run multiple tags (AND condition)
./gradlew clean test -Dcucumber.filter.tags="@Smoke and @Login"
# Run multiple tags (OR condition)
./gradlew clean test -Dcucumber.filter.tags="@Smoke or @Regression"Update config.properties:
headless=trueUpdate config.properties:
browser=firefox # Options: chrome, firefox, edge, safari# Run TestRunner
./gradlew clean test --tests "com.automation.runners.TestRunner"
# Run SmokeTestRunner
./gradlew clean test --tests "com.automation.runners.SmokeTestRunner"After test execution, reports are generated in multiple formats:
# Generate and view Allure report
allure serve build/allure-resultsLocation: build/allure-report/
Features: Interactive, beautiful HTML reports with screenshots, trends, and detailed analytics
π See ALLURE_SETUP.md for detailed Allure installation and usage guide
target/cucumber-reports/cucumber.html
target/cucumber-reports/cucumber.json
target/cucumber-reports/cucumber.xml
test-output/index.html
test-output/screenshots/
# View Cucumber report
open target/cucumber-reports/cucumber.html
# View Allure report
allure serve build/allure-resultsCreate a new .feature file in src/test/resources/features/:
@NewFeature @Regression
Feature: New Feature Description
As a user
I want to test new functionality
So that I can ensure it works correctly
Background:
Given User is on the application
@Smoke @Positive
Scenario: Valid scenario description
When User performs an action
And User performs another action
Then User should see expected result
@Negative
Scenario: Invalid scenario description
When User performs invalid action
Then User should see error messageCreate a new page class in src/main/java/com/automation/pages/:
package com.automation.pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
public class NewPage extends BasePage {
// Locators
@FindBy(id = "elementId")
private WebElement element;
@FindBy(xpath = "//button[@type='submit']")
private WebElement submitButton;
// Constructor
public NewPage(WebDriver driver) {
super(driver);
}
// Action Methods
public void clickElement() {
click(element);
}
public void enterText(String text) {
sendKeys(element, text);
}
public String getElementText() {
return getText(element);
}
public boolean isElementDisplayed() {
return isDisplayed(element);
}
}Create step definitions in src/test/java/com/automation/stepdefinitions/:
package com.automation.stepdefinitions;
import com.automation.pages.NewPage;
import com.automation.utils.DriverManager;
import io.cucumber.java.en.*;
import org.testng.Assert;
public class NewSteps {
private NewPage newPage;
@Given("User is on the application")
public void user_is_on_the_application() {
DriverManager.getDriver().get("URL");
newPage = new NewPage(DriverManager.getDriver());
}
@When("User performs an action")
public void user_performs_an_action() {
newPage.clickElement();
}
@Then("User should see expected result")
public void user_should_see_expected_result() {
Assert.assertTrue(newPage.isElementDisplayed(), "Element not displayed");
}
}| Property | Description | Default | Example |
|---|---|---|---|
| app.url | Application URL | - | https://example.com |
| browser | Browser name | chrome | chrome/firefox/edge/safari |
| headless | Run in headless mode | false | true/false |
| browser.window.maximize | Maximize browser window | true | true/false |
| implicit.wait | Implicit wait (seconds) | 10 | 10 |
| explicit.wait | Explicit wait (seconds) | 20 | 20 |
| page.load.timeout | Page load timeout (seconds) | 30 | 30 |
| retry.count | Retry attempts for failed tests | 2 | 0-5 |
| screenshot.on.failure | Take screenshot on failure | true | true/false |
| screenshot.path | Screenshot directory path | test-output/screenshots/ | custom/path/ |
| test.username | Test username | - | user@example.com |
| test.password | Test password | - | Pass@123 |
Update src/test/java/com/automation/runners/TestRunner.java:
@DataProvider(parallel = true)
public Object[][] scenarios() {
return super.scenarios();
}Update src/test/resources/testng.xml:
<suite name="Test Suite" parallel="methods" thread-count="3">- Set
thread-count="3"for 3 parallel threads - Adjust based on your machine's capacity
- Recommended: CPU cores - 1
Update testng.xml:
<suite name="Test Suite" verbose="10">In your test code:
basePage.highlightElement(element);Update TestRunner.java:
dryRun = true // Will not execute, just validateIssue: WebDriver not found
Solution: Run ./gradlew clean build to download dependencies
Issue: Screenshot directory not found Solution: Framework auto-creates it, but ensure write permissions
Issue: Tests not running Solution: Check tags in TestRunner match feature file tags
- β One page class per web page
- β Use meaningful element names
- β Keep page objects independent
- β Extend BasePage for all page classes
- β Keep steps simple and readable
- β Delegate to page objects (no direct Selenium code)
- β One step definition file per feature
- β Reuse existing steps where possible
- β Use descriptive scenario names
- β Tag appropriately (@Smoke, @Regression, etc.)
- β Keep scenarios independent
- β Use Background for common preconditions
- β Use Scenario Outline for data-driven tests
- β Always use explicit waits (from BasePage)
- β Never use Thread.sleep()
- β Use appropriate wait types for the situation
- β Use TestNG assertions in step definitions
- β Provide meaningful assertion messages
- β Assert expected outcomes clearly
- β Keep all configs in config.properties
- β Never hardcode URLs or credentials
- β Use environment-specific properties if needed
- β Take screenshots on failure (enabled by default)
- β Use meaningful scenario and step names
- β Add tags for better report filtering
src/main/java/com/automation/
βββ pages/ # Page Object Model
β βββ BasePage.java # Base class with 100+ reusable methods
β βββ LoginPage.java # Login page object
βββ utils/ # Utility classes
βββ ConfigReader.java # Reads config.properties
βββ DriverManager.java # WebDriver lifecycle management
βββ ScreenshotUtil.java # Screenshot capture utility
βββ RetryAnalyzer.java # TestNG retry analyzer
src/test/java/com/automation/
βββ runners/ # TestNG Cucumber runners
β βββ TestRunner.java # Main test runner
β βββ SmokeTestRunner.java # Smoke test runner
βββ stepdefinitions/ # Cucumber step implementations
β βββ LoginSteps.java
βββ hooks/ # Cucumber hooks
βββ Hooks.java # Before/After scenario hooks
src/test/resources/
βββ features/ # Cucumber feature files (BDD)
β βββ Login.feature
βββ testdata/ # Test data files (CSV, JSON, Excel)
βββ testng.xml # TestNG suite configuration
Key dependencies managed by Gradle:
- Selenium WebDriver 4.18.1: Browser automation
- Cucumber 7.15.0: BDD framework
- TestNG 7.9.0: Test execution framework
- Allure 2.25.0: Advanced reporting
- WebDriverManager 5.6.3: Automatic driver management
- Apache POI 5.2.5: Excel operations
- AssertJ 3.25.1: Fluent assertions
- Gson/Jackson: JSON handling
- Log4j 2.22.1: Logging
pipeline {
agent any
stages {
stage('Test') {
steps {
sh './gradlew clean test'
}
}
stage('Allure Report') {
steps {
allure includeProperties: false,
jdk: '',
results: [[path: 'build/allure-results']]
}
}
stage('Cucumber Report') {
steps {
cucumber '**/cucumber.json'
publishHTML([reportDir: 'target/cucumber-reports', reportFiles: 'cucumber.html'])
}
}
}
}name: Selenium Tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
- name: Run tests
run: ./gradlew clean test
- name: Generate Allure Report
run: allure generate build/allure-results --clean -o build/allure-report
- name: Upload Allure Report
uses: actions/upload-artifact@v2
with:
name: allure-report
path: build/allure-report/
- name: Upload Cucumber reports
uses: actions/upload-artifact@v2
with:
name: cucumber-reports
path: target/cucumber-reports/- Location:
/Users/doddakulanagendrababu/Documents/selenium-cucumber-framework - Application Under Test: https://doddakula-nagendrababu-ai-testcase.vercel.app/login.html
- Check this README first
- Review BasePage methods for available actions
- Examine existing tests for examples
- Check Gradle build logs for dependency issues
Potential improvements for the framework:
- API testing integration (RestAssured)
- Database validation utilities
- Email/SMS verification helpers
- Docker containerization
- Performance testing integration
- Visual regression testing
-
Allure Reports integrationβ Completed
# 1. Navigate to project
cd /Users/doddakulanagendrababu/Documents/selenium-cucumber-framework
# 2. Build project
./gradlew clean build
# 3. Install Allure (if not installed)
brew install allure
# 4. Run tests
./gradlew clean test
# 5. View Allure report (recommended)
allure serve build/allure-results
# Or view Cucumber report
open target/cucumber-reports/cucumber.htmlFramework Created: October 2025 Test Automation Framework: Selenium + Java + Cucumber + TestNG + Gradle + Allure Ready to Use: Yes β
Happy Testing! π