0
0
Testing Fundamentalstesting~15 mins

Automation maintenance challenges in Testing Fundamentals - Build an Automation Script

Choose your learning style9 modes available
Verify login functionality with stable automation despite UI changes
Preconditions (2)
Step 1: Open the login page URL
Step 2: Enter 'user@example.com' in the email input field
Step 3: Enter 'Password123' in the password input field
Step 4: Click the login button
Step 5: Verify that the user is redirected to the dashboard page
✅ Expected Result: User successfully logs in and dashboard page is displayed
Automation Requirements - Selenium WebDriver with Python
Assertions Needed:
Verify the current URL is the dashboard URL after login
Verify the presence of a dashboard welcome message element
Best Practices:
Use explicit waits to handle dynamic page loading
Use Page Object Model to separate locators and actions
Use stable locators like IDs or data-test attributes instead of brittle XPaths
Handle UI changes by updating locators in one place (page objects)
Automated Solution
Testing Fundamentals
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):
        WebDriverWait(self.driver, 10).until(
            EC.visibility_of_element_located(self.email_input)
        ).send_keys(email)

    def enter_password(self, password):
        WebDriverWait(self.driver, 10).until(
            EC.visibility_of_element_located(self.password_input)
        ).send_keys(password)

    def click_login(self):
        WebDriverWait(self.driver, 10).until(
            EC.element_to_be_clickable(self.login_button)
        ).click()

class DashboardPage:
    def __init__(self, driver):
        self.driver = driver
        self.welcome_message = (By.ID, 'welcomeMsg')

    def is_welcome_message_displayed(self):
        return WebDriverWait(self.driver, 10).until(
            EC.visibility_of_element_located(self.welcome_message)
        ) is not None


def test_login():
    driver = webdriver.Chrome()
    driver.get('https://example.com/login')

    login_page = LoginPage(driver)
    login_page.enter_email('user@example.com')
    login_page.enter_password('Password123')
    login_page.click_login()

    WebDriverWait(driver, 10).until(
        EC.url_contains('/dashboard')
    )

    dashboard_page = DashboardPage(driver)
    assert dashboard_page.is_welcome_message_displayed(), 'Welcome message not displayed on dashboard'

    driver.quit()

This test script uses Selenium WebDriver with Python to automate the login functionality.

We use the Page Object Model to keep locators and actions organized in LoginPage and DashboardPage classes. This makes maintenance easier if UI changes.

Explicit waits ensure elements are ready before interacting, avoiding flaky tests.

Locators use stable IDs instead of brittle XPaths to reduce breakage when UI changes.

The test opens the login page, enters credentials, clicks login, waits for the dashboard URL, and asserts the welcome message is visible.

This structure helps handle automation maintenance challenges by isolating UI changes to page objects and using robust waits and locators.

Common Mistakes - 3 Pitfalls
Using hardcoded XPath locators that break easily when UI changes
Using implicit waits or no waits, causing flaky tests due to timing issues
Mixing test logic and locators directly in test scripts
Bonus Challenge

Now add data-driven testing with 3 different sets of login credentials (valid and invalid).

Show Hint