Maven based project - > feature files -> login feature -> multiple scenarios Step 1: Updated Feature File (Advanced BDD) Feature: OrangeHRM Login validation Background: Given user is on orangeHRM login page Scenario: Successful login When user enters username "Admin" and password "admin123" And clicks on login button Then user should be logged in successfully Scenario: Unsuccessful login When user enters username "Admin" and invalid password "wrong123" And clicks on login button Then user should get an error message Scenario: Validate login page elements Then username field should be visible And password field should be visible And login button should be visible Scenario Outline: Multiple login attempts When user enters username "" and password "" And clicks on login button Then user should see "" Examples: | username | password | result | | Admin | admin123 | success | | Admin | wrong123 | error | | wrong | admin123 | error | Step 2: Step Definition Class package stepdefinitions; import io.cucumber.java.en.*; import org.openqa.selenium.*; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.Assert; import java.time.Duration; public class LoginSteps { WebDriver driver; @Given("user is on orangeHRM login page") public void openLoginPage() { driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10)); driver.manage().window().maximize(); driver.get("https://opensource-demo.orangehrmlive.com/"); } @When("user enters username {string} and password {string}") public void enterCredentials(String username, String password) { driver.findElement(By.name("username")).sendKeys(username); driver.findElement(By.name("password")).sendKeys(password); } @When("user enters username {string} and invalid password {string}") public void enterInvalidPassword(String username, String password) { driver.findElement(By.name("username")).sendKeys(username); driver.findElement(By.name("password")).sendKeys(password); } @And("clicks on login button") public void clickLogin() { driver.findElement(By.xpath("//button[@type='submit']")).click(); } @Then("user should be logged in successfully") public void validateSuccess() { boolean dashboard = driver.findElement(By.xpath("//h6[text()='Dashboard']")).isDisplayed(); Assert.assertTrue(dashboard, "Login Failed"); driver.quit(); } @Then("user should get an error message") public void validateError() { WebElement error = driver.findElement(By.xpath("//p[@role='alert']")); Assert.assertTrue(error.isDisplayed(), "Error not displayed"); driver.quit(); } @Then("username field should be visible") public void validateUsername() { Assert.assertTrue(driver.findElement(By.name("username")).isDisplayed()); } @Then("password field should be visible") public void validatePassword() { Assert.assertTrue(driver.findElement(By.name("password")).isDisplayed()); } @Then("login button should be visible") public void validateButton() { Assert.assertTrue(driver.findElement(By.xpath("//button[@type='submit']")).isDisplayed()); driver.quit(); } @Then("user should see {string}") public void validateMultiple(String result) { if(result.equals("success")) { boolean dashboard = driver.findElement(By.xpath("//h6[text()='Dashboard']")).isDisplayed(); Assert.assertTrue(dashboard); } else { WebElement error = driver.findElement(By.xpath("//p[@role='alert']")); Assert.assertTrue(error.isDisplayed()); } driver.quit(); } } Step 3: Runner Class (With Reporting) package runners; import io.cucumber.testng.AbstractTestNGCucumberTests; import io.cucumber.testng.CucumberOptions; @CucumberOptions( features = "src/test/resources/features", glue = "stepdefinitions", plugin = { "pretty", "html:target/cucumber-report.html", "json:target/cucumber.json" } ) public class TestRunner extends AbstractTestNGCucumberTests { } Step 4: DataTable Example (Extra Concept) 👉 Add in feature: Scenario: Login using DataTable When user enters credentials | username | password | | Admin | admin123 | And clicks on login button Then user should be logged in successfully 👉 Step: @When("user enters credentials") public void enterData(io.cucumber.datatable.DataTable dataTable) { String username = dataTable.asMaps().get(0).get("username"); String password = dataTable.asMaps().get(0).get("password"); driver.findElement(By.name("username")).sendKeys(username); driver.findElement(By.name("password")).sendKeys(password); } Step 5: Reports Location After running: 👉 HTML Report: target/cucumber-report.html 👉 JSON Report: target/cucumber.json 👉 Open in browser: Right click → Open in browser OR go to project → target folder Step 6: Execution Command mvn test Step 7: What You Achieved ✔ Basic scenarios ✔ Negative testing ✔ Scenario Outline (data-driven) ✔ DataTable ✔ Assertions (real QA) ✔ Reporting Step 8: Important Improvement (Must Do Next) Your current framework (from your file ): 👉 Still linear and not scalable Next upgrade should be: Page Object Model (POM) Hooks for driver management Base class Reusable utilities If you want, next I’ll give: 👉 Company-level Hybrid Framework (BDD + POM + Hooks + Utils) 👉 OR Playwright BDD (much higher demand now) Just say next level 🚀