t.me/atinfo_chat Telegram группа по автоматизации тестирования

Как правильно организовать работу с ссылками на файлы в разных ОС

Теги: #<Tag:0x00007f9b02e944a0> #<Tag:0x00007f9b02e94310> #<Tag:0x00007f9b02ea3ef0> #<Tag:0x00007f9b02ea3d38>

Уважаемое сообщество, помогите, пожалуйста.
Проблема вот в чем: я пишу тесты, используя WebDriver + JUnit.
Пишу и до последнего момента гоняла свои тесты только на базе ОС Windows
Соответственно, все ссылки на файлы, которые должны быть загружены во время тестов, прописаны в формате:
БАЗОВЫЙ ПУТЬ + “\папка_1\папка_2\Файл”
Теперь мне предстоит использовать тесты для Линукс.
И путь к файлу должен выглядеть вот так: БАЗОВЫЙ ПУТЬ + “/папка_1/папка_2/Файл”.
Я думаю решать это таким путем: нужно будет создать обертку, в которой будет проверяться тип файловой системы, и если ОС != Windows, выполнять замену \ на /
Собственно вопрос: не изобретаю ли я велосипед, возможно, у меня в корне неправильный подход к вопросу?

Вы можете писать и Windows пути как “/папка_1/папка_2/Файл”.:wink:

в Python есть модуль os и если например писать os.path.join(base_path, ‘папка_1’, ‘апка_2’, ‘Файл’), то все должно норм отрабатывать на Linux и MacOS

Как видите, в виндоус можно обращаться к папкам и так.

эмм, при чем тут Питон[quote=“asatt1979, post:1, topic:8700”]
я пишу тесты, используя WebDriver + JUnit
[/quote]

А если использовать CalssLoader? http://stackoverflow.com/a/3862115/2504101

думаю нечто подобное можно сделать не только в питоне

Не нужно писать своих условий в зависимости от ОС, есть же системное свойство:

System.getProperty("path.separator")

А вообще, правы люди, Java должна понимать пути с ‘/’ даже в Windows. Если только готовый путь где-то еще используется, тогда можно поменять.

Обычный слэш распознается одинаково всеми системами, поэтому самый простой способ использовать его и не делать никаких замен. Обратный, да, будет считаться за знак экранирования в linux подобных системах.

Так что решение или делать обычный слеш /, или двойной обратный - \\ (тоже будет корректно работать на всех системах, т.к. он будет как-бы экранировать один одиночный слеш, а винде все равно сколько там слешей).

Привет всем! У меня тож была подобная проблема. Я решил ее следующим образом, те файлы, что нужны были для тестов (фото для аватаров, фото товаров) я просто положил в resources/имя_каталога и соответственно они переносились с платформы - на другую платформу без особых проблем. Если нужны “тонкости” - поделюсь с удовольствием.

  1. Файлы у меня лежат в папке resources/имя_каталога
    для метода sendKeys() в качестве параметра я передаю строку FILE, объявленную вот так:
    public static final String FILE = BASE_PATH + “tests/java/src/test/resources/Files/file.xls”;
    Если использовать путь в таком вот виде - метод не отрабатывает.
    Если использовать вот так:
    public static final String FILE = BASE_PATH + “tests\\java\\src\\test\\resources\\Files\\file.xls”;
    Все отлично проходит.
  2. я так понимаю, что использование CalssLoader http://stackoverflow.com/a/3862115/2504101 решит проблему
  3. Но я не понимаю, почему " Java должна понимать пути с ‘/’ даже в Windows", а у меня не понимает? ЧЯДНТ?

Моя реализация такая:

File fileA = new File("src/test/resources/images/au_no1.jpg");
String fileAvatar = fileA.getAbsolutePath();

строку fileAvatar передаю в sendKeys

Да! так работает,
у этого File есть public abstract String normalize(String path), который приводит мою абракадабру к корректному виду.

С помощью classLoader получилось вот так:
String file = getClass().getResource("/Files/file.xls").toString;

Спасибо огромное за помощь!

1 Симпатия

Этот велосипед уже давно изобретен в apache-commons-io -> FileNameUtils.separatorsToSystem.

А мне в последнее время понравился такой подход:
Paths.get("folder","subfolder","filename.extension").toFile();

Очень лаконично и симпатично, как на мой взгляд

2 Симпатий