BDD-Driven Automation Framework using Cucumber and Selenium
Basic structure of a Page Object Model (POM) framework using Selenium, Java, and Cucumber. This includes the essential folders and files you’d typically use to get started.
✅ Project Structure
🧱 1. pom.xml
(Dependencies)
XML
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SeleniumCucumberPOM</groupId>
<artifactId>SeleniumCucumberPOM</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--
Selenium -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.19.0</version>
</dependency>
<!--
Cucumber -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>7.14.0</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>7.14.0</version>
</dependency>
<!-- JUnit
-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!--
WebDriver Manager -->
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.8.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--
Maven Compiler -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<!--
Maven Surefire Plugin for Cucumber -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
</plugin>
</plugins>
</build>
</project>
💻 2. Sample Page Class (POM) - LoginPage.java
java
package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class LoginPage {
private WebDriver
driver;
// Locators
private By username
= By.id("username");
private By password
= By.id("password");
private By loginBtn
= By.id("loginBtn");
// Constructor
public LoginPage(WebDriver
driver) {
this.driver =
driver;
}
// Actions
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();
}
}
🔧 3. DriverFactory - DriverFactory.java
java
package utils;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.WebDriverManager;
public class DriverFactory {
public static
WebDriver driver;
public static
WebDriver initDriver() {
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
return driver;
}
public static
WebDriver getDriver() {
return driver;
}
}
📜 4. Feature File - login.feature
gherkin
Feature: Login functionality
Scenario: Successful
login with valid credentials
Given user is on
login page
When user enters
valid username and password
And clicks on
login button
Then user should land on home page
🧾 5. Step Definition - LoginSteps.java
java
package stepdefinitions;
import io.cucumber.java.en.*;
import org.openqa.selenium.WebDriver;
import pages.LoginPage;
import utils.DriverFactory;
public class LoginSteps {
WebDriver driver;
LoginPage
loginPage;
@Given("user
is on login page")
public void user_is_on_login_page()
{
driver =
DriverFactory.initDriver();
driver.get("https://example.com/login");
loginPage = new
LoginPage(driver);
}
@When("user
enters valid username and password")
public void user_enters_valid_credentials()
{
loginPage.enterUsername("testuser");
loginPage.enterPassword("testpass");
}
@And("clicks
on login button")
public void clicks_on_login_button()
{
loginPage.clickLogin();
}
@Then("user
should land on home page")
public void user_should_land_on_home_page()
{
// Add
assertion or check title
}
}
🚀 6. Test Runner - TestRunner.java
java
package runners;
import org.junit.runner.RunWith;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
@RunWith(Cucumber.class)
@CucumberOptions(
features =
"src/test/java/features",
glue =
{"stepdefinitions"},
plugin =
{"pretty", "html:target/cucumber-reports"},
monochrome = true
)
public class TestRunner {
}
Let me know if you want me to help you set up a full project
zip or want to extend this with hooks, reporting, or assertions!