0
0
Selenium Javatesting~15 mins

Allure reporting integration in Selenium Java - Build an Automation Script

Choose your learning style9 modes available
Verify login functionality with Allure reporting
Preconditions (3)
Step 1: Open the browser and navigate to 'https://example.com/login'
Step 2: Enter 'testuser' in the username input field with id 'username'
Step 3: Enter 'Test@1234' in the password input field with id 'password'
Step 4: Click the login button with id 'loginBtn'
Step 5: Wait until the URL changes to 'https://example.com/dashboard'
Step 6: Verify that the page title is 'Dashboard - Example App'
✅ Expected Result: User is successfully logged in and redirected to the dashboard page. Allure report captures each step with screenshots and logs.
Automation Requirements - Selenium with TestNG and Allure
Assertions Needed:
Verify current URL is 'https://example.com/dashboard'
Verify page title is 'Dashboard - Example App'
Best Practices:
Use Page Object Model to separate page interactions
Use explicit waits to wait for URL and elements
Add Allure annotations for test steps and attach screenshots on failure
Use TestNG assertions for validation
Automated Solution
Selenium Java
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.

Common Mistakes - 5 Pitfalls
Using Thread.sleep() instead of explicit waits
Not adding Allure @Step annotations to test steps
{'mistake': 'Not attaching screenshots on test failure', 'why_bad': "Without screenshots, it's harder to understand what went wrong when tests fail.", 'correct_approach': 'Use @Attachment to capture and attach screenshots on assertion failures.'}
Using hardcoded waits or no waits before assertions
Mixing locators styles or using brittle XPath selectors
Bonus Challenge

Now add data-driven testing with 3 different username and password combinations using TestNG data provider.

Show Hint