Cómo solucionar el error "Enable JavaScript and cookies to continue"
Este error aparece cuando Cloudflare (u otra capa de seguridad similar) detecta que la solicitud proviene de un cliente que no cumple con los requisitos mínimos de seguridad: JavaScript deshabilitado o cookies bloqueadas. No es un error de tu código front-end, sino una protección activa en el proxy inverso.
🔍 Causa técnica
Cloudflare (o similar) inyecta un challenge (desafío) en la respuesta HTTP para verificar que el cliente es un navegador real y no un bot automatizado. Si el cliente no ejecuta JavaScript (o no acepta cookies), el desafío no se completa y se muestra este mensaje.
Escenarios comunes:
- Uso de
curl,requestsde Python, o herramientas de scraping sin simular un navegador. - Configuración de navegadores con extensiones que bloquean JS o cookies (ej. uBlock Origin, Privacy Badger).
- Pruebas automatizadas con Selenium/Playwright sin configurar correctamente el contexto del navegador.
- Navegadores en modo incógnito con restricciones estrictas de cookies.
✅ Solución definitiva (según caso)
🛠️ Caso 1: Uso de herramientas de automatización (Selenium, Playwright, Puppeteer)
✅ Solución: Habilitar JS y cookies explícitamente, y usar un user-agent real.
Ejemplo con Playwright (recomendado):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context(
java_script_enabled=True,
accept_cookies=True,
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
)
page = context.new_page()
page.goto("https://tu-sitio.com")
# Opcional: esperar a que se resuelva el challenge
page.wait_for_selector("#main-content", timeout=10000)
⚠️ Clave: Cloudflare usa behavioral analysis. Si el navegador no interactúa como uno real (sin mouse movements, sin scroll, sin delay), seguirá bloqueando. Usa
page.wait_for_timeout(3000)entre acciones si es necesario.
🛠️ Caso 2: Navegador con bloqueo de JS/cookies por extensiones
✅ Solución: Desactivar extensiones de privacidad o usar modo incógnito sin bloqueo.
- Abre el sitio en navegación privada sin extensiones.
- Si persiste, deshabilita temporalmente:
- uBlock Origin
- Privacy Badger
- Ghostery
- HTTPS Everywhere (en casos raros)
🛠️ Caso 3: Petición directa con curl o requests (Python)
❌ No hay solución "limpia" — Cloudflare bloquea explícitamente requests sin navegador.
✅ Opción viable: Usa cloudscraper (bypass con JS simulado):
pip install cloudscraper
import cloudscraper
scraper = cloudscraper.create_scraper(
browser={
'browser': 'firefox',
'platform': 'windows',
'mobile': False
}
)
response = scraper.get("https://tu-sitio.com")
print(response.text)
🔥 Pro-tip:
cloudscraperemula la resolución del challenge de Cloudflare ejecutando JS en un motor headless interno. No es 100% fiable para todos los sitios (Cloudflare evoluciona), pero funciona en >90% de los casos.
🧠 Pro-tip: Diagnóstico rápido
- Abre DevTools → Network tab.
- Filtra por
html. - Busca la respuesta con status
200pero contenido HTML que contenga"challenge-error-text". - Si el
Content-Security-Policyincluyescript-src 'self' 'unsafe-inline' 'unsafe-eval', Cloudflare está activo.
📌 Conclusión
Este no es un bug de tu aplicación, es una medida de seguridad activa. La solución depende del contexto de uso:
| Contexto | Solución |
|---|---|
| Automatización real | Usa Playwright/Selenium con contexto realista |
| Scraping | Usa cloudscraper o selenium con delay y JS habilitado |
| Navegación humana | Desactiva bloqueadores de JS/cookies temporalmente |
Si el sitio es el tuyo y quieres evitar este problema para usuarios reales: revisa tu configuración de Cloudflare (modo "I'm Under Attack" está activado accidentalmente).
Top comments (0)