Hacemos una verificación exhaustiva cada una de las secciones en nuestra web con la meta de enseñarte en todo momento la información veraz y certera.
Solución:
Sí, es una “característica”, por seguridad. Como se mencionó anteriormente, aquí está la discusión del error: https://bugs.chromium.org/p/chromium/issues/detail?id=696481
Se agregó soporte en la versión de Chrome 62.0.3196.0 o superior para habilitar la descarga.
Aquí hay una implementación de python. Tuve que agregar el comando a los comandos de chromedriver. Intentaré enviar un PR para que se incluya en la biblioteca en el futuro.
def enable_download_in_headless_chrome(self, driver, download_dir):
# add missing support for chrome "send_command" to selenium webdriver
driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
params = 'cmd': 'Page.setDownloadBehavior', 'params': 'behavior': 'allow', 'downloadPath': download_dir
command_result = driver.execute("send_command", params)
Como referencia, aquí hay un pequeño repositorio para demostrar cómo usar esto: https://github.com/shawnbutton/PythonHeadlessChrome
actualización 2020-05-01 Ha habido comentarios que dicen que esto ya no funciona. Dado que este parche tiene más de un año, es muy posible que hayan cambiado la biblioteca subyacente.
Aquí hay un ejemplo de trabajo para Python basado en la respuesta de Shawn Button. He probado esto con Cromo 68.0.3440.75 & controlador cromado 2.38
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("prefs",
"download.default_directory": "/path/to/download/dir",
"download.prompt_for_download": False,
)
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
params = 'cmd': 'Page.setDownloadBehavior', 'params': 'behavior': 'allow', 'downloadPath': "/path/to/download/dir"
command_result = driver.execute("send_command", params)
driver.get('http://download-page.url/')
driver.find_element_by_css_selector("#download_link").click()
Esta es una característica de Chrome para evitar que el software descargue archivos a su computadora. Sin embargo, hay una solución. Lea más sobre esto aquí.
Lo que debe hacer es habilitarlo a través de DevTools, algo así:
async function setDownload ()
const client = await CDP(tab: 'ws://localhost:9222/devtools/browser');
const info = await client.send('Browser.setDownloadBehavior', behavior : "allow", downloadPath: "/tmp/");
await client.close();
Esta es la solución que alguien dio en el tema mencionado. Aquí está su comentario.
Si aceptas, puedes dejar una división acerca de qué le añadirías a esta crónica.