[Add] browser-use and main.py
This commit is contained in:
parent
08e64bdf45
commit
96914d44ac
221 changed files with 30952 additions and 1 deletions
136
browser-use/examples/features/playwright_script_generation.py
Normal file
136
browser-use/examples/features/playwright_script_generation.py
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
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())
|
||||
Loading…
Add table
Add a link
Reference in a new issue