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

时间:2009-07-24 08:10:48

标签: firefox selenium dialog

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

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

11 个答案:

答案 0 :(得分:70)

我有解决此问题的方法,请检查代码:

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

答案 1 :(得分:39)

我遇到了同样的问题,但我找到了解决方案。我这样做的方式和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

答案 2 :(得分:31)

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

答案 3 :(得分:7)

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)工具>选项>应用

enter image description here

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

答案 4 :(得分:5)

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

driver = new FirefoxDriver(capabilities);

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

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

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

更多网上浏览并找到了另一种方式。我们可以将配置文件本身设置为所需的功能。

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

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

答案 5 :(得分:3)

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

以下是我使用Download Statusbar的来源。

答案 6 :(得分:3)

大多数浏览器(在我的情况下为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);

答案 7 :(得分:3)

我遇到了同样的问题,我不想访问Save Dialogue。

以下代码可以提供帮助:

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

答案 8 :(得分:2)

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

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

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

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

这只需要您实现使用Apache HttpClient下载文件并向您返回File引用的方法getFileFromURL

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

此外,您可以添加

<button>

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

我的总设置是:

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