mirror of
https://github.com/browser-use/browser-use
synced 2026-05-06 17:52:15 +02:00
135 lines
4.3 KiB
Python
135 lines
4.3 KiB
Python
import asyncio
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Ensure the project root is in the Python path if running directly
|
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
|
|
|
from dotenv import load_dotenv
|
|
load_dotenv()
|
|
|
|
from langchain_openai import ChatOpenAI
|
|
from browser_use import Agent, Browser, BrowserConfig
|
|
|
|
# Define the task for the agent
|
|
TASK_DESCRIPTION = """
|
|
1. Go to amazon.com
|
|
2. Search for 'i7 14700k'
|
|
4. If there is an 'Add to Cart' button, open the product page and then click add to cart.
|
|
5. the open the shopping cart page /cart button/ go to cart button.
|
|
6. Scroll down to the bottom of the cart page.
|
|
7. Scroll up to the top of the cart page.
|
|
8. Finish the task.
|
|
"""
|
|
|
|
# Define the path where the Playwright script will be saved
|
|
SCRIPT_DIR = Path('./playwright_scripts')
|
|
SCRIPT_PATH = SCRIPT_DIR / 'playwright_amazon_cart_script.py'
|
|
|
|
|
|
# Helper function to stream output from the subprocess
|
|
async def stream_output(stream, prefix):
|
|
if stream is None:
|
|
print(f'{prefix}: (No stream available)')
|
|
return
|
|
while True:
|
|
line = await stream.readline()
|
|
if not line:
|
|
break
|
|
print(f'{prefix}: {line.decode().rstrip()}', flush=True)
|
|
|
|
|
|
async def main():
|
|
# Initialize the language model
|
|
llm = ChatOpenAI(model='gpt-4.1', temperature=0.0)
|
|
|
|
# Configure the browser
|
|
# Use headless=False if you want to watch the agent visually
|
|
browser_config = BrowserConfig(headless=False)
|
|
browser = Browser(config=browser_config)
|
|
|
|
# Configure the agent
|
|
# The 'save_playwright_script_path' argument tells the agent where to save the script
|
|
agent = Agent(
|
|
task=TASK_DESCRIPTION,
|
|
llm=llm,
|
|
browser=browser,
|
|
save_playwright_script_path=str(SCRIPT_PATH), # Pass the path as a string
|
|
)
|
|
|
|
print('Running the agent to generate the Playwright script...')
|
|
history = None # Initialize history to None
|
|
try:
|
|
history = await agent.run()
|
|
print('Agent finished running.')
|
|
|
|
if history and history.is_successful():
|
|
print(f'Agent completed the task successfully. Final result: {history.final_result()}')
|
|
elif history:
|
|
print('Agent finished, but the task might not be fully successful.')
|
|
if history.has_errors():
|
|
print(f'Errors encountered: {history.errors()}')
|
|
else:
|
|
print('Agent run did not return a history object.')
|
|
|
|
except Exception as e:
|
|
print(f'An error occurred during the agent run: {e}')
|
|
# Ensure browser is closed even if agent run fails
|
|
if browser:
|
|
await browser.close()
|
|
return # Exit if agent failed
|
|
|
|
# --- Execute the Generated Playwright Script ---
|
|
print(f'\nChecking if Playwright script was generated at: {SCRIPT_PATH}')
|
|
if SCRIPT_PATH.exists():
|
|
print('Playwright script found. Attempting to execute...')
|
|
try:
|
|
# Ensure the script directory exists before running
|
|
SCRIPT_DIR.mkdir(parents=True, exist_ok=True)
|
|
|
|
# Execute the generated script using asyncio.create_subprocess_exec
|
|
process = await asyncio.create_subprocess_exec(
|
|
sys.executable,
|
|
str(SCRIPT_PATH),
|
|
stdout=asyncio.subprocess.PIPE,
|
|
stderr=asyncio.subprocess.PIPE,
|
|
cwd=Path.cwd(), # Run from the current working directory
|
|
)
|
|
|
|
print('\n--- Playwright Script Execution ---')
|
|
# Create tasks to stream stdout and stderr concurrently
|
|
stdout_task = asyncio.create_task(stream_output(process.stdout, 'stdout'))
|
|
stderr_task = asyncio.create_task(stream_output(process.stderr, 'stderr'))
|
|
|
|
# Wait for both stream tasks and the process to finish
|
|
await asyncio.gather(stdout_task, stderr_task)
|
|
returncode = await process.wait()
|
|
print('-------------------------------------')
|
|
|
|
if returncode == 0:
|
|
print('\n✅ Playwright script executed successfully!')
|
|
else:
|
|
print(f'\n⚠️ Playwright script finished with exit code {returncode}.')
|
|
|
|
except Exception as e:
|
|
print(f'\n❌ An error occurred while executing the Playwright script: {e}')
|
|
else:
|
|
print(f'\n❌ Playwright script not found at {SCRIPT_PATH}. Generation might have failed.')
|
|
|
|
# Close the browser used by the agent (if not already closed by agent.run error handling)
|
|
# Note: The generated script manages its own browser instance.
|
|
if browser:
|
|
await browser.close()
|
|
print("Agent's browser closed.")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# Ensure the script directory is clean before running (optional)
|
|
if SCRIPT_PATH.exists():
|
|
SCRIPT_PATH.unlink()
|
|
print(f'Removed existing script: {SCRIPT_PATH}')
|
|
|
|
# Run the main async function
|
|
asyncio.run(main())
|