0
0
Selenium Pythontesting~15 mins

Handling CAPTCHAs (strategies) in Selenium Python - Build an Automation Script

Choose your learning style9 modes available
Verify login functionality with CAPTCHA present
Preconditions (2)
Step 1: Open the login page URL
Step 2: Enter 'testuser@example.com' in the email field
Step 3: Enter 'TestPass123!' in the password field
Step 4: Attempt to solve CAPTCHA manually or bypass if possible
Step 5: Click the Login button
✅ Expected Result: User is logged in successfully and redirected to the dashboard page
Automation Requirements - Selenium with Python
Assertions Needed:
Verify the dashboard page URL after login
Verify presence of a welcome message or user profile element on dashboard
Best Practices:
Use explicit waits to wait for elements
Use Page Object Model to separate page interactions
Avoid hardcoding CAPTCHA solving; instead, detect CAPTCHA presence and skip or notify
Use environment flags or test modes to disable CAPTCHA in test environments if possible
Automated Solution
Selenium Python
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.captcha_frame = (By.CSS_SELECTOR, 'iframe[src*="captcha"]')
        self.login_button = (By.ID, 'login-btn')

    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 is_captcha_present(self):
        try:
            WebDriverWait(self.driver, 5).until(EC.frame_to_be_available_and_switch_to_it(self.captcha_frame))
            self.driver.switch_to.default_content()
            return True
        except:
            return False

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


def test_login_with_captcha():
    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!')

    if login_page.is_captcha_present():
        print('CAPTCHA detected. Manual intervention required or test skipped.')
        driver.quit()
        return

    login_page.click_login()

    # Verify dashboard URL
    WebDriverWait(driver, 10).until(EC.url_contains('/dashboard'))
    assert '/dashboard' in driver.current_url, 'Dashboard URL not loaded after login'

    # Verify welcome message presence
    welcome_msg = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, 'welcome-msg'))
    )
    assert welcome_msg.is_displayed(), 'Welcome message not displayed on dashboard'

    driver.quit()

if __name__ == '__main__':
    test_login_with_captcha()

This script uses Selenium with Python to automate login on a page that may have a CAPTCHA.

The LoginPage class encapsulates page elements and actions, following the Page Object Model for clarity and reuse.

We check if a CAPTCHA iframe is present by waiting for it briefly. If found, the test prints a message and stops, because automated CAPTCHA solving is not done here.

If no CAPTCHA is detected, the script enters credentials, clicks login, and waits for the dashboard URL and welcome message to confirm successful login.

Explicit waits ensure the script waits for elements properly, avoiding timing issues.

This approach respects best practices by not trying to bypass CAPTCHA automatically, which is often not possible or ethical, and instead detects it to handle accordingly.

Common Mistakes - 3 Pitfalls
Hardcoding CAPTCHA solving steps in automation
Using fixed sleep times instead of explicit waits
Ignoring CAPTCHA presence and proceeding with login
Bonus Challenge

Now add data-driven testing with 3 different sets of login credentials, including one invalid user.

Show Hint