Master Selenium WebDriver from scratch in 30 days. Every lesson includes complete code examples in both C# and Python, so you can follow whichever track fits your background -- or learn both side by side.
Before starting this course, you should have:
- General: Basic understanding of HTML, CSS, and how web pages work (DOM structure, forms, links)
- For C# Track: Visual Studio 2019+ or VS Code with C# extension, .NET 6+ SDK installed, basic C# syntax knowledge (variables, loops, classes, methods)
- For Python Track: Python 3.8+ installed, a code editor (VS Code, PyCharm), basic Python syntax knowledge (variables, loops, functions, classes)
- Browser: Google Chrome (latest) or Mozilla Firefox (latest) installed
- OS: Windows 10/11, macOS, or Linux
No prior Selenium or test automation experience is required.
- Pick your track -- C# (NUnit) or Python (PyTest) -- or follow both.
- Complete one day per day. Each lesson is designed to take 1-2 hours including practice exercises.
- Type the code yourself. Do not copy-paste. Muscle memory matters for automation.
- Run every example against the practice websites listed below.
- Use the Cheat Sheets as quick-lookup references while coding.
- Build the Final Project in Week 4 to tie everything together.
| Day | Topic |
|---|---|
| Day 01 | Setup and First Script |
| Day 02 | Locators: ID, Name, ClassName, TagName |
| Day 03 | XPath (Absolute vs Relative) |
| Day 04 | CSS Selectors |
| Day 05 | Browser Actions: Click, SendKeys, Clear, Submit |
| Day 06 | Navigation: Back, Forward, Refresh, URL, Title |
| Day 07 | Dropdowns, Checkboxes, and Radio Buttons |
| Day | Topic |
|---|---|
| Day 08 | Implicit vs. Explicit Wait |
| Day 09 | Fluent Wait and ExpectedConditions |
| Day 10 | Alerts: Accept, Dismiss, GetText, SendKeys |
| Day 11 | Frames and iFrames |
| Day 12 | Multiple Windows and Tabs |
| Day 13 | Dynamic Elements: AJAX, Lazy Loading, Stale Elements |
| Day 14 | File Upload and Download |
| Day | Topic |
|---|---|
| Day 15 | NUnit / PyTest Setup |
| Day 16 | Test Lifecycle: Setup, Teardown, Fixtures |
| Day 17 | Page Object Model (POM) |
| Day 18 | Page Factory Pattern |
| Day 19 | Config Files: JSON/YAML for Environment-Driven Execution |
| Day 20 | Data-Driven Testing |
| Day 21 | Logging and Reporting |
| Day | Topic |
|---|---|
| Day 22 | JavaScriptExecutor |
| Day 23 | Shadow DOM |
| Day 24 | Screenshots on Failure + Test Evidence |
| Day 25 | Headless Mode: Chrome and Firefox |
| Day 26 | Selenium Grid: Hub/Node Architecture |
| Day 27 | Parallel Execution: Multi-Browser, Multi-Thread |
| Day 28 | CI/CD Integration: GitHub Actions |
| Day 29 | Framework Finalization: Structure and Conventions |
| Day 30 | Final Project: Complete E2E Framework |
| Resource | Description |
|---|---|
| Quick Reference | Side-by-side C# / Python syntax for all common operations |
| Glossary | Definitions of every Selenium term you will encounter |
-
Install .NET SDK (6.0 or later) from https://dotnet.microsoft.com/download.
-
Create a test project:
dotnet new nunit -n SeleniumCourse cd SeleniumCourse -
Add Selenium packages:
dotnet add package Selenium.WebDriver dotnet add package Selenium.Support dotnet add package WebDriverManager
-
Verify -- create a simple test that opens a browser:
using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using WebDriverManager; using WebDriverManager.DriverConfigs.Impl; [TestFixture] public class SetupCheck { private IWebDriver driver; [SetUp] public void Setup() { new DriverManager().SetUpDriver(new ChromeConfig()); driver = new ChromeDriver(); } [Test] public void BrowserOpens() { driver.Navigate().GoToUrl("https://www.google.com"); Assert.That(driver.Title, Does.Contain("Google")); } [TearDown] public void Teardown() { driver.Quit(); } }
-
Run:
dotnet test
-
Install Python 3.8+ from https://www.python.org/downloads/.
-
Create a virtual environment:
python -m venv venv source venv/bin/activate # Linux/macOS venv\Scripts\activate # Windows
-
Install packages:
pip install selenium pytest webdriver-manager
-
Verify -- create
test_setup.py:import pytest from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager @pytest.fixture def driver(): service = Service(ChromeDriverManager().install()) drv = webdriver.Chrome(service=service) yield drv drv.quit() def test_browser_opens(driver): driver.get("https://www.google.com") assert "Google" in driver.title
-
Run:
pytest test_setup.py -v
These sites are purpose-built for Selenium practice and will not break when you automate against them:
| Website | URL | Good For |
|---|---|---|
| The Internet (Heroku) | https://the-internet.herokuapp.com | All core concepts: login, forms, alerts, frames, uploads, dynamic loading |
| Sauce Demo | https://www.saucedemo.com | E-commerce flow: login, product selection, cart, checkout |
| DemoQA | https://demoqa.com | Forms, widgets, interactions, book store API |
| Automation Exercise | https://automationexercise.com | Full e-commerce test scenarios with an API |
| Practice Automation | https://practice-automation.com | Sliders, popups, modals, calendars |
| UI Testing Playground | http://uitestingplayground.com | Tricky scenarios: dynamic IDs, AJAX, hidden layers |
| Selenium Playground (LambdaTest) | https://www.lambdatest.com/selenium-playground | Input forms, tables, alerts, drag-and-drop |
| OrangeHRM Demo | https://opensource-demo.orangehrmlive.com | Real-world HR app login and navigation |
Happy automating!