Firefox Profile 无法自动下载文件

Posted

技术标签:

【中文标题】Firefox Profile 无法自动下载文件【英文标题】:Firefox Profile unable to automatically download file 【发布时间】:2020-02-24 19:08:53 【问题描述】:

在使用 Firefox 配置文件设置在 selenium 测试中下载 pdf 文件时,我试图绕过 Firefox 下载管理器窗口:

        FirefoxProfile profile = new FirefoxProfile();
        profile.setPreference("browser.download.folderList", 2);
        profile.setPreference("browser.download.dir", "path/to/downloads");
        profile.setPreference("browser.download.useDownloadDir", true);
        profile.setPreference("browser.helperApps.neverAsk.openFile", "application/x-pdf, application/pdf, application/octet-stream, text/csv,application/x-msexcel,application/excel,application/x-excel,application/vnd.ms-excel,image/png,image/jpeg,text/html,text/plain,application/msword,application/xml");
        profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/x-pdf, application/pdf, application/octet-stream, text/csv,application/x-msexcel,application/excel,application/x-excel,application/vnd.ms-excel,image/png,image/jpeg,text/html,text/plain,application/msword,application/xml");
        profile.setPreference("browser.helperApps.alwaysAsk.force", false);
        profile.setPreference("browser.download.manager.alertOnEXEOpen", false);
        profile.setPreference("browser.download.manager.focusWhenStarting", false);
        profile.setPreference("browser.download.manager.useWindow", false);
        profile.setPreference("browser.download.manager.showAlertOnComplete", false);
        profile.setPreference("browser.download.manager.closeWhenDone", false);
        FirefoxOptions options = new FirefoxOptions();
        options.setProfile(profile);
        WebDriver driver = new FirefoxDriver(options);
        driver.get("https://mozilla.github.io/pdf.js/web/viewer.html");
        Thread.sleep(3000);
        driver.findElement(By.id("download")).click();
        Thread.sleep(5000);

我尝试了不同的个人资料偏好设置,但似乎没有任何效果。

还需要注意的是,我看到该文件在下载文件夹中显示为一些带有奇怪扩展名的随机字符串,例如:5daYs8iE.pdf.part。如果我在没有单击下载窗口上的 OK 按钮的情况下退出测试,则文件会消失,但如果我单击它,则文件会保存并将其扩展名更改为 PDF

开启org.seleniumhq.selenium:selenium-firefox-driver:3.141.59

【问题讨论】:

【参考方案1】:

您可以手动创建 Firefox 配置文件,手动设置所需的所有内容(PDF 自动下载等)并像这样加载现有配置文件,而不是设置所有首选项:

package tyler;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.ProfilesIni;

public class Tyler 

    public static void main(String[] args) throws InterruptedException 
        FirefoxOptions options = new FirefoxOptions();
        ProfilesIni allProfiles = new ProfilesIni();         
        FirefoxProfile selenium_profile = allProfiles.getProfile("selenium_profile");
        options.setProfile(selenium_profile);
        options.setBinary("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
        System.setProperty("webdriver.gecko.driver", "C:\\Users\\pavel.burgr\\Desktop\\webdrivers\\geckodriver.exe");
        WebDriver driver = new FirefoxDriver(options);
        driver.manage().window().maximize();
        driver.get("https://mozilla.github.io/pdf.js/web/viewer.html");
        Thread.sleep(10000);
        driver.findElement(By.id("download")).click();
        Thread.sleep(10000);
    


【讨论】:

能否详细说明setBinary和System.setProperty的使用?我不确定它们在我的情况下是否必要,因为我可以在没有它们的情况下运行我的测试,并且我可以从 about:config 中看到我指定的所有首选项实际上都已设置。但是,无论我配置什么首选项,它都不会绕过下载管理器。我想我只是错过了正确的偏好组合,或者正确的 mime 类型(这对我来说很奇怪,因为它看起来只是一个普通的 pdf,但你永远不知道) 您能否绕过我提供的示例 pdf 中的下载管理器? 另外,我想在 mac 上提及我会有所帮助 我只是手动运行带有 selenium_profile 配置文件的 firefox(也手动创建)并将内容类型“便携式文档格式”设置为值“保存文件”。如果是 Mac,请设置正确的路径(上面代码中的 2x .exe)。

以上是关于Firefox Profile 无法自动下载文件的主要内容,如果未能解决你的问题,请参考以下文章

Selenium2+python自动化18-加载Firefox配置

Selenium2+python自动化18-加载Firefox配置

如何在Firefox 58 ++上使用适用于Selenium的PHP Webdriver下载文件

Python selenium 文件自动下载 (自动下载器)

无法使用 Selenium Firefox 自动保存文件

firefox的profile文件夹在哪里?