DEV Community

Cover image for 🧪 Selenium with Python: A Practical Cheat Sheet for Modern Test Automation
Gayathri
Gayathri

Posted on

🧪 Selenium with Python: A Practical Cheat Sheet for Modern Test Automation

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)