from pyppeteer import launch from app.config import CUSTOM_USER_AGENT async def wait_for_network_idle(page): """Wait until no network requests are in flight""" await page.waitForNetworkIdle(idleTime=500, timeout=30000) async def safe_browser_operation(url, operation_func): """Safely perform browser operations with proper cleanup""" browser = None try: browser = await launch( headless=True, executablePath='/usr/bin/google-chrome', args=['--no-sandbox', '--disable-setuid-sandbox'], handleSIGINT=False, handleSIGTERM=False, handleSIGHUP=False ) # Create new page with timeout page = await browser.newPage() page.setDefaultNavigationTimeout(30000) # Set custom user agent await page.setUserAgent(CUSTOM_USER_AGENT) # Call the operation function that uses the page result = await operation_func(page) # Explicitly close the page await page.close() return result finally: # Ensure browser is closed properly if browser: try: await browser.close() except Exception as e: print(f"Error closing browser: {e}") # We don't re-raise here to avoid masking the original error