I am writing web automation to download a file by browser-use web automation tool that uses LLM as an AI Agent. The download files feature isn't supported by the Browser-use as a built-in functionality. That's why I have a complex code to do that. However, sometimes it works well and downloads the file but sometimes it doesn't. Here is the log related to the failure time: INFO [browser_use] BrowserUse logging setup complete with level info INFO [root] Anonymized telemetry enabled. See https://github.com/browser-use/browser-use for more information. contexts initial: 0 INFO [agent] Starting task: navigate to https://file-examples.com/index.php/sample-documents-download/sample-doc-download/ and download the first doc INFO [agent] Step 1 contexts after 5 sec: 1 INFO [agent] Eval: Success - Looking at a blank page. INFO [agent] Memory: Need to navigate to a specific URL. INFO [agent] Next goal: Navigate to the specified URL to download the document. INFO [agent] ️ Action 1/1: {"go_to_url":{"url":"https://file-examples.com/index.php/sample-documents-download/sample-doc-download/"}} INFO [controller] Navigated to https://file-examples.com/index.php/sample-documents-download/sample-doc-download/ INFO [agent] Step 2 INFO [agent] Eval: Success - Navigated to the site and located download links for document files. INFO [agent] Memory: Ready to download the first DOC file. INFO [agent] Next goal: Download the first DOC file by clicking the download link. INFO [agent] ️ Action 1/1: {"click_element":{"index":12}} INFO [controller] ️ Clicked button with index 12: Download sample DOC file INFO [agent] Step 3 INFO [agent] Eval: Success - The download link was clicked and is now redirecting to the file download page. INFO [agent] Memory: The file is being downloaded from the redirect page. INFO [agent] Next goal: Verify and complete the task since the download process has started. INFO [agent] ️ Action 1/1: {"done":{"text":"The first DOC file has been successfully downloaded from the link: https://file-examples.com/index.php/sample-documents-download/sample-doc-download/"}} INFO [agent] Result: The first DOC file has been successfully downloaded from the link: https://file-examples.com/index.php/sample-documents-download/sample-doc-download/ INFO [agent] ✅ Task completed successfully INFO [agent] Created GIF at agent_history.gif No files were downloaded during this session. Press Enter to close... And here's the code: import os import sys from pathlib import Path sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) import asyncio from langchain_openai import ChatOpenAI from typing import Dict, List from browser_use import Agent, Controller from browser_use.browser.browser import Browser, BrowserConfig from browser_use.browser.context import BrowserContext # Initialize controller first browser = Browser(config=BrowserConfig(headless=False)) controller = Controller() # Track downloads downloaded_files: List[str] = [] async def handle_download(download): # Create downloads directory if it doesn't exist downloads_dir = Path('./downloads') downloads_dir.mkdir(exist_ok=True) # Get original download path original_path = await download.path() if original_path: # Create new path in downloads directory new_path = downloads_dir / os.path.basename(original_path) # Move the file to downloads directory os.rename(original_path, new_path) # Add the new path to downloaded files list downloaded_files.append(str(new_path)) print(f"Downloaded and moved to: {new_path}") @controller.action( 'Upload file - the file name is inside the function - you only need to call this with the correct index', requires_browser=True, ) async def upload_file(index: int, browser: BrowserContext): element = await browser.get_element_by_index(index) my_file = Path.cwd() / 'examples/test_cv.txt' if not element: raise Exception(f'Element with index {index} not found') await element.set_input_files(str(my_file.absolute())) return f'Uploaded file to index {index}' @controller.action('Close file dialog', requires_browser=True) async def close_file_dialog(browser: BrowserContext): page = await browser.get_current_page() await page.keyboard.press('Escape') def handle_page(new_page): print("New page created!") new_page.on( "download", lambda download: asyncio.create_task(handle_download(download)) ) async def print_contexts_after_delay(playwright_browser): await asyncio.sleep(5) if (len(playwright_browser.contexts) < 1): raise Exception('No contexts found') # up download handler at Playwright browser level playwright_browser.contexts[0].on("page", handle_page) print('contexts after 5 sec:', len(playwright_browser.contexts)) async def main(): task = "navigate to https://file-examples.com/index.php/sample-documents-download/sample-doc-download/ and download the first doc" model = ChatOpenAI(model='gpt-4o') agent = Agent( task=task, llm=model, controller=controller, browser=browser, ) # Get the underlying Playwright browser instance playwright_browser = await browser.get_playwright_browser() print('contexts initial:', len(playwright_browser.contexts)) # Create task for delayed context printing asyncio.create_task(print_contexts_after_delay(playwright_browser)) await agent.run() history_file_path = 'AgentHistoryList.json' agent.save_history(file_path=history_file_path) await browser.close() # Print downloaded files if downloaded_files: print("\nDownloaded files:") for file_path in downloaded_files: print(file_path) print(f"- {os.path.basename(file_path)}") else: print("\nNo files were downloaded during this session.") input('Press Enter to close...') if __name__ == '__main__': asyncio.run(main()) I guess the issue is related to concurrency and async stuff. Or maybe related to the handle_download method. Any help would be greatly appreciated. Continue reading...