셀레니움 웹드라이버 호환성 이슈

edawnnet 2024. 12. 10. 15:32

TLDR: 🏆 추천 방법: 동적 버전 관리 스크립트 (세 번째 방법)

3가지 방법 비교

  1. 기본 WebDriver Manager
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install())
)
  • ✅ 장점: 간단하고 자동으로 최신 버전 유지
  • ❌ 단점: 버전 제어 부족
  1. 특정 버전 지정
driver = webdriver.Chrome(
    service=Service(
        ChromeDriverManager(version="113.0.5672.63").install()
    )
)
  • ✅ 장점: 정확한 버전 통제 가능
  • ❌ 단점: 수동 버전 관리 필요
  1. 동적 버전 관리 스크립트
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. 뛰어난 유연성
  2. 자동화된 버전 관리
  3. 안정적인 오류 대응
  4. 향후 확장성

이슈 배경

  • 문제 상황: 크롬 브라우저 업데이트 후 기존 웹드라이버 미업데이트로 인한 실행 오류
  • 주요 증상: 브라우저와 웹드라이버 간 버전 불일치로 인한 연결 실패

이슈 상세

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()

추가 권장 사항

  1. 정기적인 webdriver-manager 업데이트
  2. 크롬 브라우저와 WebDriver 버전 주기적 동기화
  3. 예외 처리 및 로깅 추가

잠재적 한계

  • 운영체제별 크롬 버전 확인 방법 상이
  • 정확한 WebDriver 버전 매핑의 복잡성

결론

셀레니움 WebDriver 사용 시 자동 버전 관리와 명시적 버전 제어를 결합하여 안정성 확보 필요