Focus on testing, not framework engineering

The Spring Boot of Selenium

Zero setup. Smarter defaults. Playwright-inspired APIs. Enterprise-ready automation —without hiding Selenium.

LoginTest.java
public class LoginTest extends BaseTest {

    @Test
    public void login() {
        open("/login");
        getByLabel("Username").fill("admin");
        getByRole(Role.BUTTON)
            .withName("Sign in").click();
        assertThat(getByText("Welcome"))
            .isVisible();
    }
}

Every Java team rebuilds the same BaseTest,DriverFactory, and wait utilities.Stop maintaining plumbing.

What you get

Outcomes first — the API is right there

Playwright's best ideas, brought into the Selenium ecosystem. Sensible defaults do the rest.

Never write Thread.sleep() again

WaitEngine

Every action auto-waits on a centralised engine with 10+ built-in conditions. Flaky timing bugs disappear.

Tests survive CSS & DOM refactors

Accessibility-first locators

getByRole, getByLabel, getByText, getByTestId — target the accessibility tree, not brittle selectors.

Assertions that don't flake on timing

Web-first assertThat()

assertThat(locator).isVisible() auto-retries until true or the timeout — no manual polling.

Flaky tests stop failing your build

@Retryable + RetryListener

Global, per-method, or per-scenario retries. Quarantine known-flaky tests without deleting them.

Hand stakeholders a report they'll read

HTML report + JUnit XML

Tabbed dashboard — overview, cases, failures, flakiness radar. JUnit XML parsed natively by any CI.

Safe parallel execution by default

ThreadLocal DriverManager

One driver per thread, isolated and thread-safe. Scale across methods or classes with a config flag.

CI that configures itself

CiEnvironmentDetector

Auto-detects GitHub Actions / Jenkins / GitLab. Headless forced, threads tuned, pass-rate gates enforced.

Extend it without forking it

SPI plugin toolkit

Registry-based plugins for custom drivers, hooks, and report adapters. The escape hatch most never need.

Before / after

Delete the boilerplate, keep the intent

No driver setup. No Thread.sleep(). No brittle CSS selectors. Just the test.

public class LoginTest extends BaseTest {

    @Test
    public void login() {
        open("/login");                    // baseUrl from config
        getByLabel("Username").fill("admin");
        getByLabel("Password").fill("secret");
        getByRole(Role.BUTTON)
            .withName("Sign in").click();  // auto-waits

        assertThat(getByText("Welcome"))
            .isVisible();                  // web-first, retries
    }
}
// Raw Selenium — you own all of this
WebDriver driver = new ChromeDriver();
driver.manage().timeouts()
    .implicitlyWait(Duration.ofSeconds(10));
driver.get("https://example.com/login");

Thread.sleep(2000); // hope the page is ready
driver.findElement(
    By.cssSelector("#login-form .btn-primary")).click();

// screenshots, retries, reporting, teardown…
// all your problem
driver.quit();

One ecosystem

Framework, MCP server, and IDE tooling

From a single dependency to AI-assisted, accessibility-first codegen right inside your editor.

Two credible reasons

Why Selenium Boot?

Whether you're maintaining a home-grown framework or already invested in Selenium.

Why not just build your own?

Roll your ownSelenium Boot
Write & maintain driver lifecycle, waits, retriesProvided, thread-safe, zero config
Build a reporting layer from scratchHTML report + JUnit XML included
Bespoke CI wiring per projectAuto-detects GitHub Actions / Jenkins / GitLab
Onboarding = "read our internal wiki"Onboarding = public docs + one dependency
You fix the bugsThe framework ships the fixes

Already invested in Selenium?

Playwright ideaIn Selenium Boot
Accessibility-first locatorsgetByRole / getByLabel / getByText — survive CSS refactors
Auto-waitingWaitEngine-backed actions — Thread.sleep() disappears
Web-first assertionsassertThat(...) that auto-retries until true
Convention over configurationZero-boilerplate defaults, optional selenium-boot.yml
Apache-2.0 · Java 17+ · TestNG & JUnit 5Maven Central ↗GitHub ↗PyPI ↗

Keep your test code. Delete the plumbing.

Add one dependency and focus on testing — not framework engineering.

<dependency>
  <groupId>io.github.seleniumboot</groupId>
  <artifactId>selenium-boot</artifactId>
  <version>3.2.0</version>
</dependency>