Python selenium, узнать, когда загрузка завершена?

Я использовал селен для запуска загрузки. После завершения загрузки необходимо предпринять определенные действия, есть ли простой способ узнать, когда загрузка завершена? (Я использую драйвер FireFox)

Ответ 1

Нет никакого встроенного в selenium способа дождаться завершения загрузки.


Общая идея здесь - подождать, пока файл не появится в вашем каталоге "Загрузки".

Это может быть достигнуто путем циклического повтора проверки наличия файла:

Или, используя такие вещи, как watchdog для контроля каталога:

Ответ 2

Я столкнулся с этой проблемой недавно. Я загружал несколько файлов одновременно, и мне нужно было создать тайм-аут, если загрузка не удалась.

Код проверяет имена файлов в некотором каталоге загрузки каждую секунду и завершается, когда они завершены или если для их завершения требуется более 20 секунд. Возвращенное время загрузки использовалось для проверки успешности загрузок или истечения времени ожидания.

import time
import os

def download_wait(path_to_downloads):
    seconds = 0
    dl_wait = True
    while dl_wait and seconds < 20:
        time.sleep(1)
        dl_wait = False
        for fname in os.listdir(path_to_downloads):
            if fname.endswith('.crdownload'):
                dl_wait = True
        seconds += 1
    return seconds

Я считаю, что это работает только с файлами Chrome, так как они заканчиваются расширением .crdownload. Может быть аналогичный способ проверки в других браузерах.

Редактировать: я недавно изменил способ использования этой функции для времен, когда .crdownload не отображается как расширение. По сути, это просто ждет правильного количества файлов.

def download_wait(directory, timeout, nfiles=None):
    """
    Wait for downloads to finish with a specified timeout.

    Args
    ----
    directory : str
        The path to the folder where the files will be downloaded.
    timeout : int
        How many seconds to wait until timing out.
    nfiles : int, defaults to None
        If provided, also wait for the expected number of files.

    """
    seconds = 0
    dl_wait = True
    while dl_wait and seconds < timeout:
        time.sleep(1)
        dl_wait = False
        files = os.listdir(directory)
        if nfiles and len(files) != nfiles:
            dl_wait = True

        for fname in files:
            if fname.endswith('.crdownload'):
                dl_wait = True

        seconds += 1
    return seconds

Ответ 3

Я знаю, что уже слишком поздно для ответа, хотя хотел бы поделиться взломом для будущих читателей.

Вы можете создать тему, скажем thread1 из основного потока, и начать загрузку здесь. Теперь создайте другой поток, скажем, thread2 и там, пусть он дождется завершения thread1, используя метод join(). Теперь вы можете продолжить выполнение после завершения загрузки.

Тем не менее, убедитесь, что вы не начинаете загрузку с помощью selenium, вместо этого извлеките ссылку с помощью selenium и используйте модуль запросов для загрузки.

Скачать с помощью модуля запросов

Например:

def downloadit():
     #download code here    

def after_dwn():
     dwn_thread.join()           #waits till thread1 has completed executing
     #next chunk of code after download, goes here

dwn_thread = threading.Thread(target=downloadit)
dwn_thread.start()

metadata_thread = threading.Thread(target=after_dwn)
metadata_thread.start()

Ответ 4

В Chrome файлы, которые еще не закончили загрузку, имеют расширение .crdownload. Если вы установите свой каталог загрузки, то можете подождать, пока файл, который вы хотите, больше не имеет этого расширения. В принципе, это не сильно отличается от ожидания существования файла (как предложенного alecxe), но по крайней мере вы можете отслеживать прогресс таким образом.

Ответ 5

x1=0
while x1==0:
    count=0
    li = os.listdir("directorypath")
    for x1 in li:
        if x1.endswith(".crdownload"):
             count = count+1        
    if count==0:
        x1=1
    else:
        x1=0

Это работает, если вы пытаетесь проверить, завершился ли набор файлов (более одного).

Ответ 6

Как уже было сказано, нет никакого способа проверить, завершена ли загрузка. Итак, вот вспомогательная функция, которая выполняет работу для Firefox и Chrome. Один трюк - очистить папку загрузки temp перед началом новой загрузки. Кроме того, используйте собственный путь для межплатформенного использования.

from pathlib import Path

def is_download_finished(temp_folder):
    firefox_temp_file = sorted(Path(temp_folder).glob('*.part'))
    chrome_temp_file = sorted(Path(temp_folder).glob('*.crdownload'))
    downloaded_files = sorted(Path(temp_folder).glob('*.*'))
    if (len(firefox_temp_file) == 0) and \
       (len(chrome_temp_file) == 0) and \
       (len(downloaded_files) >= 1):
        return True
    else:
        return False