// the kit

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.

Buy the Kit — $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.

// real-data module

##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

See the proof image below ↓

##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.

Last updated . Screenshot is a live terminal capture from the kit running on a fresh Python 3.12 virtualenv.

##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.

// free sample

##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.

No spam. One-click unsubscribe.

Buy the Kit — $199 →
// instant download · production-ready · all sales final (it’s code)