How can we convert Selenium Test to Cucumber Test

  

To convert a Selenium test into a Cucumber BDD test, you need to follow a structured approach where the test scenarios are written in Gherkin syntax (in .feature files) and the test logic is implemented using step definitions that internally use Selenium WebDriver.


Steps to Convert Selenium Test to Cucumber BDD

Step 1: Traditional Selenium Test (Without Cucumber)

Here is a simple Selenium test in Java:

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

public class LoginTest {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://example.com/login");

        WebElement username = driver.findElement(By.id("username"));
        WebElement password = driver.findElement(By.id("password"));
        WebElement loginButton = driver.findElement(By.id("login"));

        username.sendKeys("admin");
        password.sendKeys("admin123");
        loginButton.click();

        String expectedUrl = "https://example.com/dashboard";
        assert driver.getCurrentUrl().equals(expectedUrl);

        driver.quit();
    }
}




Step 2: Add Cucumber and Selenium Dependencies in pom.xml

<dependencies>
    <!-- Selenium -->
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.21.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>
        <scope>test</scope>
    </dependency>

    <!-- JUnit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>




Step 3: Create Feature File (Gherkin)

src/test/resources/features/login.feature

Feature: Login Functionality

  Scenario: Valid login
    Given user is on login page
    When user enters valid username and password
    And clicks on login button
    Then user should be redirected to dashboard page




Step 4: Create Step Definition File

src/test/java/stepDefinitions/LoginSteps.java

package stepDefinitions;

import io.cucumber.java.en.*;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;

public class LoginSteps {
    WebDriver driver;

    @Given("user is on login page")
    public void user_is_on_login_page() {
        driver = new ChromeDriver();
        driver.get("https://example.com/login");
    }

    @When("user enters valid username and password")
    public void user_enters_valid_username_and_password() {
        driver.findElement(By.id("username")).sendKeys("admin");
        driver.findElement(By.id("password")).sendKeys("admin123");
    }

    @When("clicks on login button")
    public void clicks_on_login_button() {
        driver.findElement(By.id("login")).click();
    }

    @Then("user should be redirected to dashboard page")
    public void user_should_be_redirected_to_dashboard_page() {
        String expectedUrl = "https://example.com/dashboard";
        String actualUrl = driver.getCurrentUrl();
        if (!actualUrl.equals(expectedUrl)) {
            throw new AssertionError("Login failed: URL mismatch");
        }
        driver.quit();
    }
}




Step 5: Create Test Runner Class

src/test/java/testRunner/TestRunner.java

package testRunner;

import org.junit.runner.RunWith;
import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;

@RunWith(Cucumber.class)
@CucumberOptions(
    features = "src/test/resources/features",
    glue = "stepDefinitions",
    plugin = {"pretty", "html:target/cucumber-report.html"},
    monochrome = true
)
public class TestRunner {
}



Benefits of Converting to Cucumber BDD

  • Readable Scenarios: Easier for non-developers to understand.

  • Collaboration: Better collaboration between QA, Dev, and Business.

  • Reusable Steps: Step definitions can be reused across features.

  • Reports: HTML reports can be generated for analysis.

No comments:

Post a Comment