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 pruebas con Selenium, Playwright, o scrapers), el problema suele ser más sutil: el entorno de ejecución no está emulando correctamente el comportamiento de un navegador real.


🔍 Causa raíz técnica

Cloudflare (y similares como Akamai o Imperva) implementa mecanismos de verificación como:

  • JavaScript Challenge: El servidor envía un script que debe ejecutarse para generar un token (ej. cf_chl_opt, __cf_bm, __cfuid) y validar que el cliente es un navegador real.
  • Cookie Challenge: Se requiere aceptar cookies de terceros (como __cf_bm) para mantener el estado de la sesión validada.
  • Behavioral Analysis: Detecta ausencia de eventos típicos del navegador (scroll, mousemove, etc.) o headers inusuales.

En entornos headless o automatizados, si no se emula correctamente el flujo de validación, el servidor sigue devolviendo la página de desafío en lugar de la página solicitada.


✅ Solución definitiva (para scraping/automatización)

Opción 1: Usar un navegador real con soporte para Cloudflare (recomendado)

✅ Con Playwright (Python/Node.js)

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless="new")  # Usa el nuevo headless mode
    context = browser.new_context(
        viewport={"width": 1920, "height": 1080},
        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()

    # Navega y espera a que Cloudflare resuelva el desafío automáticamente
    page.goto("https://ejemplo.com", wait_until="networkidle")

    # Si aún falla, fuerza la resolución del desafío con un timeout generoso
    try:
        page.wait_for_selector("#challenge-error-text", timeout=5000)
        # Si aparece el error, espera más tiempo y reintentar
        page.wait_for_timeout(8000)  # Espera a que Cloudflare resuelva el challenge
        page.reload(wait_until="networkidle")
    except:
        pass  # No hubo challenge, todo bien

    content = page.content()
    print(content)
Enter fullscreen mode Exit fullscreen mode

⚠️ Clave: Usa headless="new" (disponible desde Playwright v1.40+) y evita headless=True clásico, que es fácilmente detectable.


Opción 2: Usar cloudscraper (Python, para scrapers simples)

pip install cloudscraper
Enter fullscreen mode Exit fullscreen mode
import cloudscraper

scraper = cloudscraper.create_scraper(
    browser={
        'browser': 'chrome',
        'platform': 'windows',
        'mobile': False
    }
)

response = scraper.get("https://ejemplo.com")
print(response.text)
Enter fullscreen mode Exit fullscreen mode

cloudscraper incluye un motor integrado para resolver desafíos de Cloudflare automáticamente.


Opción 3: Verifica configuración del entorno (si usas Selenium)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
options.add_argument("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")

driver = webdriver.Chrome(options=options)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
    Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined
    })
    """
})

driver.get("https://ejemplo.com")
# Espera manual o automática hasta que desaparezca el desafío
Enter fullscreen mode Exit fullscreen mode

🛠️ Pro-tip: Diagnóstico rápido

  1. Verifica headers: Cloudflare rechaza peticiones sin Accept-Language, Accept-Encoding, o con User-Agent obsoleto.
  2. Revisa cookies: Si no se guardan cookies como __cf_bm, el desafío se repite infinitamente.
  3. Prueba en navegador real: Si en Chrome normal funciona, pero en tu script no, el problema es de emulación, no del sitio.

🔥 Consejo final: Cloudflare está evolucionando hacia desafíos más agresivos (como el "Turnstile"). Evita usar requests o urllib puros: siempre usa un navegador emulado con soporte explícito para Cloudflare.


Resultado esperado: El <span id="challenge-error-text"> desaparece y obtienes el contenido real de la página.

Top comments (0)