Integrating Selenium with Cucumber allows you to write BDD (Behavior Driven Development) test cases in a human-readable format using Gherkin, while implementing browser automation using Selenium WebDriver in the backend.
Tools and Technologies Used
Java
Maven
Selenium WebDriver
Cucumber JVM
JUnit/TestNG (Test Runner)
Project Structure
src
├── main
│ └── java
│ └── (not used for test code)
└── test
└── java
├── stepDefinitions
│ └── LoginSteps.java
├── runners
│ └── TestRunner.java
├── pages
│ └── LoginPage.java
└── features
└── login.feature
Add Dependencies in
pom.xml
<dependencies> <!-- Selenium --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.21.0</version> </dependency> <!-- Cucumber Java --> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>7.16.1</version> </dependency> <!-- Cucumber JUnit --> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <version>7.16.1</version> <scope>test</scope> </dependency> <!-- JUnit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency> </dependencies>
Write Feature File –
login.feature
Feature: Login functionality Scenario: Successful login with valid credentials Given User is on Login Page When User enters username "admin" and password "password" And Clicks on login button Then User should land on Home Page
Create Page Object –
LoginPage.java
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class LoginPage { WebDriver driver; By usernameField = By.id("username"); By passwordField = By.id("password"); By loginButton = By.id("login"); public LoginPage(WebDriver driver) { this.driver = driver; } public void enterUsername(String uname) { driver.findElement(usernameField).sendKeys(uname); } public void enterPassword(String pwd) { driver.findElement(passwordField).sendKeys(pwd); } public void clickLogin() { driver.findElement(loginButton).click(); } }
Create Step Definition –
LoginSteps.java
package stepDefinitions; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import io.cucumber.java.en.*; import pages.LoginPage; import static org.junit.Assert.assertEquals; public class LoginSteps { WebDriver driver; LoginPage login; @Given("User is on Login Page") public void user_on_login_page() { System.setProperty("webdriver.chrome.driver", "path/to/chromedriver"); driver = new ChromeDriver(); driver.get("https://example.com/login"); login = new LoginPage(driver); } @When("User enters username {string} and password {string}") public void user_enters_credentials(String username, String password) { login.enterUsername(username); login.enterPassword(password); } @And("Clicks on login button") public void click_login_button() { login.clickLogin(); } @Then("User should land on Home Page") public void user_lands_on_home_page() { String expectedTitle = "Home - Dashboard"; String actualTitle = driver.getTitle(); assertEquals(expectedTitle, actualTitle); driver.quit(); } }
Test Runner Class –
TestRunner.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.html"}, monochrome = true ) public class TestRunner { }
Running the Test
Right-click on
TestRunner.javaand select Run As > JUnit Test.Chrome browser opens and performs login steps as per
login.feature.