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

83

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

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

Андрей Щекин
источник
3
Я только что потратил лучшую часть из трех недель на настройку моего собственного виртуального частного сервера Apache в первый раз (потому что запустить Selenium на общем хостинге немного сложно), заставляя Firefox, Selenium и Python работать вместе, писать реальный код Python для пошагового через сайт, на котором очень много JavaScript, и все для того, чтобы загрузить файл в конце. Затем я понял, что понятия не имею, как получить доступ к загруженному файлу. Я действительно рад, что ты первым задала вопрос.
Пол Д. Уэйт
AppleScript отлично подошел бы для этого, если бы Firefox имел приличный словарь AppleScript.
Николас Барбулеско
Может ли кто-нибудь помочь мне [Вопрос на этом сайте] [1] [1]: stackoverflow.com/questions/27058053/…
Евгений Семашко

Ответы:

33

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

Аарон Дигулла
источник
Хорошо, думаю, я выберу это решение.
Андрей Щекин,
1
Но селен запустит Firefox в профиле по умолчанию (поскольку профиль не указан), поэтому каждый раз, когда вы его настраиваете. Вместо этого создайте новый профиль со своими предпочтениями, чтобы это было проще.
Vignesh Dhamodaran 08
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");
dlopezgonzalez
источник
1
Близко, но не совсем работает для Firefox на Ubuntu 12.04 по состоянию на 17.08.2013. Измените значение свойства «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)
Ятин 01
4
Не то чтобы с этим не работать Content-Disposition: attachment. В этом случае Firefox всегда открывает диалоговое окно!
Мартин Хёллер
для загрузки файлов xls в Linux это сработало для меня:setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls");
donfuxx
43

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

Конечно, это была 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
Спасибо, последнее предпочтение было clutch: "application / pdf"
user2426679
1
Я использую тот же метод для автоматического сохранения файла, но он не работает. Моя версия Firefox - 20.0. И я пытаюсь загрузить файлы pdf (используемый тип MIME-> application / pdf, application / x-pdf)
Ятин 01
1
Спасибо @Akendo. Это работает для меня с использованием python 3.4.3, selenium-2.52 и Firefox 44.
Игорь
9

Веб-приложения создают 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);
Прашант Самс
источник
4

Большинство браузеров (в моем случае 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);
шашлык
источник
4

Я столкнулся с той же проблемой. В нашем приложении экземпляр 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);
Санджай Бхарвани
источник
3

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

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

Nifle
источник
Спасибо, это очень интересно (но доказывает, что это либо невозможно, либо безумно сложно, если я не пишу расширение с xul частями).
Андрей Щекин,
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 для загрузки файла и возврата вам ссылки на файл.

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

Джангофан
источник
Это будет работать только для файлов, статически связанных в html, например, не для файла, созданного на основе запроса публикации (или аналогичного).
Тодор Минаков
Да, пробег может отличаться. Обычно вы можете работать со своими разработчиками, чтобы что-то выяснить в этих крайних случаях.
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