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

23
applecider 17 Дек 2015 в 18:57

8 ответов

Лучший ответ

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


Общая идея заключается в том, чтобы подождать, пока файл не появится в вашем каталоге «Downloads» .

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

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

17
Community 23 Май 2017 в 12:17

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

Вы можете создать поток, скажем, 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()
3
DHS 16 Май 2019 в 03:52

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

0
kd88 18 Дек 2017 в 14:36

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

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
1
C. Feng 3 Дек 2018 в 22:29

Это сработало для меня:

fileends = "crdownload"
while "crdownload" in fileends:
    sleep(1)
    for fname in os.listdir(some_path): 
        print(fname)
        if "crdownload" in fname:
            fileends = "crdownload"
        else:
            fileends = "None"
0
greencode 4 Ноя 2019 в 16:05

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

Код проверяет имена файлов в некотором каталоге загрузки каждую секунду и завершается, когда они завершены или если для их завершения требуется более 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
13
Sanon Selkov 6 Сен 2019 в 11:30

Проверьте наличие «неподтвержденного» ключевого слова в имени файла в каталоге загрузки:

            #wait for download complete
            wait = True
            while(wait==True):
                for fname in os.listdir('\path\to\download directory):
                    if ('Unconfirmed') in fname:
                        print('downloading files ...')
                        time.sleep(10)
                    else:
                        wait=False
            print('finished downloading all files ...')

Как только загрузка файла завершена, она выходит из цикла while.

0
Jawad Ahmad Khan 27 Янв 2020 в 08:01
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

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

0
Prashanth Sridhar 29 Июн 2018 в 05:29