即使通过 webdriver+python 设置浏览器首选项后也无法抑制操作系统下载文件窗口

Posted

技术标签:

【中文标题】即使通过 webdriver+python 设置浏览器首选项后也无法抑制操作系统下载文件窗口【英文标题】:Cannot suppress the OS download file window even after setting browser preference through webdriver+python 【发布时间】:2013-09-26 21:56:52 【问题描述】:

我知道以前有人问过这个问题,但在尝试了建议后,我不断得到操作系统下载文件窗口。我想要做的是下载一个 pdf 文件。我已经设置了浏览器首选项,但尽管如此,它并没有抑制操作系统窗口。

这是我写的代码sn-p:

firefoxProfile = webdriver.FirefoxProfile()
firefoxProfile.set_preference('browser.download.folderList', 2)
firefoxProfile.set_preference('browser.download.manager.showWhenStarting', False)
firefoxProfile.set_preference('browser.download.dir', '/media/pinku/Pinku')
firefoxProfile.set_preference('browser.helperApps.alwaysAsk.force', False)
firefoxProfile.set_preference('browser.helperApps.neverAsk.saveToDisk',
'application/octet-stream')

self.driver = webdriver.Firefox(firefoxProfile)

我正在使用 Ubuntu 12.10、Firefox、webdriver、python

【问题讨论】:

【参考方案1】:

我认为您可能弄错了 MIME 类型。试试这个

firefoxProfile.set_preference('browser.helperApps.neverAsk.saveToDisk',
'application/pdf,application/x-pdf')

可以找到关于 pdf MIME 类型的讨论here 当您尝试下载 pdf 时,您应该检查您的 firefox 看到的 mime 类型。可能是我服务器设置错了!

旁注:每当这个话题出现(通过 selenium webdriver 下载文件)我强烈建议不要这样做!阅读文章"How To Download Files With Selenium And Why You Shouldn’t" 进行推理。基本上它建议使用其他方式来测试直接下载。

更新:我没有将两种 mime 类型放在一个字符串中,之前这是错误的。我还添加了有关检查服务器实际交付内容的建议。

【讨论】:

您建议的文章很棒,因为它为我提供了另一种测试文件下载的方法。但是,我仍然对为什么上面的代码不起作用感到惊讶?我将 mime 类型更改为 application/x-pdf,甚至尝试了 application/pdf,但它不起作用!仍然显示操作系统窗口.. :( 很遗憾听到它毕竟不是 MIME 类型。您可以尝试设置browser.download.folderList', 1,但这是一个疯狂的猜测 甚至尝试使用browser.download.folderList', 1。没用。 您是否检查了您尝试从中获取 pdf 的服务器实际返回的 mime 类型? 我使用 Chrome 浏览器找到了您问题的答案,在 Chrome 开发者工具 () 的 Network 选项卡下,我看到了 application/pdf 。这是您所说的 MIME 类型吗?抱歉在这里有点天真。【参考方案2】:

我一直在使用 firefox 24.03(这是 ESR 版本) 这个版本的firefox引入了pdfjs。这将在浏览器中打开 PDF。

所以你需要抑制它。 这是对我有用的代码/firefox 配置文件。

fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir","C:\\temp")
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/pdf")
fp.set_preference("plugin.disable_full_page_plugin_for_types", "application/pdf")
fp.set_preference("pdfjs.disabled", True)
driver = webdriver.Firefox(firefox_profile=fp)

有了这个配置文件,我所有的 pdf 下载都转到“C:\temp”

【讨论】:

【参考方案3】:

我遇到了类似的问题,因为服务器返回的 mime 类型是“text/plain”而不是“text/csv”。

这对我有用(使用 watir-webdriver):

profile = Selenium::WebDriver::Firefox::Profile.new
profile['browser.download.folderList'] = 2 # custom location
profile['browser.download.dir'] = download_directory
profile['browser.helperApps.neverAsk.saveToDisk'] = "text/plain"
browser = Watir::Browser.new :firefox, :profile => profile

更多关于使用 watir-webdriver 下载的信息:http://watirwebdriver.com/browser-downloads/

【讨论】:

以上是关于即使通过 webdriver+python 设置浏览器首选项后也无法抑制操作系统下载文件窗口的主要内容,如果未能解决你的问题,请参考以下文章

在python里用selenium webdriver打开火狐浏览器后总是报错?

Python WebDriver + Firefox 文件下载

Python+Selenium笔记:WebDriver和WebElement

在 url 中嵌入凭据以使用 selenium webdriver 加载网站

即使没有错误,也无法使用Selenium Webdriver注册零售网站

如何在 Selenium Webdriver Python 3 中使用 Chrome 配置文件