DEV Community

Erick Eduardo Ramos
Erick Eduardo Ramos

Posted on

Cómo solucionar el error \"Enable JavaScript and cookies to continue\"

Cómo solucionar el error "Enable JavaScript and cookies to continue"

Este mensaje aparece cuando un sitio web (especialmente uno protegido por Cloudflare) detecta que el navegador del cliente no cumple con los requisitos mínimos de seguridad: JavaScript deshabilitado o cookies bloqueadas. Pero en entornos de desarrollo o automatización (como scrapers, pruebas con Selenium, o peticiones HTTP directas), el problema suele ser más sutil.


🔍 Raíz técnica

Cloudflare (u otros WAFs) emite este desafío (/cdn-cgi/challenge-platform/...) como parte de su mecanismo de verificación de navegador real. Ocurre cuando:

  1. No se ejecuta JavaScript (obligatorio para generar tokens dinámicos).
  2. No se aceptan cookies (necesarias para mantener el estado del desafío resuelto).
  3. El cliente HTTP no simula un navegador real (falta de headers como User-Agent, Accept-Language, etc.).
  4. El servidor detecta comportamiento no humano (peticiones rápidas, sin interacción, sin cookies previas).

⚠️ No es un error de tu código front-end — es una defensa del servidor contra bots.


✅ Solución definitiva (según caso de uso)

🧪 Caso 1: Automatización (Selenium, Playwright, Puppeteer)

No uses requests o curl para este caso. Necesitas un navegador real.

✅ Ejemplo con Playwright (recomendado):

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()

    # Simula comportamiento humano (opcional pero recomendado)
    page.add_init_script("""
        Object.defineProperty(navigator, 'webdriver', { get: () => false });
    """)

    page.goto("https://example.com", wait_until="networkidle")

    # Espera a que Cloudflare resuelva el desafío (si no se resuelve automáticamente)
    page.wait_for_selector("#challenge-error-text", state="detached", timeout=10000)

    # Ahora puedes hacer scraping
    content = page.content()
    browser.close()
Enter fullscreen mode Exit fullscreen mode

💡 Clave: Playwright mantiene cookies, ejecuta JS y emula headers reales por defecto.


🌐 Caso 2: Peticiones HTTP directas (Python requests, Node.js axios, etc.)

No es posible resolver el desafío sin un navegador. Cloudflare usa:

  • cf_clearance cookie (generada tras resolver el desafío JS).
  • Tokens dinámicos (__cf_chl_rt_tk).
  • Tiempos de resolución medidos en milisegundos.

✅ Solución realista:

  1. Usa un proxy con navegador headless (como browserless.io) o
  2. Almacena cookies válidas de una sesión previa resuelta manualmente.

Ejemplo: Reutilizar cookies de una sesión resuelta (solo para pruebas locales)

import requests

# 1. Resuelve el desafío manualmente en tu navegador → copia la cookie `cf_clearance`
# 2. Usa esa cookie en tus peticiones

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    "Cookie": "cf_clearance=abc123xyz; __cf_bm=def456..."
}

response = requests.get("https://example.com", headers=headers)
print(response.text)
Enter fullscreen mode Exit fullscreen mode

⚠️ Advertencia: Las cookies cf_clearance caducan (usualmente 1-2 horas). No es escalable para producción.


🛠️ Caso 3: Desarrollo local (tu propio sitio protegido por Cloudflare)

Si estás probando tu app detrás de Cloudflare:

  1. Desactiva temporalmente el modo "Under Attack" en Cloudflare Dashboard → Security → Settings.
  2. O usa Modo de desarrollo (Cloudflare Dashboard → Caching → ConfigurationPurge everything + Development mode).

🧠 Pro-tip: Evita este problema desde el diseño

  • Usa Cloudflare con modo "I'm Under Attack" desactivado en entornos de desarrollo.
  • Si necesitas automatización real: implementa una API propia que haga de proxy con navegador (ej: FastAPI + Playwright).
  • Para scraping: considera scraping legal y ético → usa APIs oficiales o servicios como Zyte o ScraperAPI.

Regla de oro: Si ves /challenge-error-text, no es un bug de tu código — es una defensa activa. Tu solución debe burlarla (con navegador) o evitarla (con API autorizada).

Top comments (0)