import unittest
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 TestLoginWithRetry(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(5) # Implicit wait for element presence
self.wait = WebDriverWait(self.driver, 10) # Explicit wait
def login(self):
self.driver.get('https://example.com/login')
username_input = self.wait.until(EC.presence_of_element_located((By.ID, 'username')))
password_input = self.driver.find_element(By.ID, 'password')
login_button = self.driver.find_element(By.ID, 'loginBtn')
username_input.clear()
username_input.send_keys('testuser')
password_input.clear()
password_input.send_keys('Test@1234')
login_button.click()
# Wait for URL to change to dashboard
self.wait.until(EC.url_to_be('https://example.com/dashboard'))
def test_login_with_retry(self):
max_attempts = 3
for attempt in range(1, max_attempts + 1):
try:
self.login()
current_url = self.driver.current_url
self.assertEqual(current_url, 'https://example.com/dashboard')
print(f'Login succeeded on attempt {attempt}')
break
except (AssertionError, Exception) as e:
print(f'Attempt {attempt} failed: {e}')
if attempt == max_attempts:
self.fail(f'Login failed after {max_attempts} attempts')
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()This test script uses Python's unittest framework with Selenium WebDriver.
setUp: Initializes the Chrome browser and sets implicit and explicit waits.
login method: Opens the login page, fills username and password fields, clicks login, and waits explicitly for the dashboard URL.
test_login_with_retry: Tries to login up to 3 times. If the dashboard URL is reached, it passes. If not, it retries. After 3 failures, the test fails.
tearDown: Closes the browser after the test.
This approach uses explicit waits for reliability and a retry loop to handle flaky failures like slow page loads or temporary glitches.