Проблема с доступностью видео файлов из Selenoid для добавления к Allure

Здравствуйте, коллеги!

Поделитесь пожалуйста опытом как лучше всего добавлять файла с видео выполнения UI тестов, полученный от Selenoid к Allure отчету?

Моя проблема в следующем:

есть проект Java - Selenium - Cucumber(testNG runner) - Allure, он запускается через docker-compose, где сам проект находится в собственном контейнере, а браузеры поднимаются через Selenoid. docker-compose файл выглядит вот так:

Спойлер
version: "3.3" 
services: 
  selenoid: 
    image: aerokube/selenoid:latest-release 
    network_mode: bridge 
    container_name: selenoid 
    volumes: 
      - ./Web/:/etc/selenoid/ 
      - /var/run/docker.sock:/var/run/docker.sock 
      - ./Web/video:/opt/selenoid/video 
      - ./Web/logs:/opt/selenoid/logs 
    environment: 
      - OVERRIDE_VIDEO_OUTPUT_DIR=$PWD/web/video 
      - TZ=Europe/Moscow 
    command: [ 
        "-conf", 
        "/etc/selenoid/browsers.json", 
        "-video-output-dir", 
        "/opt/selenoid/video", 
        "-log-output-dir", 
        "/opt/selenoid/logs" ] 
    ports: 
      - 4444:4444 

  selenoid-ui: 
    image: aerokube/selenoid-ui:latest-release 
    network_mode: bridge 
    container_name: selenoid-ui 
    command: --selenoid-uri http://selenoid:4444 
    links: 
      - selenoid 
    ports: 
      - 8080:8080 

  webmvntest: 
    container_name: mvn-web-test 
    network_mode: bridge 
    environment: 
      - TAG=${TAG} 
      - BROWSER=${BROWSER} 
      - SUITE=${SUITE} 
    build: 
      context: . 
      dockerfile: Dockerfile-web 
    depends_on: 
      - selenoid 
    links: 
      - selenoid 
    volumes: 
      - ./Web/allure-results:/usr/src/app/allure-results 

все работает корректно, в папке video, размапленной от selenoid контейнера вижу файлы с видео. По завершении тестов из класса Hooks в методе с аннотацией @After вызываю метод, прикрепляющий файл с видео к отчету. Пробую следующие варианты:

  • прикрепить файл из размапленной папки:
Спойлер
public static void allureAttachVideoFromFolder(String attachName, WebDriver driver) { 
        try { 
            Thread.sleep(1000); 
            InputStream is = null; 
            int counter = 0; 

            File video = new File("video/" + getSessionId(driver) + ".mp4"); 

            while (counter < 60000) { 
                Thread.sleep(1000); 
                counter += 1000; 

                if (video.exists()) { 
                    is = new ByteArrayInputStream(FileUtils.readFileToByteArray(video)); 
                    break; 
                } 
            } 
       
            if (is != null) { 
                addAttachment(attachName, "video/mp4", is, ".mp4"); 
            } else throw new Exception("The file wasn't appear in the folder after 20 sec"); 

        } catch (Exception e) { 
            Log.error("There is a problem with attaching video file for this session " + 
                    "'" + getSessionId(driver) + "' from the 'video' folder, see the stack traces: " + e); 
        } 
    } 
  • прикрепить файл, скачав его у selenoid’а:
Спойлер
public static void allureGetVideoFromServer(String attachName, WebDriver driver) { 
        try { 
            URL videoUrl = getVideoUrl(getSessionId(driver)); 
            assertNotNull(videoUrl, "The URL of the video is invalid"); 

            InputStream is = null; 
            Thread.sleep(1000); 

            for (int i = 0; i < 60; i++) { 
                try { 
                    is = videoUrl.openStream(); 
                    i = 60; 
                } catch (FileNotFoundException e) { 
                    Thread.sleep(1000); 
                } 
            } 

            assertNotNull(is, "The video is still not available on the server after 60 sec"); 
            addAttachment(attachName, "video/mp4", is, ".mp4"); 
        } catch (Exception | AssertionError e) { 
            Log.error("There is a problem with attaching video file for this session " + 
                    "'" + getSessionId(driver) + "', see the stack traces: " + e); 
        } 
    } 

сервисные методы, используемые выше:

Спойлер
public static String getSessionId(WebDriver driver){ 
      return ((RemoteWebDriver) driver.getDriver()).getSessionId().toString(); 
} 

public static URL getVideoUrl(String sessionId) { 
    String videoUrl = "http://selenoid:4444/video/" + sessionId + ".mp4"; 

    try { 
        return new URL(videoUrl); 
    } catch (MalformedURLException e) { 
        e.printStackTrace(); 
    } 
    return null; 
} 

в любом из вариантов к отчету прикрепляется ничего, независимо от выставленных задержек. Проблема именно в доступности файла, а не в том как делается аттач. Я понимаю что любое видео требует процессинга, который занимает время, но в моем случае записи сравнительно короткие (<1 мин) и задержки на ожидание порядка 1 мин по идее должно быть достаточно? Еще один вариант, прикреплять как линк на файл на selenoid’e:

Спойлер
public static void allureAttacheVideoFromServer(String attachName, WebDriver driver) { 
            addAttachment(attachName, 
                    "text/html", 
                    "<html>" + 
                            "<body><video width='100%' height='100%' controls autoplay>" + 
                            "<source src='" + getVideoUrl(getSessionId(driver)) + "' type='video/mp4'>" + 
                            "</video></body>" + 
                            "</html>", 
                    ".html"); 
} 

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

Собственно вопросы:

  • я что-то делаю не так? Проблема в недостаточной задержке ожидания файла или задержка неправильно реализована? Как можно определить оптимальную задержку с учетом длительности теста?
  • что лучше: доставать файл из размапленной из selenoid контейнера папки или скачивать через URL?
  • как-то можно проверять что файл готов для скачивания/копирования? В документации selenoid я на эту тему ничего не нашел.