103 lines
3.9 KiB
Python
103 lines
3.9 KiB
Python
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()) |