Using Selenium with Java and BDD is a popular and robust approach for web automation testing. The typical stack includes:

Common Tech Stack

ToolPurpose
Selenium WebDriverWeb automation
CucumberBDD framework using Gherkin
JUnit/TestNGTest runner
Maven/GradleDependency management
ChromeDriverBrowser control

1. Maven Setup (pom.xml)

Add these dependencies:

<dependencies> <!-- Selenium --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.20.0</version> </dependency> <!-- Cucumber --> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>7.15.0</version> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <version>7.15.0</version> </dependency> <!-- JUnit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> </dependencies>

2. Folder Structure

src/test/java/ ├── runner/ │ └── TestRunner.java ├── stepdefs/ │ └── LoginSteps.java ├── pages/ │ └── LoginPage.java └── features/ └── login.feature

3. Feature File (login.feature)

Feature: Login Functionality Scenario: Successful login Given I open the login page When I enter valid credentials And I click the login button Then I should be redirected to the homepage

4. Step Definitions (LoginSteps.java)

package stepdefs; import io.cucumber.java.en.*; import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; import static org.junit.Assert.*; public class LoginSteps { WebDriver driver; @Given("I open the login page") public void openLoginPage() { driver = new ChromeDriver(); driver.get("https://example.com/login"); } @When("I enter valid credentials") public void enterCredentials() { driver.findElement(By.id("username")).sendKeys("testuser"); driver.findElement(By.id("password")).sendKeys("testpass"); } @And("I click the login button") public void clickLogin() { driver.findElement(By.id("login")).click(); } @Then("I should be redirected to the homepage") public void verifyLogin() { assertTrue(driver.findElement(By.id("logout")).isDisplayed()); driver.quit(); } }

5. Cucumber Runner (TestRunner.java)

package runner; 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 = "stepdefs", plugin = {"pretty", "html:target/cucumber-reports.html"}, monochrome = true ) public class TestRunner {}

6. Running Tests

In your IDE or terminal:

mvn test