TLDR: 🏆 추천 방법: 동적 버전 관리 스크립트 (세 번째 방법)
3가지 방법 비교
- 기본 WebDriver Manager
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install())
)
- ✅ 장점: 간단하고 자동으로 최신 버전 유지
- ❌ 단점: 버전 제어 부족
- 특정 버전 지정
driver = webdriver.Chrome(
service=Service(
ChromeDriverManager(version="113.0.5672.63").install()
)
)
- ✅ 장점: 정확한 버전 통제 가능
- ❌ 단점: 수동 버전 관리 필요
- 동적 버전 관리 스크립트
def create_webdriver():
chrome_version = get_chrome_version()
chromedriver_version = get_matching_chromedriver_version(chrome_version)
driver = webdriver.Chrome(
service=Service(
ChromeDriverManager(version=chromedriver_version).install()
)
)
return driver
- ✅ 장점:
- 자동 버전 관리
- 유연한 운영
- 명시적 버전 제어
- 체계적 오류 처리
- ❌ 단점: 초기 구현의 복잡성
🌟 추천 이유:
- 뛰어난 유연성
- 자동화된 버전 관리
- 안정적인 오류 대응
- 향후 확장성
이슈 배경
- 문제 상황: 크롬 브라우저 업데이트 후 기존 웹드라이버 미업데이트로 인한 실행 오류
- 주요 증상: 브라우저와 웹드라이버 간 버전 불일치로 인한 연결 실패
이슈 상세
1. 버전 호환성 문제
# 호환성 문제 예시 코드
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 이전 방식 - 취약한 버전 관리
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install())
)
2. 해결 방법
# 해결책: WebDriver Manager 업그레이드
pip install --upgrade webdriver-manager
셀레니움 코드 작성 시 주의사항
1. 자동 버전 관리
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
# 최신 버전 자동 다운로드 및 설치
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install())
)
2. 명시적 버전 지정
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
# 특정 버전의 ChromeDriver 명시적 설치
driver = webdriver.Chrome(
service=Service(
ChromeDriverManager(version="113.0.5672.63").install()
)
)
크롬 버전과 웹드라이버 버전 분리 관리
동적 버전 관리 스크립트
import re
import subprocess
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
def get_chrome_version():
"""크롬 브라우저 버전 추출"""
try:
# macOS 커맨드
result = subprocess.run(
['defaults', 'read', '/Applications/Google Chrome.app/Contents/Info.plist', 'CFBundleShortVersionString'],
capture_output=True,
text=True
)
return result.stdout.strip()
except Exception as e:
print(f"크롬 버전 확인 실패: {e}")
return None
def get_matching_chromedriver_version(chrome_version):
"""크롬 버전에 맞는 ChromeDriver 버전 매핑"""
# 메이저 버전 추출
major_version = chrome_version.split('.')[0]
# 버전 매핑 로직 (실제 로직은 더 복잡할 수 있음)
version_mapping = {
'113': '113.0.5672.63',
'114': '114.0.5735.90',
# 필요에 따라 계속 추가
}
return version_mapping.get(major_version)
def create_webdriver():
"""동적 WebDriver 생성"""
chrome_version = get_chrome_version()
if not chrome_version:
raise ValueError("크롬 버전을 확인할 수 없습니다.")
chromedriver_version = get_matching_chromedriver_version(chrome_version)
if not chromedriver_version:
# 자동 최신 버전 사용
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install())
)
else:
# 특정 버전 사용
driver = webdriver.Chrome(
service=Service(
ChromeDriverManager(version=chromedriver_version).install()
)
)
return driver
# 사용 예시
driver = create_webdriver()
추가 권장 사항
- 정기적인 webdriver-manager 업데이트
- 크롬 브라우저와 WebDriver 버전 주기적 동기화
- 예외 처리 및 로깅 추가
잠재적 한계
- 운영체제별 크롬 버전 확인 방법 상이
- 정확한 WebDriver 버전 매핑의 복잡성
결론
셀레니움 WebDriver 사용 시 자동 버전 관리와 명시적 버전 제어를 결합하여 안정성 확보 필요
'던' 카테고리의 다른 글
<알고리즘> 소수 (feat.에라토스테네스의 체, 소수 정리) (0) | 2024.12.06 |
---|---|
<알고리즘> 약수 (feat. 정수론) (1) | 2024.12.06 |
<알고리즘> 슬라이딩 윈도우 (feat. 투 포인터) (0) | 2024.12.05 |