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)
⚠️ Clave: Usa
headless="new"(disponible desde Playwright v1.40+) y evitaheadless=Trueclásico, que es fácilmente detectable.
Opción 2: Usar cloudscraper (Python, para scrapers simples)
pip install cloudscraper
import cloudscraper
scraper = cloudscraper.create_scraper(
browser={
'browser': 'chrome',
'platform': 'windows',
'mobile': False
}
)
response = scraper.get("https://ejemplo.com")
print(response.text)
cloudscraperincluye 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
🛠️ Pro-tip: Diagnóstico rápido
-
Verifica headers: Cloudflare rechaza peticiones sin
Accept-Language,Accept-Encoding, o conUser-Agentobsoleto. -
Revisa cookies: Si no se guardan cookies como
__cf_bm, el desafío se repite infinitamente. - 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
requestsourllibpuros: 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)