Bird
Raised Fist0
Selenium Pythontesting~15 mins

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

Choose your learning style10 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

Practice

(1/5)
1. What is the main reason CAPTCHAs are difficult to handle with Selenium automation?
easy
A. CAPTCHAs are designed to block automated scripts from interacting with the page.
B. Selenium does not support clicking buttons.
C. CAPTCHAs require special browser plugins.
D. Selenium cannot open web pages with CAPTCHAs.

Solution

  1. Step 1: Understand CAPTCHA purpose

    CAPTCHAs are security tools to stop bots and automated scripts from accessing certain parts of websites.
  2. Step 2: Selenium's limitation

    Selenium automates browsers but cannot solve CAPTCHAs because they require human-like recognition or external solving.
  3. Final Answer:

    CAPTCHAs are designed to block automated scripts from interacting with the page. -> Option A
  4. Quick Check:

    CAPTCHA blocks automation = D [OK]
Hint: CAPTCHAs stop bots, Selenium alone can't bypass them [OK]
Common Mistakes:
  • Thinking Selenium can solve CAPTCHAs automatically
  • Believing CAPTCHAs need special plugins
  • Assuming Selenium can't open pages with CAPTCHAs
2. Which of the following is a valid Python Selenium code snippet to pause the test for manual CAPTCHA solving?
easy
A. time.sleep(30)
B. driver.wait(30)
C. driver.pause(30)
D. sleep(30)

Solution

  1. Step 1: Identify correct pause method in Python

    Python's standard way to pause execution is using time.sleep(seconds), so time.sleep(30) pauses for 30 seconds.
  2. Step 2: Check Selenium driver methods

    Selenium WebDriver does not have pause() or wait() methods directly; wait() is for conditions, not fixed sleep.
  3. Final Answer:

    time.sleep(30) -> Option A
  4. Quick Check:

    Pause test with time.sleep() = C [OK]
Hint: Use time.sleep(seconds) to pause in Python Selenium [OK]
Common Mistakes:
  • Using driver.pause() which doesn't exist
  • Calling sleep() without importing time
  • Confusing wait() with sleep()
3. Consider this code snippet to handle CAPTCHA manually:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://example.com/captcha')
time.sleep(60)  # wait for manual CAPTCHA solve
button = driver.find_element(By.ID, 'submit')
button.click()

What will happen if the CAPTCHA is not solved within 60 seconds?
medium
A. The submit button will be clicked regardless of CAPTCHA status.
B. The test will fail because the CAPTCHA blocks the submit button.
C. Selenium will automatically solve the CAPTCHA after 60 seconds.
D. The script will throw a syntax error.

Solution

  1. Step 1: Analyze the code flow

    The script waits 60 seconds for manual CAPTCHA solving, then tries to click the submit button.
  2. Step 2: Understand CAPTCHA effect

    If CAPTCHA is not solved, the submit button is usually disabled or blocked, so clicking won't succeed or may cause failure.
  3. Final Answer:

    The test will fail because the CAPTCHA blocks the submit button. -> Option B
  4. Quick Check:

    Unsolved CAPTCHA blocks submit = B [OK]
Hint: Unsolved CAPTCHA blocks actions, causing test failure [OK]
Common Mistakes:
  • Assuming Selenium solves CAPTCHA automatically
  • Thinking submit button always clickable
  • Expecting syntax errors from this code
4. You wrote this Selenium code to bypass CAPTCHA by disabling it in test environment:
from selenium.webdriver.common.by import By
driver.get('https://example.com')
driver.find_element(By.ID, 'captcha').click()

But it throws NoSuchElementException. What is the likely cause?
medium
A. The driver.get() method does not open the page.
B. The locator 'id' is incorrect syntax in Selenium.
C. The CAPTCHA element is not present because it is disabled in the test environment.
D. The click() method is not supported on elements.

Solution

  1. Step 1: Understand NoSuchElementException cause

    This error means Selenium cannot find the element with id 'captcha' on the page.
  2. Step 2: Check test environment setup

    If CAPTCHA is disabled in test environment, the element won't exist, causing this error.
  3. Final Answer:

    The CAPTCHA element is not present because it is disabled in the test environment. -> Option C
  4. Quick Check:

    Disabled CAPTCHA means no element = A [OK]
Hint: NoSuchElement means element missing, likely disabled CAPTCHA [OK]
Common Mistakes:
  • Thinking 'id' locator syntax is wrong
  • Assuming driver.get() fails silently
  • Believing click() is unsupported
5. You want to automate a login page with CAPTCHA using Selenium. Which strategy best balances automation and test reliability?
hard
A. Ignore CAPTCHA and try to submit the form directly every time.
B. Pause the test and ask a human tester to solve the CAPTCHA manually during test execution.
C. Use a CAPTCHA solving service API integrated into your test to solve CAPTCHAs automatically.
D. Disable CAPTCHA only in the test environment and run tests without CAPTCHA.

Solution

  1. Step 1: Evaluate automation vs reliability

    CAPTCHA solving services may be unreliable or costly; manual solving slows tests; ignoring CAPTCHA causes failures.
  2. Step 2: Consider test environment control

    Disabling CAPTCHA in test environment allows smooth automated tests without blocking, improving reliability and speed.
  3. Final Answer:

    Disable CAPTCHA only in the test environment and run tests without CAPTCHA. -> Option D
  4. Quick Check:

    Disable CAPTCHA in test env = best balance = A [OK]
Hint: Disable CAPTCHA in test environment for reliable automation [OK]
Common Mistakes:
  • Relying on unreliable CAPTCHA solving services
  • Ignoring CAPTCHA causing test failures
  • Pausing tests slows automation
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard