Handling CAPTCHAs (strategies) in Selenium Python - Build an Automation Script
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.
Now add data-driven testing with 3 different sets of login credentials, including one invalid user.