feat: Chrome 드라이버 설정 개선 및 임시 프로필 정리 기능 추가

- Chrome 드라이버의 원격 디버깅 모드를 파이프 모드로 변경하여 CI 환경에서의 충돌 방지
- 사용자 데이터 디렉토리를 매 실행마다 고유 경로로 설정하여 lock 충돌 방지
- 자동 생성된 Chrome 프로필 디렉토리를 종료 시 정리하는 로직 추가
This commit is contained in:
hyeonggil
2026-03-27 23:26:57 +09:00
parent ed73e39b69
commit decc206725

View File

@@ -13,7 +13,9 @@ import os
import sys
import time
import json
import shutil
import logging
import tempfile
import urllib.request
from datetime import datetime
@@ -69,15 +71,28 @@ def create_driver():
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-gpu")
options.add_argument("--disable-software-rasterizer")
options.add_argument("--remote-debugging-port=9222")
options.add_argument("--user-data-dir=/tmp/chrome-user-data")
# 고정 포트(9222)는 CI/병렬 실행 시 충돌 가능성이 커서 pipe 모드 사용
options.add_argument("--remote-debugging-pipe")
# 고정 user-data-dir은 lock 충돌(session not created) 유발 가능 -> 매 실행 고유 경로 사용
chrome_user_data_dir = os.environ.get("CHROME_USER_DATA_DIR")
auto_created_profile = False
if not chrome_user_data_dir:
chrome_user_data_dir = tempfile.mkdtemp(prefix="chrome-user-data-")
auto_created_profile = True
options.add_argument(f"--user-data-dir={chrome_user_data_dir}")
options.add_argument("--window-size=1920,1080")
options.add_argument("--no-first-run")
options.add_argument("--no-default-browser-check")
options.add_argument("--disable-extensions")
# 자동화 탐지 우회
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
driver = webdriver.Chrome(options=options)
# 종료 시 정리할 수 있도록 임시 프로필 경로 저장
driver._chrome_user_data_dir = chrome_user_data_dir
driver._chrome_user_data_dir_auto_created = auto_created_profile
driver.execute_cdp_cmd(
"Page.addScriptToEvaluateOnNewDocument",
{"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"},
@@ -447,6 +462,15 @@ def main():
if driver:
driver.quit()
logger.info("브라우저 종료")
# 자동 생성한 Chrome profile 디렉토리 정리
try:
if getattr(driver, "_chrome_user_data_dir_auto_created", False):
profile_dir = getattr(driver, "_chrome_user_data_dir", "")
if profile_dir and os.path.isdir(profile_dir):
shutil.rmtree(profile_dir, ignore_errors=True)
logger.info(f"임시 Chrome 프로필 정리: {profile_dir}")
except Exception as e:
logger.warning(f"임시 Chrome 프로필 정리 실패: {e}")
if __name__ == "__main__":