Доступ к диалоговому окну загрузки файлов в Firefox

Есть ли какой-либо API, который позволяет мне манипулировать диалогом загрузки файлов в Firefox? (Я хочу получить доступ к тому, который появляется, когда пользователь что-то делает, а не инициировать его сам).

Что я хочу сделать, так это получить доступ к этому диалоговому окну из Selenium (и достаточно ли «привилегированного режима» Selenium для доступа к хромированному интерфейсу, в чем я тоже не уверен).


person Andrey Shchekin    schedule 24.07.2009    source источник
comment
Я только что провел большую часть трех недель, впервые настроив свой собственный виртуальный частный сервер Apache (потому что запустить Selenium на виртуальном хостинге немного сложно), заставить Firefox, Selenium и Python работать вместе, написать фактический код Python для шага. через сайт с большим количеством JavaScript, и все это для загрузки файла в конце. Затем я понял, что понятия не имею, как на самом деле получить доступ к загруженному файлу. Я очень рад, что вы задали вопрос первым.   -  person Paul D. Waite    schedule 05.04.2011
comment
AppleScript был бы великолепен для этого, если бы у Firefox был приличный словарь AppleScript.   -  person Nicolas Barbulesco    schedule 20.11.2013


Ответы (11)


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

person Aaron Digulla    schedule 24.07.2009
comment
Но селен запустит Firefox в профиле по умолчанию (поскольку профиль не указан), поэтому каждый раз, когда вы его настраиваете. Вместо этого создайте новый профиль с вашими предпочтениями, так будет проще. - person Vignesh Dhamodaran; 08.03.2016

У меня есть решение этой проблемы, проверьте код:

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");
person dlopezgonzalez    schedule 17.02.2012
comment
Закрыто, но не совсем работает для Firefox на Ubuntu 12.04 по состоянию на 17.08.2013. Измените значение свойства browser.helperApps.neverAsk.saveToDisk на text/csv,application/vnd.ms-excel, и оно будет работать в Ubuntu. - person bakoyaro; 17.08.2013
comment
Может имя значения изменилось, это уже больше года. - person dlopezgonzalez; 21.08.2013
comment
Я использую тот же метод для автоматического сохранения файла, но он не работает. Моя версия фаерфокса 20.0. И я пытаюсь загрузить pdf-файлы (используемый тип MIME-›application/pdf,application/x-pdf) - person Yatin; 01.04.2015
comment
Не то чтобы это не работало с Content-Disposition: attachment. В этом случае Firefox, похоже, всегда выводит диалоговое окно! - person Martin Höller; 25.01.2016
comment
для загрузки файлов xls в Linux это сработало для меня: setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls"); - person donfuxx; 02.06.2016
comment
В текущей версии Firefox вы должны изменить browser.download.manager.showWhenStarting на browser.download.panel.shown. - person Augustin Laville; 29.06.2017

Я застрял с той же проблемой, но я нашел решение. Я сделал это так же, как в этом блоге сделал.

Конечно, это была 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

person Akendo    schedule 02.11.2011
comment
Я пробовал это, но, похоже, это не работает для меня. Диалоговое окно сохранения файла все еще отображается. - person ealfonso; 21.06.2013
comment
Спасибо, последним предпочтением был клатч: application/pdf - person user2426679; 23.02.2015
comment
Я использую тот же метод для автоматического сохранения файла, но он не работает. Моя версия фаерфокса 20.0. И я пытаюсь загрузить pdf-файлы (используемый тип MIME-›application/pdf,application/x-pdf) - person Yatin; 01.04.2015
comment
Спасибо @Акендо. Это работает для меня, используя python 3.4.3, selenium-2.52 и Firefox 44. - person Igor; 17.02.2016

Веб-приложения генерируют 3 различных типа всплывающих окон; а именно,

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

Как правило, всплывающие окна JavaScript генерируются кодом веб-приложения. 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);
person Prashanth Sams    schedule 27.05.2015

Большинство браузеров (в моем случае Firefox) по умолчанию выбирают кнопку OK. Поэтому мне удалось решить эту проблему, используя следующий код. Он в основном нажимает ввод для вас, и файл загружается.

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);
person shish    schedule 17.06.2015

Я столкнулся с той же проблемой. В нашем приложении экземпляр 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);
person Sanjay Bharwani    schedule 17.03.2016

Не знаю, но вы, возможно, могли бы проверить источник одного из дополнений для загрузки Firefox.

Вот источник того, что я использую Скачать строку состояния.

person Nifle    schedule 24.07.2009
comment
Спасибо, это очень интересно (но доказывает, что это либо невозможно, либо безумно сложно, если только я не пишу расширение с частями xul). - person Andrey Shchekin; 25.07.2009

У меня была такая же проблема, я не хотел доступа к диалогу сохранения.

Ниже код может помочь:

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

В зависимости от типа загружаемого файла вам необходимо указать типы контента.

Вы можете указать несколько типов контента, разделенных ' ; '

e.g:

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

Вместо запуска собственного диалогового окна загрузки файлов следующим образом:

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 для загрузки файла и возврата вам ссылки на файл.

Точно так же, если вы используете Selenide, он работает так же, используя встроенную функцию download() для обработки загрузки файлов.

person djangofan    schedule 03.03.2016
comment
Это будет работать только для файлов, статически связанных в html, например. не файл, созданный на основе почтового (или аналогичного) запроса. - person Todor Minakov; 02.12.2018
comment
Да, пробег может быть разным. Обычно вы можете работать со своими разработчиками, чтобы что-то придумать в этих второстепенных случаях. - person djangofan; 04.12.2018

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

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

person Community    schedule 25.07.2009

Кроме того, вы можете добавить

      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);
person Neil Ellis    schedule 09.05.2016
comment
Привет, Нил Эллис. При нажатии на кнопку изображения открывается всплывающее окно «Экспорт». Загрузка файла запускается из всплывающего окна, и всплывающее окно закрывается. Если возможно, подскажите, как добиться автоматической загрузки файла в этом сценарии? - person AVA; 10.03.2017