웹 자동화 테스트에서 캡차는 빈번하게 마주치는 장애물입니다. 특히 그래픽 캡차는 봇을 차단하기 위한 가장 흔한 방법으로, 테스트 스크립트가 정상적으로 동작하지 못하게 만듭니다. 이 글에서는 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 기술을 적절히 활용하면 대부분의 그래픽 캡차를 자동으로 처리할 수 있습니다. 다만 캡차 유형에 따라 전처리 파라미터(임계값, 필터 크기 등)를 조정해야 하므로, 실제 프로젝트에서는 여러 샘플을 테스트하며 최적값을 찾는 과정이 필요합니다.