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

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

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

11 ответов


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


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

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

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

конечно, это была 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 различных типа всплывающих окон; а именно,

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

В общем случае всплывающие окна JavaScript генерируются кодом веб-приложения. Selenium предоставляет API для обработки этих всплывающих окон JavaScript, таких как Alert.

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

  • вручную включить изменения в браузере свойства (или)
  • настройка свойств браузера с помощью профиля setPreference

Method1

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

(Открыть Firefox) Инструменты > Параметры > Приложения

enter image description here

метода Method2

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

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

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

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

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


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

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

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

большинство браузеров (в моем случае Firefox) по умолчанию выбирают кнопку OK. Поэтому мне удалось решить эту проблему с помощью следующего кода. Он в основном нажимает 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);

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

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

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

до марионеток более зрелый, вот что я делаю.


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

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


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

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