Как скачать файл с помощью Selenide

Как скачать файл с помощью Selenide

Selenide Advent Calendar
День 10
10.12.19

Добрый вечер!

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

UPD
Ниже описаны только два способа скачивания - HTTPGET и PROXY. Позже появились третий способ FOLDER и четвёртый способ CDP. Возможно, вам нужен как раз один из них, если у вашей ссылки нет атрибута href, и прокси у вас не заводится.


Как я могу скачать файл в моём тесте?

В какой-то момент нашей карьеры каждый из нас сталкивается с необходимостью скачать какой-то файл в тесте.

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

profile.setPreference("browser.download.dir", downloadPath);
profile.setPreference("browser.download.folderList", 2);
profile.setPreference("browser.download.manager.showWhenStarting", false);
profile.setPreference("browser.helperApps.alwaysAsk.force", false);
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", mimeTypes);
profile.setPreference("browser.download.manager.focusWhenStarting",false);
profile.setPreference("browser.download.manager.useWindow", false);
profile.setPreference("browser.download.manager.showAlertOnComplete", false);
profile.setPreference("pdfjs.disabled", true);

А в Selenide

Проблема решается гораздо проще - методом $.download().

Чтобы скачать файл, в Selenide достаточно просто вызвать метод:

File report = element.download();

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

Selenide сохранит скачанный файл в папку build/reports/tests. Это та же папка, где Gradle генерирует результаты прогона тестов, так что их как раз удобно видеть вместе.

Конечно, поменять эту папку тоже можно:

Configuration.downloadsFolder = <desired location for downloaded files>;

НО:

Таким образом можно скачивать файлы только со ссылкой с атрибутом “href”.

Но что, если у меня ссылки с атрибутом “href”? Так бывает, например, когда файл скачивается в результате сабмита формы. В этом случае можно скачивать файлы с помощью встроенного в селенид прокси-сервера.

Для начала нам нужно включить его (т.к. он по умолчанию выключен):

Configuration.proxyEnabled = true;
Configuration.fileDownload = PROXY;

После этого мы снова можем вызывать метод $.download(), но теперь он стал более могущественным и не требует наличия атрибута “href”:

File report = element.download();

Хозяйке на заметку:

Не забудьте увеличить таймаут, если собираетесь скачивать файл большого размера.

Файл будет скачан в папку по умолчанию (что-то типа C:\downloads and settings\downloads).
Таким образом, скачанный файл окажется в двух местах: c:\downloads... и build/reports/tests.

Если это для вас проблема, можете в конце теста удалить ненужную папку, чтобы очистить место на диске:

FileUtils.deleteDirectory(new File(<папка, подлежащая удалению>));  

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

Maciej Grymuza (figrym@gmail.com)

10.12.19