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

有没有什么API可以让我操纵Firefox中的文件下载对话框? (我想访问用户做某事时出现的那个,而不是自己发起一个)。

我想要做的就是从Selenium访问这个对话框(以及Selenium“特权模式”是否足以访问chrome接口,这是我不太确定的事情)。

从来没听说过。 但是,您可以将Firefoxconfiguration为自动启动下载并将文件保存在特定位置。 然后您的testing可以检查文件是否真的到达。

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

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"); 

我被困在同样的问题,但我find了一个解决scheme。 我做了这个博客一样的方式。

当然这是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

Web应用程序生成3种不同types的popup窗口; 即,

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

通常,JavaScriptpopup窗口由Web应用程序代码生成。 Selenium提供了一个API来处理这些JavaScriptpopup窗口,比如Alert

最后,忽略浏览器popup和下载文件的最简单方法是通过使用浏览器configuration文件来完成; 有几种方法可以做到这一点:

  • 手动修改浏览器属性(或)
  • 使用configuration文件setPreference自定义浏览器属性

方法1

在开始使用浏览器configuration文件的popup窗口之前,请确保将“下载”选项设置为“保存文件”。

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

在这里输入图像描述

方法2

利用下面的代码片段,并在必要时进行编辑。

 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); 

我面临同样的问题。 在我们的应用程序中,FireFox的实例是通过如下传递DesiredCapabilities创build的

 driver = new FirefoxDriver(capabilities); 

根据别人的build议,我做了我的修改

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

这样做的目的,但不幸的是我的其他自动化testing开始失败。 原因是,我已经移除了早先通过的能力。

在网上浏览一些,find了一种替代方法。 我们可以在所需的function中设置configuration文件本身。

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

 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); 

不知道,但你也许可以检查一个Firefox下载插件的来源。

这里是我使用下载状态栏的源代码。

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

下面的代码可以帮助:

  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"); 

根据正在下载的文件types,您需要指定内容types。

您可以指定多个以' ; '分隔的内容types

例如:

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

大多数浏览器(在我的情况下Firefox)默认select确定button。 所以我设法通过使用下面的代码解决这个问题。 它基本上按下input你的文件被下载。

 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); 

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

 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下载文件并返回一个File引用给你。

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

直到木偶更成熟,那就是我所做的。

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

在自定义configuration文件中,首次手动执行testing,如果下载对话框出现,将其设置为“保存到磁盘”,同时选中“始终执行此操作”checkbox,以确保在下次运行testing时自动下载文件。

另外你可以添加

  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);