Здравствуйте, коллеги!
Поделитесь пожалуйста опытом как лучше всего добавлять файла с видео выполнения 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 я на эту тему ничего не нашел.