访问 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 的“下载”对话框的控件
[HTML/Firefox]:当网站打开时,Firefox 要求下载页面