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:
- www.ontestautomation.com/creating-a-video-capture-of-your-selenium-tests-using-monte-screen-recorder
- habr.com/ru/sandbox/67456
- stackoverflow.com/questions/24961127/how-to-create-a-video-from-images-with-ffmpeg
- github.com/stephenc/monte-screen-recorder
- habr.com/ru/sandbox/67456
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.