首页 > 解决方案 > 如何在继续之前等待在 Selenium 和 Python 中下载文件

问题描述

print('Hello world!')

我正在尝试使用 selenium 从 Chrome 下载文件。每次我下载一个文件时,它都以'TCBT'开头,但每次下载的文件名都不一样。我只想下载那个文件。

当我最后一次点击下载文件时,发生了一件有趣的事情。该网站速度较慢,文件较大,因此一旦我单击下载,就会经过无法确定的时间(20-60 秒)。然后出现一个弹出窗口,然后开始下载文件,这需要另外 10-30 秒。

我已经尝试了几种不同的无限循环来确定文件何时完成下载,但它总是卡在循环中或跳过它。我相信它与文件名有关,因为我只能使用 glob 来找到我想要的。看一些例子:

一试:

while True:
download_folder = os.path.expanduser('~')+'/Downloads/'
filenames = glob.glob(download_folder+'TCBT*')
for name in filenames:
    if name.endswith('.crdownload'):
        time.sleep(1)
    if name.endswith('.xls'):
        break
    else:
        continue

无论如何,这都会不断循环。我正在尝试使用“继续”部分返回并获取文件名,因为在前 20-60 秒(等待弹出窗口开始下载)将没有文件。

我也尝试过使用我在网上找到的功能:

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

download_wait(download_folder, 30)

当我使用它时,什么也没有发生,我的脚本完成了。我假设它正在检查文件夹,没有看到任何文件(因为开始下载需要 20-60 秒)并完成。

关于如何解决这个问题的任何想法?

标签: pythonseleniumoperating-system

解决方案


这是我解决它的方法。我需要添加第二个中断以跳出第二个循环。向树中添加了更多内容:

# Wait for download
while True:
    download_folder = os.path.expanduser('~')+'/Downloads/'
    filenames = glob.glob(download_folder+'TCBT*')
    if len(filenames) > 0 and not any('.crdownload' in name for name in filenames):
        break
    for name in filenames:
        if name.endswith('.crdownload'):
            continue
        if name.endswith('.xls'):
            print('')
            print('Download complete.')
            print('')
            break
        else:
            break

推荐阅读