Vídeo doméstico do Selenium, também conhecido como WebDriver. Ou do que gravar uma tela se tiver java, testes quebrados e pouco tempo

No trabalho, decidimos automatizar testes para vários de nossos aplicativos da web. E além da informação, quando os testes caíram, eu também queria ver como ficava a página naquele momento triste.



Faz muito tempo que não pego damas e selênio, então tive que vasculhar um pouco na Internet e procurar o que pessoas inteligentes fazem nessa situação. A solução que acabou por me agradar juntou várias tecnologias: Java + Selenium + Junit + Allure + ffmpeg + VideoRecorder (da Pirogov). Mas como eu ainda cavei honestamente, tentando encontrar a melhor solução para o problema, havia várias maneiras alternativas e mais simples de explorar - como você pode fazer uma captura de tela.



Como as informações encontradas estão espalhadas por toda a Internet, acho que seria bom ter uma sinopse concisa em um só lugar. Na verdade, o artigo acabou sendo uma pequena introdução para iniciantes. Aqueles que se preocupam com o mesmo problema - ver com os olhos o que existia ou não existia quando os autotestes lançavam a bandeira vermelha.



Vamos ver o que estamos sendo solicitados a fazer.



Como fazer uma captura de tela da tela



A primeira opção que pode ser pensada para o nosso problema é tirar screenshots da tela. Essa. adivinhe o momento em que o teste falhará e obtenha uma imagem. Geralmente, você pode fazer uma captura de tela para cada ação. Ou faça uma captura de tela em uma determinada frequência (por exemplo, uma vez a cada meio segundo).



Método 1. Selenium



Como muitos testes são escritos em Selenium / WebDriver, seria sábio usar seus métodos. Por exemplo:



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. Selenide A



segunda maneira é usar invólucros para Selenium, por exemplo Selenide. Este framework simplifica o trabalho com o driver e, entre outras coisas, faz capturas de tela automaticamente quando ocorre um erro. Por padrão, as capturas de tela são armazenadas na pasta “resultados do teste / relatórios”.



Método 3. java.awt.Robot



O próximo método é usar uma classe Java geralmente padrão (desde a versão 1.3) para trabalhar diretamente com o sistema operacional. Um pequeno exemplo de como o código pode ser semelhante:



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


Método 4. Usando programas externos



Encontre um programa que faça capturas de tela e use sua API. Claro, esse método existe, mas eu nem mesmo cavei nessa direção.



Método 5. Use tecnologias de nuvem



Se você não quiser se preocupar com nada e o dinheiro queimar a coxa do seu empregador, você pode mudar para a execução de testes em serviços de nuvem. A infraestrutura de tais serviços em geral permite que você faça milagres de registro, criando relatórios para execuções em diferentes sistemas operacionais e em diferentes navegadores. Incluindo vídeo de testes aprovados está disponível. Não menciono especificamente os serviços - para não fazer publicidade. Está tudo no Google.



Como obter um vídeo em tela



Com o vídeo, é um pouco mais complicado. Você não pode simplesmente gravar um vídeo. Você precisa dançar um pouco.



Existem duas formas principais de dançar:



  • Faça capturas de tela e converta-as em vídeo (doravante, método 1)
  • Grave um vídeo imediatamente (doravante, métodos 2 e 3)


Método 1. Converta imagens em vídeo manualmente (usando ffmpeg como exemplo)



Para obter um vídeo, você pode tirar screenshots a cada meio segundo e então combiná-los em um vídeo. Por exemplo, usando a biblioteca ffmpeg (https://ffmpeg.org/)



Para arquivos com a extensão PNG localizados no mesmo diretório, o comando pode ter a seguinte aparência:



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


Você pode adicionar automação e, por exemplo, fazer um script que execute um comando semelhante ao final dos testes.



Método 2. Gravador de vídeo - Gravador de tela Monte



Outra maneira de criar vídeo é pular a etapa de fazer capturas de tela e usar os gravadores imediatamente.



O primeiro que encontrei foi Monte Screen Recorder e abaixo está um pequeno exemplo de como usar Java wrapper para este gravador (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();


A desvantagem deste gravador é que você precisa do codec TSC instalado no seu computador para assistir aos vídeos (https://www.techsmith.com/products.html).



Método 3. Gravador - ffmpeg O



segundo gravador que encontrei foi a biblioteca ffmpeg mais famosa e amplamente usada. Já dei um exemplo de seu uso para converter uma imagem em um vídeo. Existem vários wrappers para a biblioteca. Acabei optando por github.com/SergeyPirogov/video-recorder-java .



Esta biblioteca me atraiu pelo fato de que as atualizações são bastante novas - isso significa que o projeto está vivo e pode-se esperar que os bugs sejam corrigidos rapidamente. Além disso, o wrapper foi escrito especificamente para dar suporte ao nosso problema - gravar um vídeo quando os testes falhavam. A maneira mais fácil de usar são as anotações JavaVídeo(nome = "segundo_teste")



Por exemplo:



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


A principal coisa a lembrar é que por padrão o wrapper usa o codec Monte, não o ffmpeg. Portanto, não se esqueça de substituir o formato de vídeo no arquivo de configuração (você pode ver como isso é feito na página central do projeto Git)



.Não haverá saída. Para mim, escolhi VideoRecorder (de Pirogov), mas sem usar anotações, mas usando diretamente classes que permitem iniciar e parar a gravação de vídeo. Na próxima postagem, pretendo descrever esse



método. Seria desonesto não me referir às páginas das quais o código foi roubado honestamente para fins de pesquisa:





PS: Se de repente, por acidente, você tiver algumas idéias sobre o que mais pode fazer - adicione links ou texto nos comentários. Obrigado.



All Articles