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
необходим для перебора содержимого архива.