当前位置: 首页 > 面试题库 >

Selenium(Python)-等待使用Chrome Web驱动程序完成下载过程

卓宏达
2023-03-14
问题内容

我正在通过chromewebdriver(windows)使用selenium和python来自动执行从不同页面下载大量文件的任务。我的代码可以运行,但是解决方案远非理想:下面的函数单击网站按钮,该按钮会启动Java脚本函数,该函数会生成PDF文件,然后下载该文件。

我必须使用静态等待才能等待下载完成(丑陋)。我无法检查文件系统以确认下载何时完成,因为我使用的是多线程(从不同页面下载很多文件)一次),并且文件名也会在网站本身中动态生成。

我的代码:

def file_download(num, drivervar):
Counter += 1
    try:
        drivervar.get(url[num])
        download_button = WebDriverWait(drivervar, 20).until(EC.element_to_be_clickable((By.ID, 'download button ID')))
        download_button.click()
        time.sleep(10) 
    except TimeoutException: # Retry once
        print('Timeout in thread number: ' + str(num) + ', retrying...')
.....

是否可以在webdriver中确定下载完成?我想避免使用time.sleep(x)。

非常感谢。


问题答案:

您可以通过chrome://downloads/使用驱动程序进行导航来获取每次下载的状态。

要等待所有下载完成并列出所有路径,请执行以下操作:

def every_downloads_chrome(driver):
    if not driver.current_url.startswith("chrome://downloads"):
        driver.get("chrome://downloads/")
    return driver.execute_script("""
        var items = downloads.Manager.get().items_;
        if (items.every(e => e.state === "COMPLETE"))
            return items.map(e => e.fileUrl || e.file_url);
        """)


# waits for all the files to be completed and returns the paths
paths = WebDriverWait(driver, 120, 1).until(every_downloads_chrome)
print(paths)


 类似资料:
  • 我设法用Selenium静默下载了文件。但是Firefox通过添加1、2、3自动重命名该文件。文件名,因为服务器发送的每个文件都具有相同的名称。但我想根据当前的日期和时间重命名文件。于是,试着: > 开始下载文件->DownloadLink.Click(); 而(不存在带有原始名称的文件或不存在 .part) · · { } 将下载的文件重命名为所需的名称。 但它会重命名一些文件。有些文件长度为0

  • 我在eclipse中使用SeleniumWebDriver和TestNG。问题是页面在某些数据的中途重新登录,并且重新加载的时间是灵活的,这就是为什么我不能应用显式等待时间。我想让webdriver等待,直到重新加载完成。 我正在尝试通过此代码执行此操作……但它不起作用。

  • 问题内容: 标题中已经存在的问题-如何使python脚本等到通过os.system()调用启动的某个过程完成?例如类似的代码 这将同时启动n次请求的进程,这可能会使我的PC有点汗水) 感谢您的任何建议。 问题答案: os.system() 确实 等待其过程完成后才返回。 如果您看到它不等待,则您正在启动的进程很可能会自行分离以在后台运行。在这种情况下,子进程。Popen+ wait示例Dor提供了

  • 问题内容: 我想从表格中的页面中抓取一些数据。所以我只为表中的数据而烦恼。之前我使用过Mechanize,但有时发现某些数据丢失了,尤其是在表格的底部。谷歌搜索,我发现这可能是由于机械化无法处理Jquery / Ajax。 所以我今天改用selenium。我该如何等待一个只有一个表完全加载,然后使用Selenium和python从该表中提取所有链接?如果我等待整个页面加载,则需要一些时间。我想确保

  • 问题内容: 我可以长时间等待Selenium Web Driver吗? 即使我可以像下面那样设置隐式等待命令,它也不会等待我给定的时间。 这里有什么问题吗? 就我而言,我需要执行一个测试用例并等待4分钟,然后执行下一个测试用例。 我在这里使用Java。 问题答案: 其实这不是我的答案,两天前我在这里看到了这个答案,但是我没有时间应用它。今天我尝试了,这就是我想要的。 不幸的是,现在我在这里看不到该

  • 我见过很多关于等待Selenium Web驱动程序(专门针对Java)的方法(比如这一个)。然而,应用这里的方法似乎并不奏效。 我试图通过在哈希表中的值中循环来测试用户查询结果。我在下面的代码中尝试了两种方法:等待Document.ReadyState和等待Class选择的项的加载。然而,看起来列表是在创建all,而没有留下完成元素刷新的时间。 我有时会出现以下错误,实际上可能是元素更新的时候。我