Cucumber Hooks
Cucumber Hooks
Hooks in Cucumber
In a test execution, there will be blocks of code that always need to be run to set up (prerequisite
tasks) and tear-down (post-run tasks) the related test artifacts like machine settings, browser
states, etc.
The Java implementation of Cucumber provides two entities which are called hooks. They
are @Before and @After. As the name suggests, Methods/functions/pieces of code defined
within:
@Before hooks will be run before the first step of each scenario under the feature
@After hooks will be run after the last step of each scenario under the feature
1.
2. package utilities;
3. import cucumber.api.java.After;
4. import cucumber.api.java.Before;
5.
6. public class Hooks {
7.
8. @Before
9. public void beforeScenario(){
10. System.out.println("This will run before the Scenario");
11. }
12.
13. @After
14. public void afterScenario(){
15. System.out.println("This will run after the Scenario");
16. }
17. }
An important thing to note about the @after hook is that it will run even in case of the
test fails, undefined scenarios or skipped steps inside the scenarios.
The method name for hooks can be anything, need not be beforeScenario() or
afterScenario(), always. You can use method names for hooks as, setUp() and
tearDown().
Now let look at a demo for the standard hooks - @Before and @After.
📌 Use Case:
We will initialize the WebDriver before each scenario and close the browser after the scenario
execution.
package hooks;
import io.cucumber.java.After;
import io.cucumber.java.Before;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
@Before
public void setup() {
System.out.println("Launching browser...");
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
driver = new ChromeDriver();
driver.manage().window().maximize();
}
@After
public void teardown() {
System.out.println("Closing browser...");
if (driver != null) {
driver.quit();
}
}
📝 features/Login.feature
📝 stepDefinitions/LoginSteps.java
package stepDefinitions;
import hooks.Hooks;
import io.cucumber.java.en.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.testng.Assert;
📝 runner/TestRunner.java
package runner;
import io.cucumber.testng.AbstractTestNGCucumberTests;
import io.cucumber.testng.CucumberOptions;
@CucumberOptions(
features = "src/test/resources/features",
glue = {"stepDefinitions", "hooks"},
)
public class TestRunner extends AbstractTestNGCucumberTests {
}
📌 Use Case:
We will implement step-level hooks for logging and capturing screenshots after each step
while automating the Swag Labs login process.
📌 URL: https://www.saucedemo.com/
📝 hooks/Hooks.java
package hooks;
import io.cucumber.java.*;
import org.openqa.selenium.*;
import org.openqa.selenium.io.FileHandler;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
@Before
public void setup() {
System.out.println("Launching browser...");
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
driver = new ChromeDriver();
driver.manage().window().maximize();
}
@BeforeStep
public void beforeStep() {
System.out.println("🔹 Before Step Hook Executed");
}
@AfterStep
public void afterStep(Scenario scenario) {
System.out.println("🔹 After Step Hook Executed");
if (scenario.isFailed()) {
captureScreenshot(scenario.getName());
}
}
@After
public void teardown() {
System.out.println("Closing browser...");
if (driver != null) {
driver.quit();
}
}
try {
FileHandler.copy(source, new File(destination));
System.out.println("📸 Screenshot saved: " + destination);
} catch (IOException e) {
System.out.println("⚠️Error saving screenshot: " + e.getMessage());
}
}
}
📝 features/Login.feature
📝 stepDefinitions/LoginSteps.java
package stepDefinitions;
import hooks.Hooks;
import io.cucumber.java.en.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.testng.Assert;
📝 runner/TestRunner.java
package runner;
import io.cucumber.testng.AbstractTestNGCucumberTests;
import io.cucumber.testng.CucumberOptions;
@CucumberOptions(
features = "src/test/resources/features",
glue = {"stepDefinitions", "hooks"},
)
public class TestRunner extends AbstractTestNGCucumberTests {
}
1️Feature File with Login Scenario (Login.feature)
📁 File: src/test/resources/features/Login.feature
📁 File: src/test/java/hooks/Hooks.java
package com.automation.stepDefinitions;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import com.automation.runner.TestNGRunner;
import io.cucumber.java.After;
import io.cucumber.java.Before;
@Before
public void setup() {
String browser=TestNGRunner.browser;
String url=TestNGRunner.appUrl;
switch(browser.toLowerCase()) {
case "edge":
webDriver=new EdgeDriver();
break;
case "chrome":
webDriver=new ChromeDriver();
break;
case "firefox":
webDriver=new FirefoxDriver();
break;
default :
throw new IllegalArgumentException(browser+" Browser not supported");
}
webDriver.get(url);
@After
public void tearDown() {
webDriver.close();
}
}
package pages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
// Constructor
public LoginPage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
@FindBy(id = "password")
private WebElement password;
@FindBy(id = "login-button")
private WebElement loginButton;
// Actions
public void enterUsername(String user) {
username.sendKeys(user);
}
public void enterPassword(String pass) {
password.sendKeys(pass);
}
4️⃣stepDefinitions/LoginSteps.java
package stepDefinitions;
import hooks.Hooks;
import io.cucumber.java.en.*;
import org.openqa.selenium.WebDriver;
import pages.LoginPage;
import org.testng.Assert;
package com.automation.runner;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Parameters;
import io.cucumber.testng.AbstractTestNGCucumberTests;
import io.cucumber.testng.CucumberOptions;
@CucumberOptions(
features = "src/test/resources/features/HooksDemo.feature", // Path to feature files
glue = "com.automation.stepDefinitions" // Step definitions package
)
public class TestNGRunner extends AbstractTestNGCucumberTests{
public static String browser;
public static String appUrl;
@BeforeTest
@Parameters({"browser","url"})
public void setup(String browserParam, String urlParam) {
browser=browserParam;
appUrl=urlParam;