Saltar al contenido

Selenium (Python): esperando que se complete un proceso de descarga con el controlador web de Chrome

Por fin luego de tanto batallar ya encontramos la solución de esta interrogante que algunos usuarios de nuestra web han tenido. Si deseas aportar algún dato no dudes en compartir tu comentario.

Solución:

Puede obtener el estado de cada descarga visitando chrome://downloads/ con el conductor

Para esperar a que terminen todas las descargas y enumerar todas las rutas:

def every_downloads_chrome(driver):
    if not driver.current_url.startswith("chrome://downloads"):
        driver.get("chrome://downloads/")
    return driver.execute_script("""
        var items = document.querySelector('downloads-manager')
            .shadowRoot.getElementById('downloadsList').items;
        if (items.every(e => e.state === "COMPLETE"))
            return items.map(e => e.fileUrl || e.file_url);
        """)


# waits for all the files to be completed and returns the paths
paths = WebDriverWait(driver, 120, 1).until(every_downloads_chrome)
print(paths)

Se actualizó para admitir cambios hasta la versión 81.

He tenido el mismo problema y encontré una solución. Puede verificar si hay o no un .crdownload en su carpeta de descargas. Si hay 0 instancias de un archivo con la extensión .crdownload en la carpeta de descarga, todas sus descargas se completarán. Creo que esto solo funciona para cromo y cromo.

def downloads_done():
    while True:
        for filename in os.listdir("/downloads"):
            if ".crdownload" in i:
                time.sleep(0.5)
                downloads_done()

Siempre que llame a downloads_done(), se repetirá hasta que se completen todas las descargas. Si está descargando archivos masivos como 80 gigabytes, no lo recomiendo porque entonces la función puede alcanzar la máxima profundidad de recursión.

Edición de 2020:

def wait_for_downloads():
    print("Waiting for downloads", end="")
    while any([filename.endswith(".crdownload") for filename in 
               os.listdir("/downloads")]):
        time.sleep(2)
        print(".", end="")
    print("done!")

El argumento de la palabra clave “fin” en print() generalmente contiene una nueva línea, pero la reemplazamos. Si bien no hay nombres de archivo en la carpeta /descargas que terminen con .cr, descargue la suspensión durante 2 segundos e imprima un punto sin nueva línea en la consola.

Realmente ya no recomiendo usar selenium después de enterarme de las solicitudes, pero si es un sitio muy protegido con cloudflare y captchas, etc., es posible que deba recurrir a selenium.

Con Chrome 80, tuve que cambiar la respuesta de @florent-b por el siguiente código:

def every_downloads_chrome(driver):
    if not driver.current_url.startswith("chrome://downloads"):
        driver.get("chrome://downloads/")
    return driver.execute_script("""
        return document.querySelector('downloads-manager')
        .shadowRoot.querySelector('#downloadsList')
        .items.filter(e => e.state === 'COMPLETE')
        .map(e => e.filePath || e.file_path || e.fileUrl || e.file_url);
        """)

Creo que esto es compatible con versiones anteriores, quiero decir que funcionará con versiones anteriores de Chrome.

Sección de Reseñas y Valoraciones

Recuerda algo, que tienes concesión de explicar .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *