Доступ к диалогу загрузки файлов в 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
Метод1
перед началом работы с всплывающими окнами на профилях браузера, убедитесь, что параметры загрузки установлены по умолчанию для сохранения файла.
(Открыть 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 скачать аддоны.
вот источник для одного, который я использую Скачать Строку.
у меня была та же проблема, я не хотел доступа к диалогу сохранения.
ниже код может помочь:
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()функция для обработки загрузки файлов.до марионеток более зрелая, вот что я делаю.
Я не понял вашу цель, Вы хотите, чтобы ваш тест автоматически загружал файл при выполнении теста, если да, то вам нужно использовать пользовательский профиль 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);

Comments