File size: 3,536 Bytes
c2a0f3c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"""
WebDriver management and initialization
"""
import os
import logging
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.core.os_manager import ChromeType
from config.settings import CHROMIUM_PATHS, CHROME_OPTIONS, DEFAULT_PAGE_LOAD_TIMEOUT, DEFAULT_IMPLICIT_WAIT

logger = logging.getLogger(__name__)

# Global browser session for persistence
_driver = None

def create_driver(persistent=False):
    """Create Chrome driver with proper configuration"""
    global _driver
    
    # If persistent and driver exists, return it
    if persistent and _driver:
        try:
            # Check if driver is still alive
            _driver.title
            return _driver
        except:
            # Driver is dead, create new one
            _driver = None
    
    try:
        chrome_options = Options()
        
        # Detect Chromium binary location
        chromium_binary = None
        for path in CHROMIUM_PATHS:
            if os.path.exists(path):
                chromium_binary = path
                logger.info(f"Found Chromium at: {path}")
                break
        
        if chromium_binary:
            chrome_options.binary_location = chromium_binary
        
        # Add all Chrome options
        for option in CHROME_OPTIONS:
            chrome_options.add_argument(option)
        
        # Try multiple driver installation methods
        try:
            # Method 1: Use system chromium-driver if available
            if os.path.exists("/usr/bin/chromedriver"):
                service = Service("/usr/bin/chromedriver")
                logger.info("Using system chromedriver")
            else:
                # Method 2: Use webdriver-manager with ChromeType.CHROMIUM
                service = Service(ChromeDriverManager(chrome_type=ChromeType.CHROMIUM).install())
                logger.info("Using webdriver-manager chromedriver")
        except Exception as e:
            logger.warning(f"ChromeType.CHROMIUM failed: {e}")
            # Method 3: Fallback to regular Chrome driver
            service = Service(ChromeDriverManager().install())
            logger.info("Using fallback Chrome driver")
        
        driver = webdriver.Chrome(service=service, options=chrome_options)
        driver.set_page_load_timeout(DEFAULT_PAGE_LOAD_TIMEOUT)
        driver.implicitly_wait(DEFAULT_IMPLICIT_WAIT)
        
        if persistent:
            _driver = driver
        
        return driver
        
    except Exception as e:
        logger.error(f"Failed to create driver: {e}")
        raise

def close_persistent_driver():
    """Close the persistent driver if it exists"""
    global _driver
    if _driver:
        try:
            _driver.quit()
        except:
            pass
        _driver = None
        return "Persistent browser closed"
    return "No persistent browser to close"

def get_driver(url=None, use_persistent=False):
    """Get driver and optionally navigate to URL"""
    driver = create_driver(persistent=use_persistent)
    
    if url and (not use_persistent or driver.current_url != url):
        logger.info(f"Navigating to: {url}")
        driver.get(url)
    
    return driver

def cleanup_driver(driver, use_persistent=False):
    """Cleanup driver if not persistent"""
    if not use_persistent and driver:
        try:
            driver.quit()
        except:
            pass