设置Firefox配置文件以使用Selenium和Java自动下载文件

时间:2016-03-30 12:46:06

标签: java selenium-webdriver

我想使用Selenium WebDriver和Java来验证文件下载。要下载的文件是PDF格式。当WebDriver点击"下载"在AUT中链接,Firefox打开以下下载确认窗口:

Download Confirmation Window

我希望Firefox自动下载文件而不显示上面的确认窗口,所以我使用了以下代码:

FirefoxProfile firefoxProfile=new FirefoxProfile();
firefoxProfile.setPreference("browser.download.folderList",2);
firefoxProfile.setPreference("browser.download.manager.showWhenStarting",false);
firefoxProfile.setPreference("browser.download.dir",downloadPath);
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","application/pdf");
WebDriver driver=new FirefoxDriver(firefoxProfile); 

但Firefox仍显示相同的窗口。如何设置Firefox配置文件以便自动下载PDF文件而不显示确认对话框?

7 个答案:

答案 0 :(得分:30)

就像@Jason建议的那样,它很可能是另一种mime类型。 获取mime类型:

  • 打开开发人员工具
  • 转到网络
  • 点击链接下载pdf
  • 在网络面板中,选择第一个请求
  • mime类型是响应标头中的Content-Type:

enter image description here

然后使用Firefox下载PDF:

FirefoxOptions options = new FirefoxOptions();
options.setPreference("browser.download.folderList", 2);
options.setPreference("browser.download.dir", "C:\\Windows\\temp");
options.setPreference("browser.download.useDownloadDir", true);
options.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/pdf");
options.setPreference("pdfjs.disabled", true);  // disable the built-in PDF viewer

WebDriver driver = new FirefoxDriver(options);
driver.get("https://www.mozilla.org/en-US/foundation/documents");
driver.findElement(By.linkText("IRS Form 872-C")).click();

答案 1 :(得分:2)

目前在Firefox 57.0b13中的工作方式是

FirefoxProfile profile = new FirefoxProfile();
// profile.setPreference("browser.download.useDownloadDir", true); This is true by default. Add it if it's not working without it.

profile.setPreference("browser.download.folderList",2); //Use for the default download directory the last folder specified for a download
profile.setPreference("browser.download.dir", "/Path/to/directory"); //Set the last directory used for saving a file from the "What should (browser) do with this file?" dialog.
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/pdf"); //list of MIME types to save to disk without asking what to use to open the file
profile.setPreference("pdfjs.disabled", true);  // disable the built-in PDF viewer

firefoxOptions.setProfile(profile);

有关每个Firefox profile setting

的详细信息

答案 2 :(得分:2)

如果有人在SPA环境中遇到此问题,那么我遇到的问题是无法将saveToDisk首选项设置为预期的内容类型(在我的情况下为text/csv

SPA UI之所以会发起对后端api的HTTP调用,以获取CSV数据。然后,它会技巧性地创建一个<A>元素,单击该元素可开始下载到本地计算机。该技巧将使用CSV数据创建一个Blob对象,并且必须将类型设置为octet/stream。因此,saveToDisk也必须设置为octet/stream才能起作用。

答案 3 :(得分:1)

我会将其写为评论,但我的信誉点不足-硒Web驱动程序启动后,您可以导航到about:config并搜索 browser.helperApps.neverAsk.saveToDisk,以确认您特定的类型已正确记录。

就我而言,该问题也通过添加

得到解决
prof.set_preference("browser.helperApps.neverAsk.openFile", "application/pdf, application/octet-stream, application/x-winzip, application/x-pdf, application/x-gzip")

答案 4 :(得分:1)

现在是2020年。找到MIME类型作为@FlorentB。 对我来说,下载csv文件,发现Content-Type =“ application / octet-stream”

要下载到文件夹“下载”:

FirefoxOptions options = new FirefoxOptions();
options.addPreference("browser.download.folderList",1);
options.addPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream");
WebDriver driver = new FirefoxDriver(options);

要下载到桌面,请将第二行的值更改为0:

FirefoxOptions options = new FirefoxOptions();
options.addPreference("browser.download.folderList",0);
options.addPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream");
WebDriver driver = new FirefoxDriver(options);

要下载到另一个文件夹:

FirefoxOptions options = new FirefoxOptions();
options.addPreference("browser.download.dir", "D:\\Test");
options.addPreference("browser.download.folderList",2);
options.addPreference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream");
WebDriver driver = new FirefoxDriver(options);

答案 5 :(得分:0)

如果您像我一样,正在寻找其他文件类型或多种类型的文件。确保只设置一次neverAsk首选项。

opts.set_preference('browser.download.folderList', 2)
opts.set_preference('browser.download.manager.showWhenStarting', False)   opts.set_preference('browser.download.dir', str(download_directory))    opts.set_preference('browser.download.useDownloadDir', True)

# important part!
opts.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/zip')

如果人们知道如何包含多个哑剧类型,我将很乐意对此进行更新!

其他mime类型供快速参考:

# CSV mimetype = 'text/csv'
# TXT mimetype = 'text/txt'
# EXCEL mimetype = 'application/vnd.ms-excel'

答案 6 :(得分:0)

Err,根据JRodDynamite的回答:

opts.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/zip,text/csv,text/txt')

应对多种mime类型有效-在这种情况下,仅适用于zip,csv和txt文件。

就个人而言(以及我现在在此页面上的原因),我感到很困惑,“只保存#$&*!”选项不是“未知”(也称为“应用程序/八位字节流”)-文件类型的默认选项。 哦,这就是生活! :)