✨ feat: Chrome 드라이버 설정 개선 및 임시 프로필 정리 기능 추가
- Chrome 드라이버의 원격 디버깅 모드를 파이프 모드로 변경하여 CI 환경에서의 충돌 방지 - 사용자 데이터 디렉토리를 매 실행마다 고유 경로로 설정하여 lock 충돌 방지 - 자동 생성된 Chrome 프로필 디렉토리를 종료 시 정리하는 로직 추가
This commit is contained in:
@@ -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__":
|
||||
|
||||
Reference in New Issue
Block a user