访问 Firefox 中的文件下载对话框

Posted

技术标签:

【中文标题】访问 Firefox 中的文件下载对话框【英文标题】:Access to file download dialog in Firefox 【发布时间】:2010-11-13 15:56:23 【问题描述】:

是否有任何 API 可以让我在 Firefox 中操作文件下载对话框? (我想访问用户做某事时出现的那个,而不是自己启动一个)。

我想做的是从 Selenium 访问这个对话框(以及 Selenium“特权模式”是否足以访问 chrome 界面也是我不确定的)。

【问题讨论】:

我刚刚花了三周时间第一次配置我自己的 Apache 虚拟专用服务器(因为在共享主机上运行 Selenium 有点棘手),让 Firefox、Selenium 和 Python 工作一起,编写实际的 Python 代码来逐步浏览一个非常依赖 javascript 的站点,所有这些都是为了在其末尾下载一个文件。然后我意识到我不知道如何实际访问下载的文件。很高兴你先问了这个问题。 AppleScript 会非常适合,如果 Firefox 有一个像样的 AppleScript 字典。 【参考方案1】:

而不是像这样触发本机文件下载对话框:

By DOWNLOAD_ANCHOR = By.partialLinkText("download");
driver.findElement(DOWNLOAD_ANCHOR).click();

我通常这样做,以绕过本机文件下载对话框。这种方式适用于所有浏览器:

String downloadURL = driver.findElement(DOWNLOAD_ANCHOR).getAttribute("href");
File downloadedFile = getFileFromURL(downloadURL);

这只需要您实现方法getFileFromURL,该方法使用 Apache HttpClient 下载文件并将文件引用返回给您。

同样,如果您碰巧使用Selenide,它的工作方式与使用内置download() 处理文件下载的函数相同。

【讨论】:

这仅适用于在 html 中静态链接的文件,例如不是根据帖子(或类似)请求生成的填充物。 是的,里程可能会有所不同。通常,您可以与您的开发人员一起解决这些边缘情况。【参考方案2】:

我遇到了同样的问题。 在我们的应用程序中,FireFox 的实例是通过传递 DesiredCapabilities 创建的,如下所示

driver = new FirefoxDriver(capabilities);

根据其他人的建议,我做了我的更改

FirefoxProfile firefoxProfile = new FirefoxProfile();     
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
    "application/octet-stream");
driver = new FirefoxDrvier(firefoxProfile);

这达到了目的,但不幸的是我的其他自动化测试开始失败。原因是,我已经删除了之前通过的功能。

在网上浏览了一些,找到了另一种方法。我们可以在所需的 Capabilities 中设置配置文件本身。

所以新的工作代码看起来像

DesiredCapabilities capabilities = DesiredCapabilities.firefox();

// add more capabilities as per your need.
FirefoxProfile firefoxProfile = new FirefoxProfile();        
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk",
    "application/octet-stream");

// set the firefoxprofile as a capability
capabilities.setCapability(FirefoxDriver.PROFILE, firefoxProfile);
driver = new FirefoxDriver(capabilities);

【讨论】:

【参考方案3】:

我有同样的问题,我不想访问保存对话。

以下代码可以提供帮助:

    FirefoxProfile fp = new FirefoxProfile();
    fp.setPreference("browser.download.folderList",2);
    fp.setPreference("browser.download.manager.showWhenStarting",false);
    fp.setPreference("browser.helperApps.alwaysAsk.force", false);
    // Below you have to set the content-type of downloading file(I have set simple CSV file)
    fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");

根据下载的文件类型,需要指定content types.

您可以指定多个用';'分隔的内容类型

例如:

    fp.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv;application/vnd.ms-excel;application/msword");

【讨论】:

【参考方案4】:

另外你可以添加

      profile.setPreference("browser.download.panel.shown",false);

删除默认显示并覆盖部分网页的下载文件列表。

我的总设置是:

        DesiredCapabilities dc = DesiredCapabilities.firefox();
        dc.merge(capabillities);
        FirefoxProfile profile = new FirefoxProfile();
        profile.setAcceptUntrustedCertificates(true);
        profile.setPreference("browser.download.folderList", 4);
        profile.setPreference("browser.download.dir", TestConstants.downloadDir.getAbsolutePath());
        profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
        profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, data:image/png, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream");
        profile.setPreference("browser.download.manager.showWhenStarting", false);
        profile.setPreference("browser.download.manager.focusWhenStarting", false);
        profile.setPreference("browser.download.useDownloadDir", true);
        profile.setPreference("browser.helperApps.alwaysAsk.force", false);
        profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
        profile.setPreference("browser.download.manager.closeWhenDone", true);
        profile.setPreference("browser.download.manager.showAlertOnComplete", false);
        profile.setPreference("browser.download.manager.useWindow", false);
        profile.setPreference("browser.download.panel.shown",false);
        dc.setCapability(FirefoxDriver.PROFILE, profile);
        this.driver = new FirefoxDriver(dc);

【讨论】:

嗨 Neil Ellis,单击图像按钮,“导出”会打开一个弹出窗口。从弹出窗口触发文件下载并关闭弹出窗口。如果可能,请指导我在这种情况下实现静默文件下载?【参考方案5】:

大多数浏览器(在我的情况下是 Firefox)默认选择确定按钮。所以我设法通过使用以下代码解决了这个问题。它基本上为您按下回车键并下载文件。

Robot robot = new Robot();

// A short pause, just to be sure that OK is selected
Thread.sleep(3000);

robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);

【讨论】:

【参考方案6】:

Web 应用程序生成 3 种不同类型的弹出窗口;即,

 1| JavaScript PopUps
 2| Browser PopUps
 3| Native OS PopUps [e.g., Windows Popup like Upload/Download]

一般来说,JavaScript 弹出窗口是由 Web 应用程序代码生成的。 Selenium 提供了一个 API 来处理这些 JavaScript 弹出窗口,例如 Alert

最后,忽略浏览器弹出和下载文件的最简单方法是使用浏览器配置文件;有几种方法可以做到这一点:

手动涉及浏览器属性的更改(或) 使用配置文件 setPreference 自定义浏览器属性

方法1

在您开始使用浏览器配置文件上的弹出窗口之前,请确保将“下载”选项默认设置为“保存文件”。

(打开 Firefox)工具 > 选项 > 应用程序

方法2

使用下面的 sn-p 并在必要时进行编辑。

FirefoxProfile profile = new FirefoxProfile();

String path = "C:\\Test\\";
profile.setPreference("browser.download.folderList", 2);
profile.setPreference("browser.download.dir", path);
profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/msword, application/csv, application/ris, text/csv, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream");
profile.setPreference("browser.download.manager.showWhenStarting", false);
profile.setPreference("browser.download.manager.focusWhenStarting", false);  
profile.setPreference("browser.download.useDownloadDir", true);
profile.setPreference("browser.helperApps.alwaysAsk.force", false);
profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
profile.setPreference("browser.download.manager.closeWhenDone", true);
profile.setPreference("browser.download.manager.showAlertOnComplete", false);
profile.setPreference("browser.download.manager.useWindow", false);
profile.setPreference("services.sync.prefs.sync.browser.download.manager.showWhenStarting", false);
profile.setPreference("pdfjs.disabled", true);
       
driver = new FirefoxDriver(profile);

【讨论】:

【参考方案7】:

不知道,但您或许可以查看其中一个 Firefox 下载插件的来源。

这是我使用的Download Statusbar的来源。

【讨论】:

谢谢,这很有趣(但证明这要么是不可能的,要么是非常困难的,除非我正在编写带有 xul 部分的扩展)。【参考方案8】:

我有这个问题的解决方案,检查代码:

FirefoxProfile firefoxProfile = new FirefoxProfile();

firefoxProfile.setPreference("browser.download.folderList",2);
firefoxProfile.setPreference("browser.download.manager.showWhenStarting",false);
firefoxProfile.setPreference("browser.download.dir","c:\\downloads");
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","text/csv");

WebDriver driver = new FirefoxDriver(firefoxProfile);//new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);

driver.navigate().to("http://www.myfile.com/hey.csv");

【讨论】:

关闭,但截至 2013 年 8 月 17 日,在 Ubuntu 12.04 上的 Firefox 无法正常工作。将“browser.helperApps.neverAsk.saveToDisk”属性的值更改为“text/csv,application/vnd.ms-excel”,它将在 Ubuntu 上运行。 可能是值名变了,这个是一年多了。 我正在使用相同的方法来自动保存文件,但它不起作用。我的火狐版本是20.0。我正在尝试下载 pdf 文件(使用的 MIME 类型->application/pdf,application/x-pdf) 并不是说这不适用于Content-Disposition: attachment。在这种情况下,Firefox 似乎总是弹出一个对话框! 在 linux 中下载 xls 文件对我有用:setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls");【参考方案9】:

我遇到了同样的问题,但我找到了解决方案。我的做法和blog 一样。

当然这是 Java,我已经将它翻译成 Python:

fp = webdriver.FirefoxProfile()

fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir",getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","text/csv")

browser = webdriver.Firefox(firefox_profile=fp)

在我的示例中,它是一个 CSV 文件。但是当你需要更多的时候,还有存储在~/.mozilla/$USER_PROFILE/mimeTypes.rdf

【讨论】:

我试过这个,但它似乎对我不起作用。文件保存对话框仍然显示。 谢谢,最后一个偏好是离合器:“application/pdf” 我正在使用相同的方法来自动保存文件,但它不起作用。我的火狐版本是20.0。我正在尝试下载 pdf 文件(使用的 MIME 类型->application/pdf,application/x-pdf) 谢谢@Akendo。这适用于我使用 python 3.4.3、selenium-2.52 和 Firefox 44。【参考方案10】:

我没有理解你的目标, 您是否希望您的测试在执行测试时自动下载文件,如果是,那么您需要在测试执行中使用自定义 Firefox 配置文件。

在自定义配置文件中,首次手动执行测试,如果出现下载对话框,请将其设置为将其保存到磁盘,同时选中始终执行此操作复选框,这将确保文件在您下次运行测试时自动下载。

【讨论】:

【参考方案11】:

我不知道。但是您可以在特定位置将 Firefox 配置为automatically start the download and save the file。然后,您的测试可以检查文件是否实际到达。

【讨论】:

但是 selenium 会在默认配置文件中启动 Firefox(因为没有指定配置文件)所以每次你配置它。而不是根据您的喜好创建一个新的个人资料,这样更容易。

以上是关于访问 Firefox 中的文件下载对话框的主要内容,如果未能解决你的问题,请参考以下文章

打开页面时,Firefox 会打开一个下载对话框

如何制作一个看起来像 Firefox 的“下载”对话框的控件

[HTML/Firefox]:当网站打开时,Firefox 要求下载页面

Webdriver实现下载功能,屏蔽掉windows弹出的对话框,FireFox下设置浏览器的属性,两种实现方式:

如何禁用 Firefox 中的“离开页面”确认对话框?

Firefox下载安装fireBug提示下载出错的解决方案