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


83

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

我想做的是从Selenium访问此对话框(我不确定Selenium的“特权模式”是否足以访问chrome接口)。


3
我刚刚花了三周的大部分时间来第一次配置自己的Apache虚拟专用服务器(因为在共享主机上运行Selenium有点棘手),让Firefox,Selenium和Python一起工作,编写实际的Python代码通过一个非常繁琐的JavaScript网站,都可以在文件末尾下载文件。然后我意识到我不知道如何实际访问下载的文件。我很高兴您首先提出了这个问题。
Paul D. Waite

如果Firefox有一个不错的AppleScript字典,那么AppleScript将非常有用。
Nicolas Barbulesco 2013年

谁能帮助我[问题在本网站] [1] [1]:stackoverflow.com/questions/27058053/...
叶夫根尼·谢马什科

Answers:


33

从来没听说过。但是您可以将Firefox配置为自动开始下载并将文件保存在特定位置。然后,您的测试可以检查文件是否实际到达。


好的,我想我会采用这种解决方案。
2009年

1
但是selenium会在默认配置文件中启动Firefox(因为未指定配置文件),因此每次配置它时。不用它,而是根据您的喜好创建一个新的配置文件,这样更容易。
Vignesh Dhamodaran '16

71

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

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
截至2013年8月17日,已关闭,但不适用于Ubuntu 12.04上的Firefox。将“ browser.helperApps.neverAsk.saveToDisk”属性的值更改为“ text / csv,application / vnd.ms-excel”,它将在Ubuntu上运行。
bakoyaro

2
可能是值名称已更改,这已超过一年了。
dlopezgonzalez

1
我正在使用相同的方法自动保存文件,但无法正常工作。我的Firefox版本是20.0。我正在尝试下载pdf文件(使用的MIME类型-> application / pdf,application / x-pdf)
Yatin 2015年

3
不是说这不起作用Content-Disposition: attachment。在这种情况下,Firefox似乎总是弹出一个对话框!
马丁·霍勒(MartinHöller)

在Linux上下载xls文件的方法对我setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls");
有用

42

我陷入了同样的问题,但是找到了解决方案。我做的方式与此博客相同。

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


3
我已经尝试过了,但是它似乎对我不起作用。文件保存对话框仍然显示。
ealfonso

1
谢谢,最后的选择是离合器:“ application / pdf”
user2426679

1
我正在使用相同的方法自动保存文件,但无法正常工作。我的Firefox版本是20.0。我正在尝试下载pdf文件(使用的MIME类型-> application / pdf,application / x-pdf)
Yatin 2015年

1
谢谢@Akendo。这适用于我使用python 3.4.3,selenium-2.52和Firefox 44的情况。
伊戈尔·

8

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

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

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

我面临着同样的问题。在我们的应用程序中,通过以下方式传递DesiredCapabilities来创建FireFox实例

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

3

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

这是我使用“下载状态栏”的源。


谢谢,这非常有趣(但是除非我使用xul部件编写扩展名,否则事实证明这是不可能的或者是疯狂的)。
Andrey Shchekin,2009年

3

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

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

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

根据要下载的文件类型,您需要指定内容类型。

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

例如:

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

2

无需像这样触发本地文件下载对话框:

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()功能处理文件下载的方式相同。


这仅适用于在html中静态链接的文件,例如,不适用于基于发布(或类似)请求生成的填充。
Todor Minakov '18

是的,里程可能会有所不同。通常,您将能够与开发人员一起在这种情况下解决问题。
djangofan

0

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

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


0

此外,您可以添加

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

1
嗨,尼尔·埃利斯,点击图片按钮,“导出”打开一个弹出窗口。从弹出窗口触发文件下载,并且弹出窗口关闭。如果可能,请在这种情况下指导我实现无提示文件下载?
AVA
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.