Allure reporting integration in Selenium Java - Build an Automation Script
import io.qameta.allure.Allure; import io.qameta.allure.Step; import io.qameta.allure.Attachment; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.ByteArrayInputStream; import java.time.Duration; public class LoginTest { private WebDriver driver; private WebDriverWait wait; @BeforeClass public void setUp() { driver = new ChromeDriver(); wait = new WebDriverWait(driver, Duration.ofSeconds(10)); } @Test(description = "Verify login functionality with Allure reporting") public void testLogin() { openLoginPage(); enterUsername("testuser"); enterPassword("Test@1234"); clickLoginButton(); waitForDashboardUrl(); verifyDashboardPage(); } @Step("Open login page") public void openLoginPage() { driver.get("https://example.com/login"); Allure.step("Navigated to login page"); } @Step("Enter username: {username}") public void enterUsername(String username) { WebElement usernameField = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("username"))); usernameField.clear(); usernameField.sendKeys(username); Allure.step("Entered username"); } @Step("Enter password") public void enterPassword(String password) { WebElement passwordField = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("password"))); passwordField.clear(); passwordField.sendKeys(password); Allure.step("Entered password"); } @Step("Click login button") public void clickLoginButton() { WebElement loginBtn = wait.until(ExpectedConditions.elementToBeClickable(By.id("loginBtn"))); loginBtn.click(); Allure.step("Clicked login button"); } @Step("Wait for dashboard URL") public void waitForDashboardUrl() { boolean urlChanged = wait.until(ExpectedConditions.urlToBe("https://example.com/dashboard")); Assert.assertTrue(urlChanged, "URL did not change to dashboard"); Allure.step("Dashboard URL loaded"); } @Step("Verify dashboard page title") public void verifyDashboardPage() { String expectedTitle = "Dashboard - Example App"; String actualTitle = driver.getTitle(); try { Assert.assertEquals(actualTitle, expectedTitle, "Page title mismatch"); Allure.step("Page title verified: " + actualTitle); } catch (AssertionError e) { saveScreenshot(); throw e; } } @Attachment(value = "Screenshot on failure", type = "image/png") public byte[] saveScreenshot() { return ((org.openqa.selenium.TakesScreenshot) driver).getScreenshotAs(org.openqa.selenium.OutputType.BYTES); } @AfterClass public void tearDown() { if (driver != null) { driver.quit(); } } }
This test uses Selenium WebDriver with TestNG and Allure for reporting.
Setup: We start ChromeDriver and create an explicit wait.
Test steps: Each step is a method annotated with @Step for Allure to log it clearly.
We open the login page, enter username and password, click login, then wait for the dashboard URL.
Assertions check the URL and page title. If the title assertion fails, a screenshot is attached to the Allure report using @Attachment.
This structure follows the Page Object Model style by separating actions into methods, uses explicit waits to avoid timing issues, and integrates Allure steps and attachments for clear, detailed reports.
Now add data-driven testing with 3 different username and password combinations using TestNG data provider.