使用CDP命令批量下载文件时重复获取首个下载ID的问题
解决CDP下载多文件时无法获取新下载ID的问题
你的核心问题在于依赖Download.getLastCompleted主动轮询的方式,无法及时捕获新完成的下载——这个接口只会返回最后一次完成的下载ID,在新下载未完成前会持续返回旧ID,导致等待逻辑失效。正确的做法是通过监听CDP的Download.downloadCompleted事件,被动接收每一次下载完成的通知,而非主动轮询。
修正后的实现步骤
- 初始化存储下载ID的容器,用于记录所有完成的下载
- 启用CDP下载权限后,注册
Download.downloadCompleted事件的回调,自动收集新的下载ID - 触发下载操作后,等待新ID被添加到容器中,确保获取到最新的下载记录
示例代码
def __init__(self): self.downloaded_file_ids = set() # 用于去重存储已完成的下载ID self.download_id_queue = [] # 用于按顺序接收新的下载ID # 其他初始化逻辑... def setup_cdp_download(self): # 启用指定类型文件的下载权限 self.chrome_devtools_protocol( 'Download.enable', {'allowedContentTypes': ['application/zip']} ) # 注册Download.downloadCompleted事件回调,自动收集下载ID self.driver.add_cdp_listener( 'Download.downloadCompleted', lambda params: self.download_id_queue.append(params['id']) ) def get_new_download_id(self): # 等待新的下载ID出现 WebDriverWait(self.driver, 60).until( lambda _: len(self.download_id_queue) > len(self.downloaded_file_ids) ) # 获取最新的下载ID并标记为已处理 new_id = self.download_id_queue[-1] self.downloaded_file_ids.add(new_id) return new_id # 使用示例 self.setup_cdp_download() # 触发第一个文件下载操作(如点击下载按钮) first_download_id = self.get_new_download_id() # 触发第二个文件下载操作 second_download_id = self.get_new_download_id()
关键说明
- 事件监听的方式能实时捕获每一次下载完成的事件,避免了主动轮询的延迟和重复获取旧ID的问题
- 通过
download_id_queue记录所有下载ID,结合downloaded_file_ids去重,确保每次获取的都是未处理过的新ID - 无需再依赖
Download.getLastCompleted接口,彻底解决多文件下载时的ID获取问题
内容的提问来源于stack exchange,提问作者user3424778
相关产品推荐
相关产品推荐

