如何在不打开对话框的情况下通过 Selenium (Python) 自动下载 CSV 文件
How to download automatically a CSV file via Selenium (Python) without opening the dialog box
我的环境:
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 单击按钮时,特定文件将被下载到我用默认名称指定的某个默认目录。经过大量谷歌搜索(包括 whosebug.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()
但除此之外,主要问题仍然存在,即每次出现对话框。现在,我一直在查看网络上的许多页面(论坛、教程等),当我比较他们建议的代码时,在我看来,我已经以相同的方式进行了,但我看不到其他术语添加 command/option should/could 以防止打开对话框并自动下载 CSV 文件。如果您能澄清一下并指出我的代码有什么问题,我将不胜感激。
好的,所以在网上搜索了很多之后,我终于在 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
参数,以便
每次下载时浏览器都会自动使用该目录
文件。
希望这对遇到同样问题的人有所帮助。
我的环境:
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 单击按钮时,特定文件将被下载到我用默认名称指定的某个默认目录。经过大量谷歌搜索(包括 whosebug.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()
但除此之外,主要问题仍然存在,即每次出现对话框。现在,我一直在查看网络上的许多页面(论坛、教程等),当我比较他们建议的代码时,在我看来,我已经以相同的方式进行了,但我看不到其他术语添加 command/option should/could 以防止打开对话框并自动下载 CSV 文件。如果您能澄清一下并指出我的代码有什么问题,我将不胜感激。
好的,所以在网上搜索了很多之后,我终于在 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
参数,以便 每次下载时浏览器都会自动使用该目录 文件。
希望这对遇到同样问题的人有所帮助。