Установите профиль Firefox для автоматической загрузки файлов с использованием Selenium и Java

Я хочу проверить загрузку файлов с помощью Selenium WebDriver и Java. Файл для скачивания в формате PDF. Когда WebDriver нажимает на ссылку "Загрузить" в AUT, Firefox открывает следующее окно подтверждения загрузки:

Download Confirmation Window

Я хочу, чтобы Firefox загрузил файл автоматически, не показывая указанное выше окно подтверждения, поэтому я использовал следующий код:

FirefoxProfile firefoxProfile=new FirefoxProfile();
firefoxProfile.setPreference("browser.download.folderList",2);
firefoxProfile.setPreference("browser.download.manager.showWhenStarting",false);
firefoxProfile.setPreference("browser.download.dir",downloadPath);
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","application/pdf");
WebDriver driver=new FirefoxDriver(firefoxProfile); 

но Firefox все еще показывает то же самое окно. Как настроить профиль Firefox, чтобы PDF файлы загружались автоматически, не показывая диалоговое окно подтверждения?

Ответ 1

Как и предположил @Jason, скорее всего, это другой тип пантомимы. Чтобы получить MIME-тип:

  • Открытые инструменты разработчика
  • Перейти в сеть
  • Нажмите на ссылку, чтобы скачать PDF
  • На панели сети выберите первый запрос
  • MIME-тип - это Content-Type из заголовка ответа:

enter image description here

Затем, чтобы загрузить PDF с Firefox:

FirefoxOptions options = new FirefoxOptions();
options.setPreference("browser.download.folderList", 2);
options.setPreference("browser.download.dir", "C:\\Windows\\temp");
options.setPreference("browser.download.useDownloadDir", true);
options.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/pdf");
options.setPreference("pdfjs.disabled", true);  // disable the built-in PDF viewer

WebDriver driver = new FirefoxDriver(options);
driver.get("https://www.mozilla.org/en-US/foundation/documents");
driver.findElement(By.linkText("IRS Form 872-C")).click();

Ответ 2

В настоящее время он работает в Firefox 57.0b13

FirefoxProfile profile = new FirefoxProfile();
// profile.setPreference("browser.download.useDownloadDir", true); This is true by default. Add it if it not working without it.

profile.setPreference("browser.download.folderList",2); //Use for the default download directory the last folder specified for a download
profile.setPreference("browser.download.dir", "/Path/to/directory"); //Set the last directory used for saving a file from the "What should (browser) do with this file?" dialog.
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/pdf"); //list of MIME types to save to disk without asking what to use to open the file
profile.setPreference("pdfjs.disabled", true);  // disable the built-in PDF viewer

firefoxOptions.setProfile(profile);

Подробная информация о каждом Настройка профиля Firefox

Ответ 3

Если у кого-то возникла эта проблема в среде SPA, я столкнулся с проблемой, когда установка предпочтения saveToDisk для ожидаемого типа контента не работала (в моем случае text/csv)

Причина, по которой пользовательский интерфейс SPA инициирует HTTP-вызов к API бэкэнда, чтобы получить данные CSV. Затем он делает трюк, чтобы создать элемент <A> которому он щелкает, чтобы начать загрузку на локальный компьютер. Уловка создает объект Blob с данными CSV, и для его типа должен быть установлен octet/stream. Поэтому saveToDisk также должен быть установлен в octet/stream чтобы это работало.

Ответ 4

Я написал бы это как комментарий, но у меня не хватает очков репутации - после запуска веб-драйвера selenium вы можете перейти к about: config и выполнить поиск для browser.helperApps.neverAsk.saveToDisk, чтобы подтвердить, что типы, которые вы указали, были правильно записано.

В моем случае проблема была решена путем включения

prof.set_preference("browser.helperApps.neverAsk.openFile", "application/pdf, application/octet-stream, application/x-winzip, application/x-pdf, application/x-gzip")