python - 如何在继续之前等待在 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 秒)并完成。
关于如何解决这个问题的任何想法?
解决方案
这是我解决它的方法。我需要添加第二个中断以跳出第二个循环。向树中添加了更多内容:
# 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
推荐阅读
- python - 机器人框架的自定义 Python 关键字 - 预期 0 个参数,得到 1 个
- c# - 如何根据用户的 SQL Query 输入动态过滤 ASP.NET 中的 DataTable
- vert.x - Quarkus - 如何使用多个反应式 PgPool 测试 CDI 服务
- git - 将相同的手术修复应用于两个非常不同的分支
- php - 如何更改付款方式的图标分配
- psexec - 远程 pc 上的 psexec 命令引发错误 - 用户名或密码不正确”?
- haskell - 类似于列表的自定义数据构造函数的模式匹配
- html - 有没有办法在电子邮件通讯/签名中隐藏被阻止的 html 图像?
- luis.ai - 将域 (.ai) 从 namecheap 迁移到 Route 53
- sitecore - 在 Sitecore RTE 中禁用 XHTML