【问题标题】:How to download automatically a CSV file via Selenium (Python) without opening the dialog box如何在不打开对话框的情况下通过 Selenium (Python) 自动下载 CSV 文件
【发布时间】:2021-06-25 17:26:58
【问题描述】:

我的环境:

Firefox version : 78.9.0esr (64 bits)
Web driver : geckodriver-v0.26.0-win64
OS: Windows 10 (64 bits)
Python version: 3.8 (64 bits)
Python Selenium package version : 3.141.0

我的要求是通过 Selenium(Python 代码)从网页下载 CSV 文件,但不打开对话框。我的意思是,如果您手动单击下载按钮,您会看到一个对话框,询问名称(如果您想更改默认名称)和保存文件的位置。我想要做的是绕过对话框步骤,因此当 Selenium 单击按钮时,特定文件将被下载到我用其默认名称指定的某个默认目录。经过大量谷歌搜索(包括 stackoverflow.com 上的线程)后,我了解到这可以通过为 Selenium 使用的 Firefox 实例创建一个新配置文件来通过以下方式实现。所以这是我的代码:

self.profile = webdriver.FirefoxProfile()
self.profile.set_preference("browser.preferences.instantApply", True)
self.profile.set_preference("browser.download.folderList", 2)
self.profile.set_preference("browser.download.dir", os.getcwd())
self.profile.set_preference(
    "browser.helperApps.neverAsk.saveToDisk",
    "text/csv;charset=ISO-8859-1"
)
self.profile.set_preference(
    "browser.helperApps.neverAsk.openFile",
    "text/csv;charset=ISO-8859-1"
)
self.profile.set_preference(
    "browser.download.manager.showWhenStarting",
    False
)
self.profile.set_preference(
    "browser.download.manager.showAlertOnComplete",
    False
)
self.profile.set_preference("browser.download.panel.shown", False)
self.profile.set_preference(
    "browser.download.manager.focusWhenStarting",
    False
)
self.profile.set_preference(
    "browser.download.manager.useWindow",
    False
)
self.profile.set_preference(
    "browser.download.manager.closeWhenDone",
    False
)
self.web_driver = webdriver.Firefox(firefox_profile=self.profile)

现在上面提到的代码的问题是它仍然打开对话框,唯一有效的部分如下:

self.profile.set_preference("browser.download.folderList", 2)
self.profile.set_preference("browser.download.dir", os.getcwd()

但除此之外,主要问题仍然存在,即每次出现对话框时。现在我一直在查看网络上的许多页面(论坛、教程等),当我比较他们建议的代码时,在我看来我已经以同样的方式进行了,我看不出还有什么其他的术语应该/可以添加命令/选项,以防止打开对话框,而是自动下载 CSV 文件。如果您能澄清一下并指出我的代码有什么问题,我将不胜感激。

【问题讨论】:

    标签: python selenium firefox geckodriver selenium-firefoxdriver


    【解决方案1】:

    好的,所以在网上搜索了很多之后,我终于在firefox本身的参数页面(about:config)中找到了我的问题的答案:browser.download.useDownloadDir

    这是我的代码的新版本,它运行良好并且可以完成工作:

    self.profile = webdriver.FirefoxProfile()
    self.profile.set_preference("browser.download.folderList", 2)
    self.profile.set_preference("browser.download.dir", os.getcwd())
    self.profile.set_preference(
        "browser.helperApps.neverAsk.saveToDisk",
        "text/csv"
    )
    self.profile.set_preference("browser.download.useDownloadDir", True)
    self.web_driver = webdriver.Firefox(firefox_profile=self.profile)
    

    所以这个新版本与之前的版本相比有什么变化:

    • 我将 MIME 类型更改为简单的 text/csv 而不是 text/csv;charset=ISO-8859-1

    • 我删除了几个似乎没有影响的配置文件参数 结果。

    • 最重要的部分是我添加了 browser.download.useDownloadDir 我的个人资料中的参数。根据我所做的不同测试,似乎指定参数 仅browser.helperApps.neverAsk.saveToDisk 是不够的。确实 一旦您使用定义所需的下载目录 browser.download.dir 那么你真的需要明确地告诉 Firefox 通过 browser.download.useDownloadDir 参数使 每次下载时浏览器都会自动使用该目录 文件。

    我希望这可以帮助那些可能遇到同样问题的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 2020-12-03
      • 2023-03-21
      • 2016-11-17
      • 2018-03-03
      • 2014-09-11
      相关资源
      最近更新 更多