Spaces:
Sleeping
Sleeping
from fastapi import FastAPI | |
from playwright.async_api import async_playwright | |
from pydantic import BaseModel | |
from typing import List, Dict, Any | |
import logging | |
# ロギング設定 | |
logging.basicConfig(level=logging.INFO) | |
logger = logging.getLogger(__name__) | |
app = FastAPI() | |
class Step(BaseModel): | |
tool: str | |
parameters: Dict[str, Any] | |
class Payload(BaseModel): | |
steps: List[Step] | |
async def automate(payload: Payload): | |
logger.info(f"Received payload:") | |
async with async_playwright() as p: | |
try: | |
browser = await p.chromium.launch(headless=True, timeout=180000) | |
page = await browser.new_page() | |
# デフォルトのナビゲーション/操作タイムアウトを180秒に設定 | |
page.set_default_navigation_timeout(180000) | |
page.set_default_timeout(180000) | |
for step in payload.steps: | |
tool = step.tool | |
params = step.parameters | |
logger.info(f"Executing step: {tool}") | |
if tool == "browser_navigate": | |
await page.goto(params["url"]) | |
elif tool == "browser_type": | |
await page.fill(params["element"], params["text"]) | |
if params.get("submit", False): | |
await page.press(params["element"], "Enter") | |
elif tool == "browser_click": | |
await page.click(params["element"]) | |
elif tool == "browser_snapshot": | |
content = await page.content() | |
return {"snapshot": content} | |
else: | |
return {"error": f"Unknown tool: {tool}"} | |
return {"status": "completed"} | |
except Exception as e: | |
logger.error(f"Error during execution: {str(e)}", exc_info=True) | |
return {"error": str(e)} | |
finally: | |
if 'browser' in locals(): | |
await browser.close() |