A framework that does not depend on someone else’s demo site
Public test sites change, disappear or throttle automated traffic. That makes them a weak foundation for a portfolio framework because an unrelated change can turn every build red.
Orbit QA includes a small deterministic commerce system as the target. The full UI and API suite can run locally after cloning, with no account, paid service or unstable third-party dependency.
The project is less about producing a large number of tests and more about showing how tests remain readable, repeatable and useful when something goes wrong.
Clear ownership inside the framework
Fixtures own infrastructure and cleanup. Page objects own browser mechanics. Tests own assertions. Keeping those responsibilities separate means a browser change, a page change and a product regression fail in recognisably different places.
Synchronisation and selectors chosen for stability
The UI uses stable data-testid selectors and explicit waits for the condition each action genuinely needs. There are no fixed sleeps or broad implicit waits hiding timing problems.
Explicit waits
Each wait describes the state required before the test continues.
Small page objects
Reusable actions remove repetition without swallowing useful Selenium errors.
Selenium Manager
Local drivers are resolved without a machine-specific path in source.
Versioned test data
Non-secret cases are readable and reproducible across environments.
Runtime options allow Chrome, Firefox, headed execution, a remote Grid, another compatible base URL and an adjustable explicit-wait timeout without changing test code.
A failed check should leave something useful behind
When a browser assertion fails, the driver fixture writes both a screenshot and the matching HTML source. The screenshot shows what a person saw. The DOM snapshot helps investigate selectors, hidden states and rendered markup.
HTML and JUnit reports are produced alongside coverage output. CI uploads these artifacts even after a failed job, so the evidence is not lost precisely when it matters most.
The framework emits portable JUnit XML rather than coupling directly to a live test-management account. A separate adapter can consume those results later without putting credentials or vendor configuration into the core suite.
Fast framework feedback separated from browser compatibility
The GitHub Actions workflow runs Ruff and unit/API tests on Python 3.10 and 3.12. Complete suites then run separately in Chrome and Firefox with HTML, JUnit and branch-coverage reporting.
This matrix keeps the signal specific. A Python compatibility issue, API-contract change and browser-specific regression do not collapse into one vague failed build. The 80% branch-coverage threshold acts as a quality gate, not a vanity badge.