import os import json import time import sys from playwright.sync_api import sync_playwright # Configuração BASE_URL = "http://localhost:80" # Ajuste para sua URL base OUTPUT_DIR = "test-results" ROUTES_FILE = "qa_routes.json" def run_qa_scan(): if not os.path.exists(ROUTES_FILE): return f"❌ Arquivo {ROUTES_FILE} não encontrado. Crie uma lista de rotas." with open(ROUTES_FILE, 'r', encoding='utf-8') as f: routes = json.load(f) # Cria pasta com timestamp para não sobrescrever testes anteriores timestamp = time.strftime("%Y-%m-%d_%H-%M-%S") session_dir = os.path.join(OUTPUT_DIR, timestamp) os.makedirs(session_dir, exist_ok=True) report_summary = [] with sync_playwright() as p: browser = p.chromium.launch(headless=True) # Mude para False se quiser ver acontecendo # Define viewport grande para pegar desktops context = browser.new_context(viewport={"width": 1920, "height": 1080}) print(f"🚀 Iniciando Scan de QA em {BASE_URL}...") print(f"📂 Resultados serão salvos em: {session_dir}") for route in routes: name = route.get('name', 'Unknown') path = route.get('path', '/') full_url = f"{BASE_URL}{path}" print(f"📸 Processando: {name} ({path})...") # Criar uma nova página para cada rota para isolar os logs de console page = context.new_page() # Preparar captura de logs console_logs = [] page.on("console", lambda msg: console_logs.append(f"[{msg.type}] {msg.text}")) page.on("pageerror", lambda exc: console_logs.append(f"[CRASH] {exc}")) try: page.goto(full_url, wait_until="networkidle") # Espera seletor específico se configurado (garante que carregou) if "wait_for" in route: page.wait_for_selector(route["wait_for"], timeout=5000) else: time.sleep(1) # Espera técnica mínima # 1. Salvar Screenshot safe_name = name.replace(" ", "_").lower().replace("/", "_").replace("\\", "_") img_path = os.path.join(session_dir, f"{safe_name}.png") page.screenshot(path=img_path, full_page=True) # 2. Salvar Logs log_path = os.path.join(session_dir, f"{safe_name}.log") with open(log_path, 'w', encoding='utf-8') as f_log: f_log.write("\n".join(console_logs)) # Análise Rápida de Erros error_count = sum(1 for log in console_logs if "error" in log.lower() or "crash" in log.lower()) status = "❌ ERRO" if error_count > 0 else "✅ OK" report_summary.append({ "page": name, "status": status, "errors": error_count, "screenshot": img_path, "log_file": log_path }) print(f" Status: {status} ({error_count} erros encontrados)") except Exception as e: print(f" ⚠️ Falha ao acessar {full_url}: {e}") report_summary.append({ "page": name, "status": "⚠️ FALHA CRÍTICA", "error_msg": str(e) }) finally: page.close() # Fecha a página atual antes de ir para a próxima browser.close() # Salva o Relatório Geral para o Agente ler summary_path = os.path.join(session_dir, "qa_report.json") with open(summary_path, 'w', encoding='utf-8') as f: json.dump(report_summary, f, indent=2, ensure_ascii=False) return f"✅ QA Finalizado. Relatório salvo em: {summary_path}" if __name__ == "__main__": print(run_qa_scan())