You've built the framework. This lesson is the wrap-up: a self-assessment to check the work meets the bar, the remaining tests to fill out the suite, the stretch goals to tackle if you want to push further, and the README that turns this from "code on disk" into "portfolio piece on GitHub." A capstone you can point to in interviews is the single highest-leverage outcome of this entire course — every chapter exists to land you here.
Self-assessment checklist
Walk through this list against your repository. Be honest — half-done items are technical debt you'll fix later, not items to wave off:
Foundation
-
mvn clean test -DsuiteFile=smoke.xmlruns green on a fresh clone -
pom.xmlhas all dependencies; no manually-installed JARs -
.gitignoreexcludestarget/,.idea/, IDE settings, screenshots - README documents prerequisites (Java 21, Maven 3.9), commands to run, environment variables
Code structure
-
BaseTest,BasePage,DriverManagerlive inbase/ - Every page object extends
BasePage; every test class extendsBaseTest - No raw
findElement/WebDriverWaitcalls in test classes — all hidden in page objects - Locators are
private static final Byconstants at the top of each page class
Tests
- 25+ test methods total
- Tagged with
groups = {"smoke"}orgroups = {"regression"} - Search (5), booking flow (5), user account (5), cross-browser (5), data-driven (5)
- Tests pass independently — running any one in isolation works
- No
Thread.sleepcalls anywhere
Reliability
-
ScreenshotListenerregistered intestng.xml; PNGs appear undertarget/screenshots/on failure -
RetryAnalyzerapplied selectively (not blanket — only known-flaky tests) - All waits are
WebDriverWait+ExpectedConditions; noThread.sleep
Data
-
routes.xlsxexists with 5+ rows;ExcelReaderparses it cleanly -
users.jsonexists with 5+ entries; Jackson POJO maps to it - Test data is checked into the repo (no real secrets)
Parallel + cross-browser
-
DriverManagerusesThreadLocal<WebDriver> -
cross-browser.xmlhasparallel="tests"with Chrome + Firefox blocks - Smoke or regression suite has
parallel="methods" thread-count="4"
CI
- GitHub Actions workflow (or Jenkinsfile) at the repo root
- Triggers on push, PR, and nightly cron
- Surefire reports uploaded as artefacts
- Status check enforced on PRs targeting
main
If every box ticks, you have a production-grade Selenium framework. If most tick but a few don't, knock those out first — they're usually faster to fix than the existing parts took to build.
Reflection questions
While the work is fresh, write notes to your future-self answering:
- Which page object was the hardest? Usually it's the one with the most dynamic content — a payment iframe, a date picker, a search-results table. The hard ones are where you learned the most about waits and selectors.
- Which test failed most often during development? That's a flake to investigate further — was it timing, was it shared state, was it a real bug? The answer informs your strategy on the next project.
- What would you do differently if starting over? The honest answer is usually "structure the page objects earlier, write fewer raw
findElementcalls, parameterise headless mode from day one." Note these for your next framework — you'll skip the stumbles. - Where did Selenium genuinely make this hard? Maybe iframes, maybe the HTML5 drag-and-drop, maybe parallel safety. Note these as candidates to evaluate Playwright/Cypress against on your next project.
- What would the test author who joins next month need? That's your README. Write it for them.
Stretch goals
Pick one or two — done is better than impressive:
1. Selenium Grid in Docker. Add docker-compose.yml with a hub, three Chrome nodes, and two Firefox nodes. Update DriverManager to use RemoteWebDriver when -Dgrid.url=... is set. Run the full suite against the local Grid; total wall-clock should drop further as you scale nodes. The dashboard at http://localhost:4444/ui becomes part of your portfolio screenshots.
2. ExtentReports or Allure. Wire the listener from chapter 5 into either reporter. Add @Step annotations (Allure) or ExtentTest.log(...) calls (Extent) on key page methods. Generate the HTML and embed a screenshot in the README so reviewers can see the output without running anything.
3. BrowserStack or Sauce Labs cloud testing. Sign up for a free trial; add credentials to GitHub Actions secrets; create a cloud-cross-browser.yml workflow that runs one test against Safari on macOS — a browser you literally cannot install on a Linux runner. Demonstrating cloud-Selenium in your README is a strong signal.
4. API-side data setup. Before each test, hit a POST /api/test-users endpoint to seed a fresh user — eliminates inter-test data pollution and proves you can integrate Selenium with API testing. Pair with Rest Assured (the standard Java API client) for the API calls.
5. Performance budget tests. Use JavascriptExecutor to read performance.timing and assert that critical pages load within a budget (e.g., search results LCP < 2.5s). Tests that fail on perf regressions are unusual — and exactly the kind of thing senior QA roles ask for at interview.
6. Visual regression on key flows. Plug in a small pixel-diff library (or use Applitools's free tier) on the home page and confirmation page. Catches CSS regressions that functional tests miss.
Don't try to do all six. Pick the one or two most relevant to roles you're targeting.
The README — turning code into portfolio
The single most-read file in your repo is the README. Make it count:
# FlyRight Selenium Tests
Full Selenium WebDriver + TestNG framework for the FlyRight flight booking application.
Built across Maven, Page Object Model, parallel cross-browser execution, and GitHub Actions CI.
## Quick start
```bash
git clone https://github.com/youruser/flyright-selenium-tests
cd flyright-selenium-tests
mvn clean test -DsuiteFile=smoke.xml -Dheadless=true
```
## What's inside
- Maven + TestNG framework with WebDriverManager, Apache POI, Jackson
- 27 test methods across 5 categories: search, booking, account, cross-browser, data-driven
- Page Object Model with fluent interface and BasePage inheritance
- ThreadLocal driver for parallel execution (4 threads, ~3× speedup)
- Excel + JSON test data via @DataProvider
- Screenshot-on-failure via ITestListener
- Cross-browser: Chrome + Firefox in parallel TestNG `<test>` blocks
- GitHub Actions: smoke on every push, regression on PR, cross-browser nightly
## Project layout
(diagram of folders)
## Suites
- `smoke.xml` — 5 must-pass tests, ~2 min runtime
- `regression.xml` — full 27-test coverage, ~10 min
- `cross-browser.xml` — Chrome + Firefox in parallel, ~12 min
## CI
[GitHub Actions badge here] Tests run on every push and PR; nightly cross-browser at 06:00 UTC.
## Skills demonstrated
Selenium 4 / TestNG / Maven / Page Object Model / DataProvider / ThreadLocal /
Apache POI / Jackson / GitHub Actions / Allure / Cross-browser
## Author
Your Name — [LinkedIn](...) — [Portfolio](...)A clear, scannable README signals to reviewers that the engineer behind it pays attention to the things that aren't strictly code — and that's most of senior QA work.
Where to go next
You finished an intermediate-level Selenium course and have a portfolio piece to prove it. Three directions worth considering:
- – Cucumber BDD with Selenium
- – TestNG advanced — IInvokedMethodListener, @Factory
- – Custom Selenium 4 features (CDP, BiDi)
- – Selenide — opinionated wrapper over Selenium
- – API testing with Rest Assured
- – JUnit 5 — alternative to TestNG
- – Database testing with JDBC
- – Performance testing with JMeter / Gatling
- – Playwright with Java — modern alternative
- – Cypress with TypeScript — frontend-leaning
- – Pytest + Playwright — Python world
- QA Architect role — framework design at scale –
- SDET / Test Engineer roles –
- DevOps adjacency — pipelines, observability –
- Open-source contribution to Selenium itself –
The pragmatic recommendation:
- If you want maximum employability immediately, deepen Selenium-with-Java further: take the Cucumber BDD course next, learn Rest Assured for API testing, and apply the same framework discipline.
- If you've felt Selenium's weight (waits, parallel, drag-drop), evaluate Playwright with TypeScript on a side project. The skills transfer; the ergonomics improve. Many shops now prefer Playwright for greenfield work.
- If you want to go architectural, focus on shared frameworks across your organisation: contribute to a central testing platform, formalise patterns, train others. The capstone you just built is the kind of thing you'd ship as a starter template.
Project work — finish strong
Take the framework over the line. 3–5 hours.
- Complete the remaining 12 test methods to hit the 25-test target. The user-account tests (login, registration, history, profile, logout) are the most common gaps — finish them.
- Pick one stretch goal and complete it end-to-end. Don't half-do three; fully ship one. The most common "interviewer noticed it on the README" stretches are the Docker Grid setup and the cloud cross-browser run.
- Write the README. Use the template above. Add a screenshot of the GitHub Actions run summary, and a screenshot of your Allure or Extent report. Visuals matter.
- Push and protect. Push to
main. Add a branch protection rule requiring the smoke check before merging PRs. Open a fake PR with a deliberate failure to confirm the gate works. Merge a fix to confirm it goes green. - Add the project to your CV/LinkedIn. Bullet form: "Built end-to-end Selenium + TestNG framework for a flight booking application — Maven, POM, ThreadLocal driver, parallel cross-browser execution, GitHub Actions CI, 27 automated tests across smoke and regression suites." The repo URL goes in your portfolio.
You've finished. Eight chapters, thirty-five lessons, a real framework, a portfolio piece. The skills are real, the project is shareable, and the next interview that asks "tell me about a Selenium project you've built" has a complete, public, runnable answer.
Now go ship something. The best engineers don't stop at "the course said it works" — they keep building, keep breaking, keep learning. Pick the next problem that interests you and start.