from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.email_input = (By.ID, 'email')
self.password_input = (By.ID, 'password')
self.login_button = (By.ID, 'loginBtn')
def enter_email(self, email):
email_field = WebDriverWait(self.driver, 10).until(
EC.visibility_of_element_located(self.email_input))
email_field.clear()
email_field.send_keys(email)
def enter_password(self, password):
password_field = WebDriverWait(self.driver, 10).until(
EC.visibility_of_element_located(self.password_input))
password_field.clear()
password_field.send_keys(password)
def click_login(self):
login_btn = WebDriverWait(self.driver, 10).until(
EC.element_to_be_clickable(self.login_button))
login_btn.click()
def test_login():
driver = webdriver.Chrome()
driver.get('https://example.com/login')
login_page = LoginPage(driver)
login_page.enter_email('testuser@example.com')
login_page.enter_password('Test@1234')
login_page.click_login()
WebDriverWait(driver, 10).until(
EC.url_contains('/dashboard'))
assert '/dashboard' in driver.current_url, 'Dashboard URL not loaded after login'
driver.quit()
This code uses the Page Object Model (POM) to organize test code.
The LoginPage class holds all locators and actions for the login page. This keeps selectors and interaction logic in one place.
The test function test_login uses this class to perform steps clearly and simply.
Explicit waits ensure elements are ready before interacting, avoiding flaky tests.
Assertions check that the login succeeded by verifying the URL.
This separation makes the test easier to read, maintain, and update if the page changes.