¿Tu suite de QA pasa en local pero falla en CI sin motivo aparente? Casi siempre el culpable es el estado compartido entre pruebas: cookies, almacenamiento local y sesiones que se filtran de un caso a otro. La solución es directa: un perfil de navegador aislado por cada caso de prueba, para que cada validación de tu integración CAPTCHA con CaptchaAI arranque desde un estado limpio y reproducible. Aplica a tu propia aplicación o a entornos que controlas (dev, staging, preproducción), nunca a sitios de terceros.
Por qué cada prueba necesita su propio perfil
Si dos pruebas comparten el mismo navegador, comparten su historial: una cookie o un token que sobra de un caso anterior basta para que uno pase y el siguiente falle de forma intermitente.
Conviene aislar perfiles sobre todo cuando tienes:
- pruebas en paralelo con varios usuarios de QA distintos
- validaciones de onboarding, login y recuperación de sesión
- regresiones que exigen repetir exactamente el mismo estado inicial
- comparaciones entre entornos internos (dev, staging, preproducción)
Qué debe aislar cada perfil
Un perfil bien delimitado mantiene separado todo lo que puede arrastrar estado de una corrida a otra:
| Elemento | Recomendación para QA |
|---|---|
| Cookies | Un conjunto por usuario de prueba |
| Local storage y session storage | Limpieza al inicio de cada corrida |
| Credenciales | Solo cuentas internas de prueba |
| Datos de formularios | IDs y payloads ficticios |
| Evidencia de ejecución | Logs y capturas por perfil |
Secuencia de validación paso a paso
Respeta el orden: el reset final asegura que la siguiente ejecución arranque limpia.
- Crea un perfil por caso de prueba.
- Carga datos controlados (usuario, carrito o formulario ficticio).
- Ejecuta el flujo con CaptchaAI en tu entorno propio.
- Valida la respuesta del backend y el estado final de la sesión.
- Reinicia el perfil para la siguiente corrida.
Cómo modelar el estado del perfil en Python
Describe cada perfil como un objeto y serialízalo a disco antes de cada corrida para reproducirlo idéntico en cualquier runner.
from dataclasses import dataclass
from pathlib import Path
import json
@dataclass
class QAProfile:
name: str
base_url: str
user_id: str
def build_profile_state(profile: QAProfile) -> dict:
return {
"profile": profile.name,
"base_url": profile.base_url,
"user_id": profile.user_id,
"cookies": [],
"local_storage": {},
"session_storage": {},
}
def save_state(profile: QAProfile, root: Path) -> Path:
root.mkdir(parents=True, exist_ok=True)
state_file = root / f"{profile.name}.json"
state_file.write_text(
json.dumps(build_profile_state(profile), ensure_ascii=False, indent=2),
encoding="utf-8",
)
return state_file
profiles = [
QAProfile(name="qa-checkout-a", base_url="https://staging.example.com", user_id="qa-user-a"),
QAProfile(name="qa-checkout-b", base_url="https://staging.example.com", user_id="qa-user-b"),
]
for p in profiles:
file_path = save_state(p, Path("./qa-profiles"))
print(f"Perfil inicializado: {file_path}")
Cada perfil parte con cookies y storage vacíos; su JSON queda como fixture versionable junto a los tests.
Puntos de control al integrar CaptchaAI
Durante la ejecución de QA, verifica que:
- la
sitekeycorresponde al entorno de pruebas, no al de producción pageurlcoincide con el dominio interno que tienes autorizado- la respuesta del solver queda registrada en los logs del test
- el backend confirma el resultado esperado sin tocar datos reales
Una misma configuración de navegador en local, staging y CI
Usa la misma configuración de navegador en QA, staging y CI para evitar que un test pase en local y falle en CI sin razón aparente.
from selenium import webdriver
def make_driver(headless: bool = True) -> webdriver.Chrome:
options = webdriver.ChromeOptions()
if headless:
options.add_argument('--headless=new')
options.add_argument('--window-size=1280,800')
options.add_argument('--lang=es-ES')
return webdriver.Chrome(options=options)
Mantener viewport, idioma y user-agent idénticos en todos los runners reduce la varianza entre ejecuciones.
Qué medir para detectar regresiones
Incluye métricas para los pasos de CAPTCHA en tus pipelines de QA y detecta regresiones en tu integración antes de que lleguen a producción:
- Tiempo de resolución por intento — desde la solicitud a CaptchaAI hasta la entrega del token.
- Tasa de éxito por endpoint propio — cuántas verificaciones del backend pasan respecto al total de intentos.
- Distribución de errores — agrupados por código (
ERROR_*, timeouts internos, fallos de red). - Latencia extremo a extremo — incluyendo render de la página, resolución del CAPTCHA y respuesta de tu backend.
Conserva las trazas (logs, capturas, HAR) para reproducir incidentes cuando un test falle de forma intermitente.
Buenas prácticas para tu QA
- Prueba siempre sobre tu propia aplicación o sobre entornos explícitamente autorizados.
- Mantén una API key de CaptchaAI separada para QA, distinta de la de producción, para no mezclar métricas.
- Define timeouts y reintentos razonables (
backoffexponencial) para no acumular trabajos pendientes en CaptchaAI durante caídas. - Versiona tus snapshots de configuración (sitekey, action, umbrales) junto al código de los tests.
- Revisa periódicamente el changelog de tu proveedor de CAPTCHA para anticipar cambios que afecten a tu integración.
En USD, una API key de QA dedicada mantiene el costo de tus pruebas predecible cada mes, útil para agencias y equipos que facturan en monedas locales volátiles.
Diagnóstico de problemas comunes
| Problema | Causa común | Acción recomendada |
|---|---|---|
| La prueba pasa en un perfil y falla en otro | Estado inicial diferente | Estandariza el reset de cookies y storage |
| Resultados no reproducibles | Datos de prueba cambiantes | Congela los fixtures y versiona los casos |
| Mezcla de sesiones entre pruebas | Reutilización accidental de perfil | Asigna un perfil único por suite o escenario |
| Token rechazado en QA | URL o configuración no alineada | Revisa pageurl, la sitekey y la validación del backend |
Preguntas frecuentes
¿Puedo usar un solo perfil para toda mi suite?
No conviene. Un perfil compartido arrastra cookies y storage entre casos, y ahí nacen los fallos intermitentes. Usa un perfil por caso de prueba o por suite corta.
¿Qué tipos de CAPTCHA puedo validar con CaptchaAI en mis entornos?
CaptchaAI resuelve reCAPTCHA v2 y v3, Cloudflare Turnstile y Challenge, GeeTest v3, CAPTCHA de imagen/OCR, grid y BLS; CaptchaFox, Friendly Captcha y Lemin están en beta. hCaptcha y FunCaptcha no son compatibles, y GeeTest v4 figura como próximamente.
¿Cómo evito que un test falle de forma intermitente en CI?
Aísla el paso de CAPTCHA en una función con reintentos controlados y backoff exponencial, y registra métricas por intento para distinguir fallos de red, timeouts del proveedor y errores de configuración. Usa siempre cuentas internas de prueba y datos ficticios, nunca datos productivos.
Guías relacionadas
- Pruebas autorizadas de CAPTCHA en QA
- Validación de CAPTCHA en formularios de registro
- Cuando el navegador falla y la API responde: cómo depurarlo
Separa tus perfiles de QA por sesión y entorno para validar CAPTCHA con trazabilidad técnica y datos reproducibles. Empieza con CaptchaAI en tu propia aplicación.