// the kit

Selenium Pro Automation KitC#

A production-ready Selenium framework. .NET 8. BasePage with every wait helper. POM pattern. xUnit + IClassFixture collection fixtures. Polly stale-retry. Bogus data factories. Allure.Xunit. GitHub Actions matrix + Azure DevOps pipeline. 46 tests. Zero warnings. $199.

Buy the Kit — $199 →

Already own a kit? Sign in for $169 owner pricing.

##Everything included: BasePage, POM, xUnit fixtures, retries, CI

Twelve production-grade pieces of a Selenium + .NET 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 Every Wait Helper

A single BasePage owns Find, FindVisible, FindClickable, SafeClick, TypeText, Hover, ScrollIntoView, WaitForUrlContains, SelectDropdown, and screenshot capture. Every page object inherits and stays small. Stop rewriting WebDriverWait boilerplate across 40 page objects.

Page Object Model — Done Right

LoginPage, InventoryPage, CartPage, CheckoutPage — real data-test selectors, fluent return types so tests chain, static readonly By locators. The canonical .NET POM pattern with the failure modes already designed out.

xUnit 2.9 + IClassFixture

A DriverFixture wired via IClassFixture<T> for per-collection driver lifecycle. xunit.runner.json tuned for parallel collections. [Trait("Category", "...")] tagging so you can run smoke, regression, or API suites in isolation.

Custom Wait Extensions

Extension methods on IWebDriver and IWebElement: WaitForVisible, WaitForClickable, WaitForCount, WaitForTextContains, WaitForAttribute. No more scattered WebDriverWait<IWebDriver> instantiation. Reads clearly, fails loudly.

Polly-Based Stale Retry

StaleElementReferenceException is how Selenium works, not a bug. The Retry helper (built on Polly) re-runs the locator lookup, not the dead reference — exponential backoff, configurable predicate, one line per call site.

Bogus Data Factories

UserFactory, ProductFactory, CheckoutFactory — Bogus-powered, seedable for reproducible failure runs. Plus real saucedemo.com standard users wired in as constants so tests are runnable on day one.

Allure.Xunit Reporting

Every test annotated with [AllureFeature], [AllureSeverity], and AllureLifecycle.Instance.RunStep(...). Automatic screenshot-on-failure via [ScreenshotOnFailure]. Environment metadata written at suite start.

Selenium Manager Built In

No ChromeDriver, GeckoDriver, or EdgeDriver pinning. No NuGet drift between dev and CI. Selenium 4 ships with Selenium Manager — drivers resolve at runtime on every machine and every CI runner, every time.

GitHub Actions Matrix CI

A workflow that runs across Chrome, Firefox, and Edge in parallel — NuGet caching, Allure report aggregation, artifact upload on every push. The full matrix completes in under 5 minutes on a stock ubuntu-latest runner.

Azure DevOps Pipeline

azure-pipelines.yml plus a reusable templates/run-tests.yml. UseDotNet@2, .trx publish, code coverage collector, parallel test stages. Drop in your service connection and ship — production-grade out of the box.

46 Tests Across 5 Suites

Login (7), Inventory (11), Checkout (9), API-vs-UI Cart (6), and a pure-HTTP API suite (10). Clone, dotnet restore, dotnet test — you see a real test suite go green against saucedemo.com in minutes.

Obsessive Documentation

11 KB README plus 7 deep-dive guides in docs/: PAGE_OBJECT_PATTERN, WAITS_AND_FLAKE, FIXTURES_AND_FACTORIES, PARALLEL_EXECUTION, CI_CD, TROUBLESHOOTING, GITHUB_PUSH. 2,000+ lines of explanation, not just reference.

##What the code looks like

Real snippets from the kit. Nullable-enabled, typed end to end, retry-aware.

src/SeleniumPro/Pages/LoginPage.csusing OpenQA.Selenium;

namespace SeleniumPro.Pages;

public class LoginPage(IWebDriver driver) : BasePage(driver)
{
    private static readonly By Username = By.CssSelector("[data-test='username']");
    private static readonly By Password = By.CssSelector("[data-test='password']");
    private static readonly By LoginBtn = By.CssSelector("[data-test='login-button']");

    public InventoryPage LogIn(string user, string pass)
    {
        TypeText(Username, user);
        TypeText(Password, pass);
        SafeClick(LoginBtn);
        return new InventoryPage(Driver);
    }
}
tests/SeleniumPro.Tests/E2E/CheckoutTests.csusing FluentAssertions;
using SeleniumPro.Factories;
using Xunit;

[AllureFeature("Checkout")]
public class CheckoutTests(DriverFixture fx) : BaseTest(fx), IClassFixture<DriverFixture>
{
    [Fact, Trait("Category", "smoke")]
    public void Checkout_Completes_Happy_Path()
    {
        var checkout = CheckoutFactory.Build();

        var confirmation = LoggedInInventory
            .AddToCart("sauce-labs-backpack")
            .GoToCart()
            .Checkout()
            .FillInformation(checkout)
            .Finish();

        confirmation.IsComplete().Should().BeTrue();
    }
}
ci/azure-pipelines/azure-pipelines.ymltrigger: [main]

pool: { vmImage: ubuntu-latest }

stages:
  - stage: Test
    jobs:
      - job: Chrome
        steps:
          - template: templates/run-tests.yml
            parameters: { browser: chrome }
      - job: Firefox
        steps:
          - template: templates/run-tests.yml
            parameters: { browser: firefox }
      - job: Edge
        steps:
          - template: templates/run-tests.yml
            parameters: { browser: edge }

##Plug into GitHub Actions or Azure DevOps in under an hour

Where Selenium Pro C# sits next to dotnet add package yourself, other paid kits, and the Cypress / Playwright alternatives.

// vs. dotnet add package Selenium.WebDriver

NuGet gives you the WebDriver client and nothing else. This kit gives you the entire production framework AND the GitHub Actions + Azure DevOps pipelines AND 46 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. Read the full source before you ship.

// vs. Cypress / Playwright

Pick Selenium if your team is already on Selenium, if you need the W3C WebDriver standard, or if your shop is .NET-first with xUnit as the test runner. Cypress Pro and Playwright Pro C# 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/CheckoutTests.csusing Framework.Services.RealData;

var db = RealData.Create(new PostgresConfig {
    Url = Environment.GetEnvironmentVariable("DB_URL")
});
db.Connect();

// Pull a real customer with a real order from your DB
var customer = db.GetRandomRows("customers", new RandomQueryOptions {
    Count = 1,
    Where = Where.Eq("tier", "enterprise"),
    Seed = "checkout-fixture-1",  // reproducible across runs
})[0];

Driver.Navigate().GoToUrl($"/account/{customer["id"]}");
Assert.AreEqual(customer["name"],
    Driver.FindElement(By.CssSelector("[data-test=name]")).Text);

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 build. The full .NET 8 solution compiles with TreatWarningsAsErrors=true and nullable enabled — zero errors, zero warnings. 46 tests across 5 suites ready to run against saucedemo.com via dotnet test.

Last updated . Screenshot is a live terminal capture from the kit building on a fresh .NET 8 SDK install.

##Questions QA engineers ask

Why xUnit instead of NUnit or MSTest?

Selenium works with all three runners — none of them is wrong. xUnit is what `dotnet new xunit` scaffolds in 2024+, what most modern .NET QA teams adopt, and what Microsoft uses for many of its own .NET test suites. Importantly, this kit pairs with the Playwright Pro C# Kit on this same store, which uses NUnit — but for a specific reason: NUnit's [SetUpFixture] is the cleanest primitive for Playwright's storage-state pattern (one-time-per-suite multi-user auth). Selenium has no comparable storage-state primitive (you re-login per scenario), so xUnit's IClassFixture<DriverFixture> is the cleaner fit here. Each kit uses the runner that best matches its framework's own primitives. Both run side-by-side in the same solution without conflict.

What version of Selenium and .NET does this target?

Selenium 4.x on .NET 8. Selenium Manager (built into Selenium 4) resolves the driver binary at runtime — no ChromeDriver / GeckoDriver / EdgeDriver downloads or NuGet pinning, ever. Nullable reference types enabled. TreatWarningsAsErrors=true. Builds clean with zero warnings.

How does it handle stale element references?

A Polly-based Retry helper re-runs the locator lookup (not the dead element reference) on StaleElementReferenceException with exponential backoff. Wrap any flaky interaction in Retry.OnStale(() => element.Click()) — one line, no try/catch, no Thread.Sleep. The full pattern is documented in docs/WAITS_AND_FLAKE.md.

Will the C# Selenium kit and the C# Playwright kit run side-by-side?

Yes. They live in different test projects with different runner packages (xUnit vs NUnit) and different driver lifecycles. Both use FluentAssertions for assertions and the same Bogus-backed factory pattern for test data, so the surface area you have to learn is small. The full solution layout for a side-by-side setup is documented in the docs/ directory.

Can I run it in Azure DevOps?

Yes — ci/azure-pipelines/azure-pipelines.yml is a production-ready pipeline with UseDotNet@2, parallel test stages, .trx publishing, code coverage, and a reusable templates/run-tests.yml. Drop in your service connection and push.

Does this work with Chrome 120+, Firefox 121+, and Edge?

Yes. Selenium Manager auto-resolves the matching driver binary at runtime. The GitHub Actions matrix exercises all three browsers on every push, and the kit ships with browser-specific driver options pre-configured (headless, window size, download prefs).

Is API testing supported?

Yes. ApiClient.cs is an HttpClient-based wrapper with SauceDemoApi and HttpBinApi endpoint catalogs. The kit includes a dedicated tests/SeleniumPro.Tests/Api/ suite with 10 pure-HTTP tests (no browser, runs in seconds) plus an ApiVsUiCartTests suite demonstrating API-seeded UI verification — the pattern that takes a 4-minute UI test down to 30 seconds.

Is this beginner-friendly?

The kit assumes you already know what IClassFixture is and what async/await means. If you're new to .NET testing entirely, start with the official xUnit getting-started guide first, then come back. For mid-to-senior SDETs, the 11 KB README walks every component and the docs/ guides teach the patterns so you can extend the framework without breaking it.

Is there support?

Yes. Email support is included with purchase — typical reply within 24 hours. Reasonable bug fixes ship as free updates to all buyers. You can also use the contact form on the site for 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)