88
99import logging
1010import os
11+ import shutil
12+ import tempfile
1113from typing import Dict , Optional
1214
1315from linkedin_scraper .exceptions import (
3234# Global driver storage to reuse sessions
3335active_drivers : Dict [str , webdriver .Chrome ] = {}
3436
37+ # Store user data directories for cleanup
38+ user_data_dirs : Dict [str , str ] = {}
39+
3540logger = logging .getLogger (__name__ )
3641
3742
38- def create_chrome_driver () -> webdriver .Chrome :
43+ def create_chrome_driver (session_id : str = "default" ) -> webdriver .Chrome :
3944 """
4045 Create a new Chrome WebDriver instance with proper configuration.
4146
47+ Args:
48+ session_id: Unique identifier for the session (used for cleanup)
49+
4250 Returns:
4351 webdriver.Chrome: Configured Chrome WebDriver instance
4452
@@ -63,6 +71,14 @@ def create_chrome_driver() -> webdriver.Chrome:
6371 chrome_options .add_argument ("--disable-extensions" )
6472 chrome_options .add_argument ("--disable-background-timer-throttling" )
6573
74+ # Create a unique user data directory to avoid conflicts
75+ user_data_dir = tempfile .mkdtemp (prefix = "linkedin_mcp_chrome_" )
76+ chrome_options .add_argument (f"--user-data-dir={ user_data_dir } " )
77+ logger .debug (f"Using Chrome user data directory: { user_data_dir } " )
78+
79+ # Store the user data directory for cleanup
80+ user_data_dirs [session_id ] = user_data_dir
81+
6682 # Set user agent (configurable with sensible default)
6783 user_agent = getattr (config .chrome , "user_agent" , DEFAULT_USER_AGENT )
6884 chrome_options .add_argument (f"--user-agent={ user_agent } " )
@@ -213,7 +229,7 @@ def get_or_create_driver(authentication: str) -> webdriver.Chrome:
213229
214230 try :
215231 # Create new driver
216- driver = create_chrome_driver ()
232+ driver = create_chrome_driver (session_id )
217233
218234 # Login to LinkedIn
219235 login_to_linkedin (driver , authentication )
@@ -245,7 +261,7 @@ def get_or_create_driver(authentication: str) -> webdriver.Chrome:
245261
246262def close_all_drivers () -> None :
247263 """Close all active drivers and clean up resources."""
248- global active_drivers
264+ global active_drivers , user_data_dirs
249265
250266 for session_id , driver in active_drivers .items ():
251267 try :
@@ -254,8 +270,21 @@ def close_all_drivers() -> None:
254270 except Exception as e :
255271 logger .warning (f"Error closing driver { session_id } : { e } " )
256272
273+ # Clean up user data directory
274+ if session_id in user_data_dirs :
275+ try :
276+ user_data_dir = user_data_dirs [session_id ]
277+ if os .path .exists (user_data_dir ):
278+ shutil .rmtree (user_data_dir )
279+ logger .debug (f"Cleaned up user data directory: { user_data_dir } " )
280+ except Exception as e :
281+ logger .warning (
282+ f"Error cleaning up user data directory for session { session_id } : { e } "
283+ )
284+
257285 active_drivers .clear ()
258- logger .info ("All Chrome WebDriver sessions closed" )
286+ user_data_dirs .clear ()
287+ logger .info ("All Chrome WebDriver sessions closed and cleaned up" )
259288
260289
261290def get_active_driver () -> Optional [webdriver .Chrome ]:
0 commit comments