If you’re a QA engineer stepping into automation — or an SDET who just needs a quick refresher — this cheat sheet covers the Selenium + Python essentials you actually use at work.
No theory overload. No outdated patterns. Just practical examples you can copy, adapt, and scale.
Thanks for reading! Subscribe for free to receive new posts and support my work.
✅ Setup & Installation
Install Selenium:
pip install selenium
Make sure the correct browser driver is available in your system PATH:
Chrome → chromedriver
Firefox → geckodriver
Edge → msedgedriver
🚀 Starting the Browser
Launch Chrome
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(”https://example.com”)
Headless Mode (Recommended for CI)
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument(”--headless”)
options.add_argument(”--window-size=1920,1080”)
driver = webdriver.Chrome(options=options)
🔍 Locating Elements (The Most Important Skill)
Always prioritize reliable, stable locators.
from selenium.webdriver.common.by import By
Preferred Locators
driver.find_element(By.ID, “submit”)
driver.find_element(By.NAME, “email”)
driver.find_element(By.CSS_SELECTOR, “.login-button”)
driver.find_element(By.CSS_SELECTOR, “input[type=’password’]”)
XPath (Use Sparingly)
driver.find_element(By.XPATH, “//button[text()=’Login’]”)
✅ Tip: If your tests break often, your locators are probably the problem.
✍️ User Interactions
element.click()
element.send_keys(”user@test.com”)
element.clear()
Read values:
element.text
element.get_attribute(”value”)
⏳ Waiting for Elements (Non‑Negotiable)
Explicit Waits (Best Practice)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
login_btn = wait.until(
EC.element_to_be_clickable((By.ID, “login”))
)
Common conditions:
EC.presence_of_element_located
EC.visibility_of_element_located
EC.element_to_be_clickable
❌ Avoid time.sleep() — it causes flaky tests.
📄 Forms & Dropdowns
from selenium.webdriver.support.ui import Select
dropdown = Select(driver.find_element(By.ID, “country”))
dropdown.select_by_visible_text(”India”)
🔔 Alerts, Frames & Windows
Alerts
alert = driver.switch_to.alert
alert.accept()
iFrames
driver.switch_to.frame(”frameName”)
driver.switch_to.default_content()
Multiple Tabs
driver.switch_to.window(driver.window_handles[1])
📜 Scrolling & JavaScript
driver.execute_script(”window.scrollTo(0, document.body.scrollHeight)”)
driver.execute_script(”arguments[0].scrollIntoView()”, element)
📷 Screenshots (For Failing Tests)
driver.save_screenshot(”failure.png”)
element.screenshot(”button.png”)
🧹 Cleanup
driver.close()
driver.quit()
🚀 Selenium + Pytest: Real‑World Automation Setup
Selenium alone isn’t enough. Pytest makes your automation scalable, readable, and CI‑ready.
**
✅ Install Pytest**
pip install pytest
🧱 Project Structure (Recommended)
tests/
├── pages/
│ └── login_page.py
├── conftest.py
├── test_login.py
└── pytest.ini
🔁 Pytest WebDriver Fixture
conftest.py
import pytest
from selenium import webdriver
@pytest.fixture
def driver():
driver = webdriver.Chrome()
driver.maximize_window()
yield driver
driver.quit()
✅ Automatically manages setup & teardown
✅ Cleaner than setUp() / tearDown()
🧪 Writing a Test
def test_valid_login(driver):
driver.get(”https://example.com/login”)
driver.find_element(By.ID, “username”).send_keys(”admin”)
driver.find_element(By.ID, “password”).send_keys(”password”)
driver.find_element(By.ID, “login”).click()
assert “Dashboard” in driver.title
🧠 Using Page Object Model with Pytest
pages/login_page.py
class LoginPage:
def init(self, driver):
self.driver = driver
def login(self, user, pwd):
self.driver.find_element(By.ID, “username”).send_keys(user)
self.driver.find_element(By.ID, “password”).send_keys(pwd)
self.driver.find_element(By.ID, “login”).click()
test_login.py
def test_login_success(driver):
page = LoginPage(driver)
page.login(”admin”, “password”)
assert “Dashboard” in driver.title
🏷️ Pytest Markers (Power Feature)
@pytest.mark.smoke
def test_smoke_login():
pass
Run specific tests:
pytest -m smoke
📊 HTML Reports (CI‑Friendly)
pip install pytest-html
pytest --html=report.html
Top comments (0)