Доступ к диалогу загрузки файлов в 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) Инструменты> Параметры> Приложения
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) по умолчанию выбирают кнопку 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);
Не знаю, но вы могли бы проверить источник одного из аддонов загрузки Firefox.
Вот источник, который я использую Download Statusbar.
У меня была такая же проблема, я не хотел доступа к диалогу сохранения.
Ниже код может помочь:
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");
Вместо запуска собственного диалога загрузки файлов, вот так:
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()
функция для загрузки файлов.
Пока Марионетка не станет более зрелой, я так и делаю.
Я не понял вашу цель: вы хотели, чтобы ваш тест автоматически загружал файл, когда тест выполняется, если да, то вам нужно использовать собственный профиль 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);