Selenide IllegalArgumentException: Не удалось создать папки

Selenium и Selenide в основном используются для выполнения тестирования пользовательского интерфейса браузера и автоматизации рабочих процессов в браузере. Но иногда нам может потребоваться создать настольное приложение, которое выполняет определенные бизнес-функции, перемещаясь по веб-приложению в браузере. Это часто встречается в бизнес-приложениях, которые не предоставляют доступ к API для извлечения/обновления своих данных.

Selenide — отличный выбор для таких приложений, который отлично работает в автоматизации рабочих процессов браузера. Но во время выполнения Selenide требует наличия определенных каталогов для хранения вывода/скриншотов, полученных во время выполнения.

1. Проблема

Ошибка «java.lang.IllegalArgumentException: Не удалось создать папку» в Selenide обычно возникает, когда Selenide пытается сохранить снимки экрана, исходные коды страниц или журналы, но не может создать требуемые каталоги из-за проблем с разрешениями или неверных путей.

По умолчанию в среде разработки, такой как IDE, Selenide использует корневой каталог проекта в качестве базовой папки и создает в нем необходимые подкаталоги. Поэтому мы никогда не столкнемся с этой проблемой в среде разработки.

Но предположим, что нам нужно распространить это служебное приложение как устанавливаемое приложение или exe. Когда мы устанавливаем приложение, оно обычно устанавливается в 'c:/program files', и операционная система не позволяет создавать в нем подкаталоги по соображениям безопасности. Поэтому, когда мы запустим приложение, мы получим следующее IllegalArgumentException: Failed to create folder error.

2025-02-17 15:26:30 com.example.app.processor.BrowserManager ERROR [153] : An error occurred during the workflow execution:java.lang.IllegalArgumentException: Failed to create folder 'C:\Program Files\myapp\build\downloads\1739786190288_10940_51'at com.codeborne.selenide.impl.FileHelper.ensureFolderExists(FileHelper.java:48) ~[myapp-1.0.0-jar-with-dependencies.jar:?]......at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:?]at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:?]at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[?:?]at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[?:?]at java.lang.Thread.run(Unknown Source) [?:?]Caused by: java.nio.file.AccessDeniedException: C:\Program Files\GST IMS Tool\buildat sun.nio.fs.WindowsException.translateToIOException(Unknown Source) ~[?:?]....

2. Причина

Как упоминалось выше, ошибка возникает из-за того, что операционная система не позволяет Selenide создавать папки из-за ограничений безопасности.

В среде разработки, как правило, мы не работаем в защищенных системных папках, поэтому проблем не возникает. Но в установленном приложении Selenide пытается создавать папки в системных каталогах, что не разрешено, поэтому и возникает эта ошибка.

3. Решение

Решение 1: Прекратите генерировать результаты выполнения

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

import com.codeborne.selenide.Configuration;public class TestConfig {static {// Disable screenshot capturingConfiguration.screenshots = false;// Disable saving page sourceConfiguration.savePageSource = false;// Prevent storing reports(Windows equivalent of /dev/null is NUL)Configuration.reportsFolder = "NUL";}}

Решение 2: Настройте пути к каталогам с разрешением на запись

Другим решением проблемы является запись сформированных отчетов/скриншотов в каталог, где у приложения есть права на запись.

Мы можем настроить путь к уже существующим подкаталогам и даже создать эти подкаталоги в самом коде приложения.

// ............. Inside AppConstants.Javapublic static final String BASE_DATA_DIR = System.getProperty("user.home") +File.separator + "AppData" +File.separator + "Local" +File.separator + APP_NAME;// .............. Inside BrowserManager.javastatic {//Setup web driver. Chrome in this case.createDirectories();}private static void createDirectories() {List<String> requiredDirs = Arrays.asList("downloads","reports/tests","reports/screenshots","reports/page-sources","chrome_data");requiredDirs.forEach(dir -> {try {Files.createDirectories(Paths.get(BASE_DATA_DIR, dir));} catch(IOException e) {log.error("Failed to create directory: {}", dir, e);}});}

Вы можете рефакторить/перестроить приведенный выше код в соответствии с вашими требованиями, но общая логика останется прежней. Этот код при запуске приложения создаст необходимые зависимости в папке C:\Users\myUser\AppData\Local\myApp, которая обычно имеет разрешения на запись для записи кэша приложения и файлов данных.

4. Заключение

В этом коротком руководстве по Java мы обсудили распространенную проблему, которая наблюдается в установленном приложении Java, использующем Selenide для запуска рабочих процессов на основе браузера. Решение поможет в создании обязательных каталогов, используемых для хранения результатов выполнения.

Прокрутить вверх