Video casero de Selenium también conocido como WebDriver. O que grabar una pantalla si tienes java, pruebas rotas y un poco de tiempo

En el trabajo, decidimos automatizar las pruebas para varias de nuestras aplicaciones web. Y además de la información, cuando cayeron las pruebas, también quería ver cómo lucía la página en este triste momento.



No he comprado damas ni selenio durante mucho tiempo, así que tuve que investigar un poco en Internet y buscar qué está haciendo la gente inteligente en esta situación. La solución que me convenía al final reunía varias tecnologías: Java + Selenium + Junit + Allure + ffmpeg + VideoRecorder (de Pirogov). Pero como honestamente seguí investigando, tratando de encontrar la mejor solución al problema, había varias formas más alternativas y más simples de extraer: cómo se puede tomar una captura de pantalla.



Dado que la información encontrada está dispersa por todo Internet, creo que sería bueno tener una sinopsis concisa en un solo lugar. De hecho, el artículo resultó ser una pequeña introducción para principiantes. Aquellos que están preocupados por el mismo problema: ver con sus ojos lo que existía o no existía cuando los autotests arrojaron la bandera roja.



Veamos qué se nos pide que hagamos.



Cómo tomar una captura de pantalla de la pantalla



La primera opción que se puede pensar para nuestro problema es tomar capturas de pantalla de la pantalla. Aquellos. adivine el momento en que la prueba fallará y obtenga una imagen. Por lo general, puede tomar una captura de pantalla para cada acción. O tome una captura de pantalla con una frecuencia determinada (por ejemplo, una vez cada medio segundo).



Método 1. Selenium



Dado que muchas pruebas están escritas en Selenium / WebDriver, sería razonable utilizar sus métodos. Por ejemplo:



WebDriver driver = new FirefoxDriver(); driver.get("http://www.google.com/"); 
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("c:\\tmp\\screenshot.png"));


Método 2. Selenuro La



segunda forma es usar envoltorios para Selenio, por ejemplo Selenuro. Este marco simplifica el trabajo con el controlador y, entre otras cosas, hace capturas de pantalla automáticamente cuando ocurre un error. De forma predeterminada, las capturas de pantalla se almacenan en la carpeta "test-result / reports".



Método 3. java.awt.Robot



La siguiente forma es usar una clase Java generalmente estándar (desde la versión 1.3) para trabajar directamente con el sistema operativo. Un pequeño ejemplo de cómo podría verse un código similar:



BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 
ImageIO.write(image, "png", new File("/screenshot.png"));


Método 4. Uso de programas externos



Busque un programa que tome capturas de pantalla y use su API. Por supuesto, existe ese método, pero ni siquiera profundicé en esta dirección.



Método 5. Utilice tecnologías en la nube



Si no quiere molestarse en absoluto y el dinero le quema el muslo a su empleador, puede pasar a ejecutar pruebas en servicios en la nube. La infraestructura de tales servicios generalmente le permite hacer maravillas de registro, creando informes para ejecuciones en diferentes sistemas operativos y en diferentes navegadores. Incluyendo video de exámenes aprobados está disponible. No menciono específicamente los servicios, para no hacer publicidad. Todo está buscado en Google.



Cómo obtener video en pantalla



Con el video, es un poco más complicado. No puede simplemente tomar y grabar un video. Necesitas bailar un poco.



Hay dos formas principales de bailar:



  • Hacer capturas de pantalla y convertirlas en vídeo (en adelante, método 1)
  • Grabe un video inmediatamente (en adelante, métodos 2 y 3)


Método 1. Convierta imágenes en video manualmente (usando ffmpeg como ejemplo)



Para obtener un video, puede tomar capturas de pantalla cada medio segundo y luego combinarlas en un solo video. Por ejemplo, usando la biblioteca ffmpeg (https://ffmpeg.org/)



Para archivos con la extensión PNG ubicados en el mismo directorio, el comando podría verse así:



ffmpeg -framerate 1 -pattern_type glob -i '*.png' \ -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4


Puede agregar automatización y, por ejemplo, crear un script que ejecute un comando similar al final de las pruebas.



Método 2. Video Recorder - Monte Screen Recorder



Otra forma de crear videos es omitir el paso de tomar capturas de pantalla y usar los grabadores de inmediato.



El primero que encontré fue Monte Screen Recorder y a continuación se muestra un pequeño ejemplo del uso de Java wrapper para este grabador (https://github.com/stephenc/monte-screen-recorder):



 GraphicsConfiguration gc = GraphicsEnvironment
            .getLocalGraphicsEnvironment()
            .getDefaultScreenDevice()
            .getDefaultConfiguration(); 
         
    screenRecorder = new ScreenRecorder(gc,
            gc.getBounds(),
            new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_AVI),
            new Format(MediaTypeKey, MediaType.VIDEO, EncodingKey, ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE,
                    CompressorNameKey, ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE,
                    DepthKey, 24, FrameRateKey, Rational.valueOf(15),
                    QualityKey, 1.0f,
                    KeyFrameIntervalKey, 15 * 60),
            new Format(MediaTypeKey, MediaType.VIDEO, EncodingKey, "black", FrameRateKey, Rational.valueOf(30)),
            null,
            new File(targetFolder));
    screenRecorder.start();


La desventaja de esta grabadora es que necesita el códec TSC instalado en su computadora para ver videos (https://www.techsmith.com/products.html).



Método 3. Grabadora: ffmpeg La



segunda grabadora que encontré fue la biblioteca ffmpeg más famosa y utilizada. Ya he dado un ejemplo de su uso para convertir una imagen en un video. Hay varios contenedores para la biblioteca. Terminé instalándome en github.com/SergeyPirogov/video-recorder-java .



Esta biblioteca me atrajo por el hecho de que las actualizaciones son bastante nuevas; significa que el proyecto está vivo y uno puede esperar que los errores se solucionen rápidamente. Además, la envoltura se escribió específicamente para respaldar nuestro problema: grabar un video cuando fallaron las pruebas. La forma más fácil de usar son las anotaciones de Java.Vídeo(nombre = "segunda_prueba")



Por ejemplo:



   @Test
    @Video(name = "second_test")
    public void videoShouldHaveNameSecondTest(){
        Thread.sleep(1000);
        assertTrue(false);
    }


Lo principal es recordar que, por defecto, el contenedor usa el códec Monte, no ffmpeg. Por lo tanto, no olvides anular el formato de video en el archivo de configuración (puedes ver cómo se hace esto en la página central del proyecto Git)



No habrá salida. Para mí, elegí VideoRecorder (de Pirogov), pero sin usar anotaciones, pero usando clases directamente que te permiten iniciar y detener la grabación de video. En la próxima publicación planeo describir este



método, sería deshonesto no referirme a las páginas de las cuales el código fue robado honestamente con fines de investigación:





PD: Si de repente, por accidente, tiene algunas ideas de qué más puede hacer, agregue enlaces o texto en los comentarios. Gracias.



All Articles