Selenium Pro Automation KitPython
A production-ready Selenium framework. Python 3.11+. BasePage with 13 methods. POM pattern. pytest + pytest-xdist parallel. 5 custom ExpectedConditions. Retry decorators. Faker factories. Allure reporting. GitHub Actions matrix CI. 24 passing tests. $199.
Already own a kit? Sign in for $169 owner pricing.
##Everything included: BasePage, POM, custom waits, retries, CI
Twelve production-grade pieces of a Selenium test automation framework — wired together, documented, and ready to ship.
Real-Data Module ↓
Drop in a Postgres, MySQL, or MongoDB connection string and pull random rows straight from your real DB — no mocks, no fixtures to maintain. Unicode + apostrophe + locale safety, seeded reproducibility, and an identifier-injection guard on every query. CI-verified against live databases every release.
BasePage with 13 Methods
413-line BasePage with find / find_visible / safe_click / type_text / hover / scroll_into_view / wait_for_url_contains / select_dropdown / screenshot — typed, logged, and retry-safe. Every page object inherits from it. Stop rewriting wait logic.
Page Object Model
LoginPage, InventoryPage, CartPage, CheckoutPage — real data-test selectors, chaining returns, module-level Locator constants. The canonical Python POM pattern, done right.
pytest 8 + pytest-xdist
A 346-line conftest.py with driver fixture, login fixture, auto-screenshot-on-failure hook, and Allure environment writer. --browser / --headless / --base-url CLI options out of the box. Same suite runs local and CI.
5 Custom ExpectedConditions
text_to_be_not_empty, text_to_contain, element_count_to_be, element_count_at_least, attribute_value_to_be — plus poll_until and wait_for_elements helpers. Replace every time.sleep() in your suite with a real condition.
retry_on_exception Decorator
StaleElementReferenceException is how Selenium works, not a bug to fight. The retry_on_exception decorator factory (and pre-configured retry_stale variant) re-runs the locator lookup, not the dead reference.
Faker Data Factories
build_user(), build_product(), build_checkout() — Faker-powered, seedable for repro. Plus JSON-backed canonical fixtures (users.json, products.json) for tests that need exact values.
Allure Reporting
Every test annotated with @allure.story, @allure.severity, and with allure.step() contexts. Auto-screenshot on failure via pytest_runtest_makereport. Environment metadata written via pytest_sessionstart.
Selenium Manager Built In
No chromedriver or geckodriver pinning. No webdriver-manager dependency. Selenium 4.6+ ships with Selenium Manager — drivers resolve automatically on every machine and every CI runner.
GitHub Actions Matrix CI
3 shards × 2 browsers (Chrome + Firefox) = 6 concurrent jobs. --reruns=2 for transient failures. Allure aggregation job uploads a single report artifact. E2E Complete status check for branch protection.
Ruff + black + mypy
pyproject.toml, ruff.toml, mypy.ini all pre-configured. Type-hinted end to end. Lint workflow runs ruff + black + mypy in three parallel jobs under 60 seconds.
24 Tests Against SauceDemo
Login, inventory, checkout, and API-vs-UI cart specs run against saucedemo.com. Clone, pip install, pytest — you see a real test suite go green in minutes.
Obsessive Documentation
15 KB README plus 7 deep-dive guides in docs/: PAGE_OBJECT_PATTERN, WAITS_AND_FLAKE, FIXTURES_AND_FACTORIES, PARALLEL_EXECUTION, CI_CD, TROUBLESHOOTING. 2,500+ lines of explanation.
##What the code looks like
Real snippets from the kit. Type-hinted, Pythonic, retry-aware.
src/pages/login_page.pyfrom selenium.webdriver.common.by import By
from .base_page import BasePage
class LoginPage(BasePage):
USERNAME = (By.CSS_SELECTOR, "[data-test='username']")
PASSWORD = (By.CSS_SELECTOR, "[data-test='password']")
LOGIN_BTN = (By.CSS_SELECTOR, "[data-test='login-button']")
def login(self, username: str, password: str) -> "InventoryPage":
self.type_text(self.USERNAME, username)
self.type_text(self.PASSWORD, password)
self.safe_click(self.LOGIN_BTN)
return InventoryPage(self.driver)tests/e2e/test_checkout.pyimport allure
import pytest
from src.factories import build_checkout
@allure.story("Checkout")
@pytest.mark.e2e
def test_checkout_completes(logged_in_inventory):
checkout = build_checkout()
with allure.step("Add item and start checkout"):
cart = (logged_in_inventory
.add_to_cart("sauce-labs-backpack")
.go_to_cart())
confirmation = (cart
.checkout()
.fill_information(checkout)
.finish())
assert confirmation.is_complete().github/workflows/e2e.ymlname: E2E Tests
on: [push, pull_request]
jobs:
e2e:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
browser: [chrome, firefox]
shard: [1, 2, 3]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: '3.12' }
- run: pip install -e ".[dev]"
- run: pytest --browser=${{ matrix.browser }} --headless
env: { PYTEST_SHARD: ${{ matrix.shard }}/3 }##Plug into GitHub Actions in under an hour
Where Selenium Pro Python sits next to pip-installing Selenium yourself, other paid kits, and the Cypress / Playwright alternatives.
// vs. pip install selenium
pip install gives you the WebDriver client and nothing else. This kit gives you the entire production framework AND the CI pipeline AND 24 real passing tests against SauceDemo. You start at week 4, not day 1.
// vs. other paid kits ($200-$500)
Same scope as paid kits priced 2-5x higher. No subscription, no per-seat pricing, no vendor lock-in. One-time $199, lifetime access, instant download.
// vs. Cypress / Playwright
Pick Selenium if your team is already on Selenium, if you need the W3C WebDriver standard, or if your shop is Python-first and pytest is the test runner. Cypress Pro and Playwright Pro exist as sibling kits if your tooling points the other way.
##Test against your real data, not mocks
Drop in a connection string and pull random rows straight from your Postgres, MySQL, or MongoDB. Unicode names, apostrophes, NULLs, weird locales — all the production data that breaks mock-based tests gets exercised every run.
Drop-in. No fixtures to maintain.
- One line to connect — Postgres, MySQL, or MongoDB
- Random rows or filtered rows, with seeded reproducibility
- Unicode + apostrophe + locale safety baked in
- Identifier-injection guard on every table/column name
- UI assertions that compare DOM text to the actual DB row
tests/test_checkout.pyfrom framework.services.real_data import real_data
db = real_data(kind="postgres", url=os.environ["DB_URL"])
db.connect()
# Pull a real customer with a real order from your DB
customer = db.get_random_rows(
"customers",
count=1,
where={"tier": {"op": "eq", "value": "enterprise"}},
seed="checkout-fixture-1", # reproducible across runs
)[0]
driver.get(f"/account/{customer['id']}")
assert driver.find_element(By.CSS_SELECTOR, "[data-test=name]").text == customer["name"]
assert driver.find_element(By.CSS_SELECTOR, "[data-test=email]").text == customer["email"]
assert driver.find_element(By.CSS_SELECTOR, "[data-test=country]").text == customer["country"]Verified in CI every release
Every release runs the kit's full test suite against ephemeral Postgres, MySQL, and MongoDB containers in GitHub Actions. The proof image just below this section is the actual terminal output of that run — no edits, no rebuilds.
- 30 round-trip tests against live DBs (10 per adapter)
- Unicode round-trip: Müller, 山田, García, Lefèvre
- Apostrophe round-trip: O'Hara
- SQL identifier-injection guard test suite
- Seeded reproducibility — same seed = same row, every run
##Proof it works
Real local run. The kit’s 33-test suite executed end-to-end against live saucedemo.com in Chrome headless — every browser, API, and API-vs-UI test green. Re-runnable on any clone.
##Questions QA engineers ask
Does it require a paid Selenium grid?
No. The kit ships with pure GitHub Actions parallel sharding via pytest-xdist — no Selenium Grid, Sauce Labs, or BrowserStack subscription required. The docs/CI_CD.md guide covers how to add a remote grid when you are ready.
What version of Selenium does this target?
Selenium 4.x. Selenium Manager (built into Selenium 4.6+) handles driver downloads automatically — no chromedriver/geckodriver pinning, ever.
How does it handle stale element references?
The retry_on_exception decorator (and its pre-configured retry_stale variant) re-runs the locator lookup on StaleElementReferenceException, not the dead reference. The full pattern is documented in docs/WAITS_AND_FLAKE.md.
Can I use this with Django, Flask, or FastAPI test setups?
Yes. The framework is application-agnostic — point the --base-url CLI option at your local dev server and the same suite runs against it.
Does it work on macOS, Windows, and Linux?
Yes. CI matrix runs on Ubuntu; the framework itself runs on all three OSes. macOS Apple Silicon supported.
Is this beginner-friendly?
Yes. The 15 KB README walks through every step, from pip install to your first passing test. docs/PAGE_OBJECT_PATTERN.md and docs/WAITS_AND_FLAKE.md then teach you the framework patterns so you can extend it.
Why Selenium instead of Playwright?
Selenium 4 is the W3C WebDriver standard. Pick this kit if your team is already on Selenium, if you need cross-browser coverage across the full browser matrix (Safari, IE-equivalents), or if your shop is Python-first and pytest is the test runner.
What Python version does it require?
Python 3.11+. Tested on 3.11 and 3.12. Uses modern type hints and pyproject.toml — no requirements.txt, no legacy setup.py.
Is there support?
Yes. Email support is included with purchase — typical reply within 24 hours. You can also use the contact form on the site for any pre-sales questions.
##See the architecture before you buy
An 11-page PDF walking through every directory, every pattern, and the exact flow from npx playwright test down to the system under test.