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

Для работы с 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

Работа с 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-файлам чуть сложнее. Сперва вспомним какие элементы есть в таблицах:

  1. Листы — их может быть несколько в одной таблице;
  2. Столбцы;
  3. Строки;
  4. Ячейки.

К каждому элементу можно обратиться с помощью вызова метода:

  • листы — getSheetAt();
  • строчки — getRow();
  • столбцы — getCell();
  • ячейка — пересечение строки и столбца.

Пример записи строки из первого листа, третьей строки и первого столбца в переменную (нумерация начинается с нуля):

String value = xls.excel.getSheetAt(0).getRow(3).getCell(0).getStringCellValue();

Работа с CSV

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

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

⚠️ **GitHub.com Fallback** ⚠️