Integration of Selenium with Cucumber

  

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.java and select Run As > JUnit Test.

  • Chrome browser opens and performs login steps as per login.feature.