import os
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class LoginTest(unittest.TestCase):
def setUp(self):
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
self.driver = webdriver.Chrome(options=chrome_options)
self.driver.implicitly_wait(5)
self.base_url = os.getenv('BASE_URL', 'https://example.com/login')
def test_login(self):
driver = self.driver
driver.get(self.base_url)
email_input = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'email'))
)
email_input.send_keys('admin@test.com')
password_input = driver.find_element(By.ID, 'password')
password_input.send_keys('Pass123!')
login_button = driver.find_element(By.ID, 'login-btn')
login_button.click()
WebDriverWait(driver, 10).until(
EC.url_contains('/dashboard')
)
self.assertIn('/dashboard', driver.current_url)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()This script uses Python's unittest framework with Selenium WebDriver.
In setUp, we configure Chrome to run headlessly for CI environments and set the base URL from an environment variable for flexibility.
The test_login method opens the login page, waits explicitly for the email input to appear, enters credentials, clicks login, then waits for the URL to contain '/dashboard' to confirm successful login.
Assertions check the URL to verify the test passed.
Finally, tearDown quits the browser to clean up.
This structure ensures the test runs reliably in a CI pipeline without opening a visible browser window.