웹 자동화에서 캡차(CAPTCHA) 처리 전략 완벽 가이드

웹 자동화 테스트에서 캡차는 빈번하게 마주치는 장애물입니다. 특히 그래픽 캡차는 봇을 차단하기 위한 가장 흔한 방법으로, 테스트 스크립트가 정상적으로 동작하지 못하게 만듭니다. 이 글에서는 Selenium 기반 자동화 프레임워크에서 캡차를 효과적으로 처리하는 방법을 단계별로 살펴봅니다.

1. Selenium 환경 준비

먼저 Python 환경에서 Selenium을 설치해야 합니다. pip 명령어로 간단히 설치할 수 있습니다.

pip install selenium

설치가 완료되면 WebDriver 객체를 생성하여 브라우저를 제어합니다. 아래 코드는 Chrome 드라이버를 초기화하고 특정 URL로 이동하는 예제입니다.

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://example.com')

이제 브라우저가 자동으로 열리고 지정된 페이지가 로드됩니다.

2. 기본 자동화 테스트 케이스 작성

간단한 사용자 추가 및 로그인 검증 테스트를 작성해 보겠습니다.

def test_user_login():
    # 사용자명과 비밀번호 입력 필드 찾기
    user_input = browser.find_element_by_name('username')
    pass_input = browser.find_element_by_name('password')

    # 값 입력
    user_input.send_keys('testuser')
    pass_input.send_keys('testpass')

    # 현재 URL 저장
    before_login_url = browser.current_url

    # 로그인 버튼 클릭
    browser.find_element_by_id('loginBtn').click()

    # 로그인 후 URL 확인
    after_login_url = browser.current_url

    # 로그인 성공 여부 검증 (URL 변경 확인)
    assert before_login_url != after_login_url, "로그인 실패"

Selenium의 find_element_by_* 메서드를 활용하면 페이지 내 요소를 쉽게 찾고 조작할 수 있습니다.

3. 캡차 처리 기법

캡차는 자동화 테스트의 가장 큰 걸림돌 중 하나입니다. 주로 그래픽 캡차가 많이 사용되며, 이를 해결하기 위해 이미지 전처리와 OCR(광학 문자 인식) 기술을 적용할 수 있습니다.

3.1 캡차 이미지 획득

requests 라이브러리를 이용해 서버에서 캡차 이미지를 다운로드합니다.

import requests
from PIL import Image
from io import BytesIO

def fetch_captcha_image(image_url):
    response = requests.get(image_url)
    return Image.open(BytesIO(response.content))

3.2 이미지 전처리

PIL(Pillow) 라이브러리를 사용해 캡차 이미지를 전처리하면 OCR 인식률을 크게 높일 수 있습니다. 일반적인 전처리 단계는 다음과 같습니다.

  • 그레이스케일 변환: 컬러 이미지를 흑백으로 변환
  • 이진화: 임계값을 기준으로 픽셀을 흰색 또는 검은색으로 변환
  • 노이즈 제거: 미디언 필터 등을 적용하여 불필요한 점 제거
  • 문자 분할: 필요시 개별 문자로 분할

아래는 전처리 예제 코드입니다.

from PIL import ImageFilter

def preprocess_captcha(image):
    # 그레이스케일 변환
    gray_image = image.convert('L')

    # 이진화 (임계값 140)
    threshold = 140
    binary_image = gray_image.point(lambda p: 255 if p > threshold else 0)

    # 미디언 필터로 노이즈 제거
    denoised_image = binary_image.filter(ImageFilter.MedianFilter(size=3))

    return denoised_image

3.3 OCR로 캡차 텍스트 인식

pytesseract 라이브러리를 사용해 전처리된 이미지에서 텍스트를 추출합니다.

import pytesseract

def recognize_captcha_text(image):
    text = pytesseract.image_to_string(image, lang='eng')
    # 공백과 특수문자 제거
    clean_text = ''.join(filter(str.isalnum, text))
    return clean_text

3.4 자동화 테스트에 통합

이제 위 함수들을 조합하여 캡차를 포함한 로그인 테스트를 완성합니다.

def test_login_with_captcha():
    # 캡차 이미지 URL (예시)
    captcha_url = 'https://example.com/captcha.jpg'
    # 이미지 다운로드 및 전처리
    raw_image = fetch_captcha_image(captcha_url)
    processed_image = preprocess_captcha(raw_image)
    # 텍스트 인식
    captcha_code = recognize_captcha_text(processed_image)

    # 웹 페이지에 캡차 입력
    browser.find_element_by_id('captchaInput').send_keys(captcha_code)
    browser.find_element_by_id('loginBtn').click()

이 방식은 간단한 그래픽 캡차에 효과적이지만, 복잡한 변형이나 왜곡이 포함된 캡차는 인식률이 낮을 수 있습니다. 이러한 경우에는 수동 입력(on-demand)이나 전문 캡차 해결 서비스를 고려해야 합니다.

4. 마무리

웹 자동화 프레임워크에서 캡차 처리는 필수적인 요소입니다. 이미지 전처리와 OCR 기술을 적절히 활용하면 대부분의 그래픽 캡차를 자동으로 처리할 수 있습니다. 다만 캡차 유형에 따라 전처리 파라미터(임계값, 필터 크기 등)를 조정해야 하므로, 실제 프로젝트에서는 여러 샘플을 테스트하며 최적값을 찾는 과정이 필요합니다.

태그: selenium python OCR captcha PIL

7월 7일 00:20에 게시됨