8. Работа с файлами - qa-guru/knowledge-base GitHub Wiki
Файл можно скачать с помощью вызова встроенного в JUnit метода download(). При это следует сохранять файл в переменную типа File. Выглядит это следующим образом:
@Test
void downloadTest() throws Exception {
Selenide.open(link);
File textFile = $("#raw-url").download();
}В данном примере мы сперва открываем страницу по ссылке link и скачиваем файл по ссылке, которая находится за селектором raw-url. Сохраняется все в переменную типа File по имени textFile. Конструкция throws Exception — встроенная в JUnit обработка ошибок. Безусловно, в Java есть возможность писать собственные обработчики, но в данном случае излишни, так как уже содержатся в библиотеке.
Файл сохранится в папку build, в подпапку downloads.
Класс File — абстракция над путем к файлу в папке в памяти машины. Для чтения/записи существует понятие InputStream и OutputStream соответственно. Для чтения необходимо создать новый InputStream и передать ему файл. Далее из файла надо получить массив байт и декодировать его в необходимый стандарт. По завершении поток надо обязательно закрыть.
@Test
void downloadTest() throws Exception {
Selenide.open(link);
File textFile = $("#raw-url").download();
InputStream is = new FileInputStream(textFile);
byte[] fileContent = is.readAllBytes();
String strContent = new String(fileContent, StandardCharsets.UTF_8);
is.close();
}Код выше не самый правильный. На каждой строчке что-то может не получиться, мы получим исключение и поток не будет закрыт. Поэтому необходимо использовать обработку исключений.
@Test
void downloadTest() throws Exception {
Selenide.open(link);
File textFile = $("#raw-url").download();
InputStream is = new FileInputStream(textFile);
try {
byte[] fileContent = is.readAllBytes();
String strContent = new String(fileContent, StandardCharsets.UTF_8);
} finally {
is.close();
}
}Чтобы избежать излишней вложенности, можно в скобках указать те ресурсы, которые надо будет закрыть. Тогда блок finally уже не понадобится.
@Test
void downloadTest() throws Exception {
Selenide.open(link);
File textFile = $("#raw-url").download();
try (InputStream is = new FileInputStream(textFile);) {
byte[] fileContent = is.readAllBytes();
String strContent = new String(fileContent, StandardCharsets.UTF_8);
}
}Для работы с PDF-файлами нам понадобится подключить стороннюю библиотеку. Для этого в gradle-файле необходимо в раздел dependencies необходимо добавить следующую строку:
dependencies {
testImplementation (
'com.codeborne:pdf-test:1.7.0'
)
}Для открытия PDF-файла необходимо использовать ClassLoader. Это поможет сохранить независимость от файловой системы. Далее необходимо создать новый класс PDF и передать поток.
@Test
void pdfTest() throws Exception {
InputStream stream = cl.getResourceAsStream("pdf/junit-user-guide-5.8.2.pdf");
PDF pdf = new PDF(stream);
}Работа с XLS-файлами схожа с работой с PDF. Сперва надо подключить библиотеку:
dependencies {
testImplementation (
'com.codeborne:xls-test:1.5.0'
)
}Файлы открываются следующим образом:
@Test
void xlsTest() throws Exception {
InputStream stream = getClass().getClassLoader().getResourceAsStream("xls/file.xls");
XLS xls = new XLS(stream);
}Обращаться к XLS-файлам чуть сложнее. Сперва вспомним какие элементы есть в таблицах:
- Листы — их может быть несколько в одной таблице;
- Столбцы;
- Строки;
- Ячейки.

К каждому элементу можно обратиться с помощью вызова метода:
- листы — getSheetAt();
- строчки — getRow();
- столбцы — getCell();
- ячейка — пересечение строки и столбца.
Пример записи строки из первого листа, третьей строки и первого столбца в переменную (нумерация начинается с нуля):
String value = xls.excel.getSheetAt(0).getRow(3).getCell(0).getStringCellValue();CSV (Comma-Separated Values) — текстовый формат, предназначенный для представления табличных данных. Строка таблицы соответствует строке текста, которая содержит одно или несколько полей, разделенных запятыми.
Снова начинаем все с подключения библиотеки:
dependencies {
testImplementation (
'com.opencsv:opencsv:5.6'
)
}Далее откроем файл и проверим его содержимое:
@Test
void csvTest() throws Exception {
try (InputStream stream = getClass().getClassLoader().getResourceAsStream("csv/teachers.csv");
CSVReader reader = new CSVReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) {
List<String[]> content = reader.readAll();
org.assertj.core.api.Assertions.assertThat(content).contains(
new String[]{"---", "---"},
new String[]{"---", "---"}
);
}
}ZIP-архивы открываются практически идентичным образом. На примере разберем открытие такого архива и проверку его содержимого:
@Test
void zipTest() throws Exception {
ZipFile zf = new ZipFile(new File("src/test/resources/zip/sample-zip-file.zip"));
ZipInputStream is = new ZipInputStream(cl.getResourceAsStream("zip/sample-zip-file.zip"));
ZipEntry entry;
while((entry = is.getNextEntry()) != null) {
org.assertj.core.api.Assertions.assertThat(entry.getName()).isEqualTo("sample.txt");
try (InputStream inputStream = zf.getInputStream(entry)) {
// проверки
}
}
}В архиве может находиться много разных файлов и для удобной работы с ними есть объект ZipEntry. Цикл while необходим для перебора содержимого архива.