|
|
|
|
|
|
|
|
""" |
|
|
Example demonstrating how to use browser automation toolkits from EvoAgentX. |
|
|
This script provides comprehensive examples for: |
|
|
- BrowserToolkit (Selenium-based): Fine-grained control over browser elements |
|
|
- BrowserUseToolkit (AI-driven): Natural language browser automation |
|
|
""" |
|
|
|
|
|
import os |
|
|
import sys |
|
|
|
|
|
from pathlib import Path |
|
|
from dotenv import load_dotenv |
|
|
|
|
|
load_dotenv(override=True) |
|
|
|
|
|
|
|
|
sys.path.append(str(Path(__file__).parent.parent)) |
|
|
|
|
|
from evoagentx.tools import ( |
|
|
BrowserToolkit, |
|
|
BrowserUseToolkit |
|
|
) |
|
|
|
|
|
|
|
|
def run_browser_tool_example(): |
|
|
""" |
|
|
Run an example using the BrowserToolkit with auto-initialization and auto-cleanup. |
|
|
Uses a comprehensive HTML test page to demonstrate browser automation features. |
|
|
""" |
|
|
print("\n===== BROWSER TOOL EXAMPLE =====\n") |
|
|
|
|
|
try: |
|
|
|
|
|
browser_toolkit = BrowserToolkit(headless=False, timeout=10) |
|
|
|
|
|
|
|
|
nav_tool = browser_toolkit.get_tool("navigate_to_url") |
|
|
input_tool = browser_toolkit.get_tool("input_text") |
|
|
click_tool = browser_toolkit.get_tool("browser_click") |
|
|
snapshot_tool = browser_toolkit.get_tool("browser_snapshot") |
|
|
|
|
|
|
|
|
test_file_path = os.path.join(os.getcwd(), "examples", "tools", "browser_test_page.html") |
|
|
|
|
|
print("Step 1: Navigating to test page (browser auto-initializes)...") |
|
|
nav_result = nav_tool(url=f"file://{test_file_path}") |
|
|
print("Navigation Result:") |
|
|
print("-" * 30) |
|
|
print(f"Status: {nav_result.get('status')}") |
|
|
print(f"URL: {nav_result.get('current_url')}") |
|
|
print(f"Title: {nav_result.get('title')}") |
|
|
print("-" * 30) |
|
|
|
|
|
if nav_result.get("status") in ["success", "partial_success"]: |
|
|
print("\nStep 2: Taking initial snapshot to identify elements...") |
|
|
snapshot_result = snapshot_tool() |
|
|
|
|
|
if snapshot_result.get("status") == "success": |
|
|
print("β Initial snapshot successful") |
|
|
|
|
|
|
|
|
elements = snapshot_result.get("interactive_elements", []) |
|
|
print(f"Found {len(elements)} interactive elements") |
|
|
|
|
|
|
|
|
name_input_ref = None |
|
|
email_input_ref = None |
|
|
message_input_ref = None |
|
|
submit_btn_ref = None |
|
|
clear_btn_ref = None |
|
|
test_btn_ref = None |
|
|
|
|
|
for elem in elements: |
|
|
desc = elem.get("description", "").lower() |
|
|
purpose = elem.get("purpose", "").lower() |
|
|
|
|
|
if "name" in desc and elem.get("editable"): |
|
|
name_input_ref = elem["id"] |
|
|
elif "email" in desc and elem.get("editable"): |
|
|
email_input_ref = elem["id"] |
|
|
elif "message" in desc and elem.get("editable"): |
|
|
message_input_ref = elem["id"] |
|
|
elif "submit" in purpose and elem.get("interactable"): |
|
|
submit_btn_ref = elem["id"] |
|
|
elif "clear" in purpose and elem.get("interactable"): |
|
|
clear_btn_ref = elem["id"] |
|
|
elif "test" in purpose and elem.get("interactable"): |
|
|
test_btn_ref = elem["id"] |
|
|
|
|
|
print(f"Identified elements:") |
|
|
print(f" - Name input: {name_input_ref}") |
|
|
print(f" - Email input: {email_input_ref}") |
|
|
print(f" - Message input: {message_input_ref}") |
|
|
print(f" - Submit button: {submit_btn_ref}") |
|
|
print(f" - Clear button: {clear_btn_ref}") |
|
|
print(f" - Test button: {test_btn_ref}") |
|
|
|
|
|
|
|
|
if name_input_ref and email_input_ref and message_input_ref: |
|
|
print("\nStep 3: Testing input functionality...") |
|
|
|
|
|
|
|
|
print(" - Typing 'John Doe' in name field...") |
|
|
name_result = input_tool( |
|
|
element="Name input", |
|
|
ref=name_input_ref, |
|
|
text="John Doe", |
|
|
submit=False |
|
|
) |
|
|
print(f" Result: {name_result.get('status')}") |
|
|
|
|
|
|
|
|
print(" - Typing 'john.doe@example.com' in email field...") |
|
|
email_result = input_tool( |
|
|
element="Email input", |
|
|
ref=email_input_ref, |
|
|
text="john.doe@example.com", |
|
|
submit=False |
|
|
) |
|
|
print(f" Result: {email_result.get('status')}") |
|
|
|
|
|
|
|
|
print(" - Typing 'This is a test message for browser automation.' in message field...") |
|
|
message_result = input_tool( |
|
|
element="Message input", |
|
|
ref=message_input_ref, |
|
|
text="This is a test message for browser automation.", |
|
|
submit=False |
|
|
) |
|
|
print(f" Result: {message_result.get('status')}") |
|
|
|
|
|
|
|
|
if submit_btn_ref: |
|
|
print("\nStep 4: Testing form submission...") |
|
|
submit_result = click_tool( |
|
|
element="Submit button", |
|
|
ref=submit_btn_ref |
|
|
) |
|
|
print(f"Submit result: {submit_result.get('status')}") |
|
|
|
|
|
|
|
|
print("\nStep 5: Taking snapshot to verify form submission...") |
|
|
result_snapshot = snapshot_tool() |
|
|
if result_snapshot.get("status") == "success": |
|
|
content = result_snapshot.get("page_content", "") |
|
|
if "Name: John Doe, Email: john.doe@example.com" in content: |
|
|
print("β Form submission successful - data correctly displayed!") |
|
|
else: |
|
|
print("β Form submission may have failed") |
|
|
|
|
|
|
|
|
if test_btn_ref: |
|
|
print("\nStep 6: Testing test button click...") |
|
|
test_result = click_tool( |
|
|
element="Test button", |
|
|
ref=test_btn_ref |
|
|
) |
|
|
print(f"Test button result: {test_result.get('status')}") |
|
|
|
|
|
|
|
|
click_snapshot = snapshot_tool() |
|
|
if click_snapshot.get("status") == "success": |
|
|
content = click_snapshot.get("page_content", "") |
|
|
if "Test button clicked at:" in content: |
|
|
print("β Test button click successful!") |
|
|
else: |
|
|
print("β Test button click may have failed") |
|
|
|
|
|
|
|
|
if clear_btn_ref: |
|
|
print("\nStep 7: Testing clear functionality...") |
|
|
clear_result = click_tool( |
|
|
element="Clear button", |
|
|
ref=clear_btn_ref |
|
|
) |
|
|
print(f"Clear result: {clear_result.get('status')}") |
|
|
|
|
|
|
|
|
final_snapshot = snapshot_tool() |
|
|
if final_snapshot.get("status") == "success": |
|
|
print("β Clear functionality tested") |
|
|
|
|
|
print("\nβ Browser automation test completed successfully!") |
|
|
print("β Browser auto-initialization working") |
|
|
print("β Navigation working") |
|
|
print("β Input functionality working") |
|
|
print("β Click functionality working") |
|
|
print("β Form submission working") |
|
|
print("β Snapshot functionality working") |
|
|
else: |
|
|
print("β Initial snapshot failed") |
|
|
else: |
|
|
print("\nβ Navigation failed") |
|
|
|
|
|
print("\nBrowser will automatically close when the toolkit goes out of scope...") |
|
|
print("(No manual cleanup required)") |
|
|
|
|
|
except Exception as e: |
|
|
print(f"Error running browser tool example: {str(e)}") |
|
|
print("Browser will still automatically cleanup on exit") |
|
|
|
|
|
|
|
|
def run_browser_use_tool_example(): |
|
|
"""Simple example using BrowserUseToolkit for browser automation.""" |
|
|
print("\n===== BROWSER USE TOOL EXAMPLE =====\n") |
|
|
|
|
|
|
|
|
openai_api_key = os.getenv("OPENAI_API_KEY") |
|
|
if not openai_api_key: |
|
|
print("β OPENAI_API_KEY not found in environment variables") |
|
|
print("Please set your OpenAI API key: export OPENAI_API_KEY='your-api-key-here'") |
|
|
return |
|
|
|
|
|
try: |
|
|
|
|
|
print("Initializing BrowserUseToolkit...") |
|
|
toolkit = BrowserUseToolkit(model="gpt-4o-mini", headless=False) |
|
|
browser_tool = toolkit.get_tool("browser_use") |
|
|
|
|
|
print("β BrowserUseToolkit initialized") |
|
|
print(f"β Using OpenAI API key: {openai_api_key[:8]}...") |
|
|
|
|
|
|
|
|
print("Executing browser task: 'Go to Google and search for OpenAI GPT-4'...") |
|
|
result = browser_tool(task="Go to Google and search for 'OpenAI GPT-4'") |
|
|
|
|
|
if result.get('success'): |
|
|
print("β Browser task completed successfully") |
|
|
print(f"Result: {result.get('result', 'No result details')}") |
|
|
else: |
|
|
print(f"β Browser task failed: {result.get('error', 'Unknown error')}") |
|
|
|
|
|
print("\nβ BrowserUseToolkit test completed") |
|
|
|
|
|
except Exception as e: |
|
|
print(f"Error: {str(e)}") |
|
|
print("Note: Make sure you have the required dependencies installed and API keys set up.") |
|
|
|
|
|
|
|
|
def main(): |
|
|
"""Main function to run all browser tool examples""" |
|
|
print("===== BROWSER TOOL EXAMPLES =====") |
|
|
|
|
|
|
|
|
run_browser_tool_example() |
|
|
|
|
|
|
|
|
run_browser_use_tool_example() |
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |