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.presence_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.presence_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('TestPass123')
login_page.click_login()
WebDriverWait(driver, 10).until(
EC.url_contains('/dashboard')
)
assert '/dashboard' in driver.current_url, 'Dashboard URL not found after login'
driver.quit()
This code uses the Page Object Model to organize the login page interactions.
The LoginPage class stores locators and methods to interact with the email, password, and login button elements.
Each method uses explicit waits to ensure elements are present or clickable before interacting, which avoids timing issues.
The test function test_login opens the browser, navigates to the login page, uses the page object methods to enter credentials and click login, then waits for the dashboard URL to appear.
Finally, it asserts the URL contains '/dashboard' to confirm successful login and closes the browser.