Как средствами selenium можно скачать файл со страницы?

Друзья возник вопрос. Как средствами selenium можно скачать файл со страницы? Как загрузить понятно, а вот столкунлся со скачиванием и задумался. Заранее спасибо!

Очень просто: кликаешь на ссылку - начинается скачивание (в папку Downloads) :smile:

Вот здесь интересная идея описана на эту тему

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

Приведу тут код из ссылки:

from selenium import webdriver

# To prevent download dialog
profile = webdriver.FirefoxProfile()
profile.set_preference('browser.download.folderList', 2) # custom location
profile.set_preference('browser.download.manager.showWhenStarting', False)
profile.set_preference('browser.download.dir', '/tmp')
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'text/csv')

browser = webdriver.Firefox(profile)
browser.get("http://www.drugcite.com/?q=ACTIMMUNE")

browser.find_element_by_id('exportpt').click()
browser.find_element_by_id('exporthlgt').click()

Спасибо =) Собственно надо было раньше написать, передо мной стоит задача скачать файли из apache и проверить его целостность, хотябы чтобы он весил больше 1 кб =)

Мне кажется это проще сделать без webdriver. Тем же curl-ом. Ну или если надо в Java, то используя библиотеку для работы с файлами

1 лайк

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

Как это?

Рассказ про то как использовать BMP:
Selenium и BrowserMobProxy: вместе веселее!

Примеры кода прилагаются, в том числе и пример загрузки файла

5 лайков

Вот тут небольшой метод (на руби + watir-webdriver) включающий валидирование размера файла: Watir-Webdriver Wait for Download to Complete - Stack Overflow

Спасибо большое с проблемой разобрался! Чтобы я делал без вас =)

В библиотеке Selenide есть для этого специальный метод.
Очень удобно можно скачать файл одной командой:

File downloadedFile = $("#your-link").download();
5 лайков

А нет примеров кода на Python?

1 лайк

Если запускать тесты с помощью TestNg, то способ с заданием настроек параметров профиля работает. Но при запуске тестов с помощью maven сборки - все равно вылезает системное окно, предлагающее открыть или сохранить файл. Как быть в этом случае?

Пока не вижу связи между типами запуска проекта и влиянием на FF профили. Нужно больше информации, куски кода.

Настройки параметров:

    public static void init() {
        FirefoxProfile profile = new FirefoxProfile();
        profile.setAcceptUntrustedCertificates(true);
        profile.setAssumeUntrustedCertificateIssuer(true);
        profile.setEnableNativeEvents(true);
        profile.setPreference("javascript.enabled", true);
        profile.setPreference("dom.max_script_run_time", 0);
        profile.setPreference("dom.max_chrome_script_run_time", 0);
        profile.setPreference("browser.download.folderList", 2);
        profile.setPreference("browser.download.dir","c:\\downloads");
        profile.setPreference("browser.download.manager.showWhenStarting", false);
        profile.setPreference("browser.helperApps.neverAsk.saveToDisk","application/vnd.ms-excel");
        driver = new FirefoxDriver(profile);
}

В классе:

	@Test
	public void checkGenereteKeyByLibrarian() {
        init();
        WDWrapper.open(siteAddress);
        loginByUser(loginLibrarian1, passwordLibrarian1);
        WDWrapper.driver.findElement(By.xpath("//form[@id='report_form']/a[@id='token_lnk']")).click();
	SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
	String dayToday = sdf.format(new Date(System.currentTimeMillis()));	
	File file = new File("C:\\downloads\\report_access_tokens__" + dayToday + ".xls");
        // работа с файлом и что то там еще
        }

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

Подниму тему, чтобы добавить ремарку. В случае, если нужно качать PDF файлы, используя интерфейс для скачивания (типа кнопки “Save As PDF”), то возможно потребуется отключить соответствующий плагин:

    profile.set_preference("pdfjs.disabled", True)

Тогда не будет запускаться распознаватель pdf-файлов и сразу начнется закачка. Иначе будет запускаться плагин Adobe Acrobat.

3 лайка

Опять поднимаю тему. Теперь с вопросом.

Можно ли скачать файл, используя Selenium + GhostDriver (PhantomJS) ?

Почитав тут: https://github.com/ariya/phantomjs/issues/10052 окончательно запутался… У кого-нибудь получалось?

лучше написать http хелпер, get-ом получать файл, и проерять наличие каким-то fileutils

2 лайка

Добрый день всем.

Скачиваю файл указанным выше путем настройки профиля Firefox. Все время загружает в одну папку - загрузки по умолчанию. В профиле ФФ указал нужную папку, в Selenium так же прописал:
profile.setPreference(“browser.download.dir”,“c:\downloads”);
Все равно загружает в папку по умолчанию.

Как можно изменить путь сохранения?