Доступ до діалогового вікна завантаження файлів у Firefox


83

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

Що я хочу зробити, це отримати доступ до цього діалогового вікна з Selenium (і чи достатній «привілейований режим» Selenium - це те, в чому я також не впевнений).


3
Я щойно провів більшу частину трьох тижнів, вперше налаштувавши власний віртуальний приватний сервер Apache (адже трохи складніше запустити Selenium на спільному хостингу), змусивши Firefox, Selenium та Python працювати разом, писати фактичний код Python на крок через дуже важкий для JavaScript сайт, щоб завантажити файл в кінці. Потім я зрозумів, що не маю уявлення про те, як насправді отримати доступ до завантаженого файлу. Я дуже радий, що ти спочатку поставив питання.
Пол Д. Уейт,

AppleScript було б чудово для цього, якби Firefox мав гідний словник AppleScript.
Ніколас Барбулеско,

Хто-небудь може мені допомогти [Питання на цьому веб-сайті] [1] [1]: stackoverflow.com/questions/27058053/…
Євген Семашко

Відповіді:


33

Не те, що я знаю. Але ви можете налаштувати Firefox так, щоб він автоматично запускав завантаження та зберігав файл у певному місці. Тоді ваш тест міг перевірити, чи файл справді надійшов.


Добре, я думаю, я піду з цим рішенням.
Андрій Щекін

1
Але селен запустить Firefox у профілі за замовчуванням (оскільки профіль не вказаний), тому кожного разу, коли ви його налаштовуєте. Замість цього створіть новий профіль з вашими уподобаннями, щоб було простіше.
Віньєш Дамодаран

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

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)
Ятін,

3
Не те, що з цим не працює Content-Disposition: attachment. Здається, у цьому випадку Firefox завжди спливає діалогове вікно!
Martin Höller

для завантаження файлів XLS у Linux це мені setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xls");
вдалося

42

У мене застрягла та сама проблема, але я знайшов рішення. Я зробив це так само, як це зробив цей блог .

Звичайно, це була 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
Дякую, останньою перевагою було зчеплення: "application / pdf"
user2426679

1
Я використовую той самий метод для автоматичного збереження файлу, але він не працює. Моя версія Firefox - 20.0. І я намагаюся завантажити PDF-файли (використовуваний тип MIME-> application / pdf, application / x-pdf)
Ятін,

1
Дякую @Akendo. Це працює для мене за допомогою python 3.4.3, selenium-2.52 та Firefox 44.
Ігор

8

Веб-програми генерують 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 був створений шляхом передачі бажаних можливостей наступним чином

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.

Ось джерело для того, що я використовую рядок стану завантаження .


Дякую, це дуже цікаво (але доводить, що це неможливо або шалено важко, якщо я не пишу розширення з частинами xul).
Андрій Щекін

3

Більшість браузерів (у моєму випадку Firefox) за замовчуванням вибирають кнопку ОК. Тож мені вдалося вирішити це, використовуючи наступний код. В основному він натискає 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);

3

У мене була та сама проблема, я не хотів отримати доступ до Save Dialogue.

Нижче наведений код може допомогти:

    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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.