Je n'ai pas ramassé de dames et de sélénium depuis longtemps, j'ai donc dû creuser un peu sur Internet et chercher ce que les gens intelligents font dans cette situation. La solution qui me convenait au final réunissait plusieurs technologies: Java + Selenium + Junit + Allure + ffmpeg + VideoRecorder (par Pirogov). Mais comme j'ai encore honnêtement creusé, en essayant de trouver la meilleure solution au problème, il y avait plusieurs autres moyens plus simples et alternatifs de mien - comment prendre une capture d'écran.
Étant donné que les informations trouvées sont dispersées sur Internet, je pense que ce serait bien d'avoir un synopsis concis en un seul endroit. En fait, l'article s'est avéré être une petite introduction pour les débutants. Ceux qui sont concernés par le même problème - voir de leurs yeux ce qui existait ou n'existait pas lorsque les autotests ont lancé le drapeau rouge.
Voyons ce qu'on nous demande de faire.
Comment faire une capture d'écran de l'écran
La toute première option à laquelle on peut penser pour notre problème est de prendre des captures d'écran de l'écran. Ceux. devinez le moment où le test échouera et obtenez une image. Vous pouvez généralement prendre une capture d'écran pour chaque action. Ou prenez une capture d'écran à une certaine fréquence (par exemple, une fois toutes les demi-secondes).
Méthode 1. Selenium
Comme de nombreux tests sont écrits en Selenium / WebDriver, il serait judicieux d'utiliser ses méthodes. Par exemple:
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éthode 2. Séléniure La
deuxième méthode consiste à utiliser des emballages pour le sélénium, par exemple le séléniure. Ce framework simplifie le travail avec le pilote et, entre autres, fait des captures d'écran automatiquement lorsqu'une erreur se produit. Par défaut, les captures d'écran sont stockées dans le dossier «test-result / reports».
Méthode 3. java.awt.Robot
La prochaine façon est d'utiliser une classe Java généralement standard (depuis la version 1.3) pour travailler directement avec le système d'exploitation. Un petit exemple de l'apparence d'un code similaire:
BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
ImageIO.write(image, "png", new File("/screenshot.png"));
Méthode 4. Utilisation de programmes externes
Trouvez un programme qui prend des captures d'écran et utilisez son API. Bien sûr, il existe une telle méthode, mais je n'ai même pas creusé dans cette direction.
Méthode 5. Utilisez les technologies cloud
Si vous ne voulez pas du tout vous déranger et que l'argent brûle la cuisse de votre employeur, vous pouvez passer à l'exécution de tests dans les services cloud. L'infrastructure de ces services en général vous permet de faire des miracles de journalisation, de créer des rapports pour les exécutions sur différents systèmes d'exploitation et dans différents navigateurs. Y compris la vidéo des tests réussis est disponible. Je ne mentionne pas spécifiquement les services - pour ne pas faire de publicité. Tout est googlé.
Comment obtenir une vidéo d'écran
Avec la vidéo, c'est un peu plus compliqué. Vous ne pouvez pas simplement prendre et tourner une vidéo. Vous devez danser un peu.
Il existe deux façons principales de danser:
- Faites des captures d'écran et convertissez-les en vidéo (ci-après, méthode 1)
- Filmez une vidéo immédiatement (ci-après, méthodes 2 et 3)
Méthode 1. Convertissez les images en vidéo à la main (en utilisant ffmpeg comme exemple)
Pour obtenir une vidéo, vous pouvez prendre des captures d'écran toutes les demi-secondes, puis les combiner en une seule vidéo. Par exemple, en utilisant la bibliothèque ffmpeg (https://ffmpeg.org/)
Pour les fichiers avec l'extension PNG situés dans le même répertoire, la commande pourrait ressembler à ceci:
ffmpeg -framerate 1 -pattern_type glob -i '*.png' \ -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
Vous pouvez ajouter une automatisation et, par exemple, créer un script qui exécute une commande similaire à la fin des tests.
Méthode 2. Enregistreur vidéo - Enregistreur d'écran Monte
Une autre façon de créer une vidéo est de contourner l'étape de prendre des captures d'écran et d'utiliser les enregistreurs tout de suite.
Le premier que j'ai rencontré était Monte Screen Recorder et ci-dessous est un petit exemple d'utilisation du wrapper Java pour cet enregistreur (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();
L'inconvénient de cet enregistreur est que vous avez besoin du codec TSC installé sur votre ordinateur pour regarder des vidéos (https://www.techsmith.com/products.html).
Méthode 3. Enregistreur - ffmpeg Le
deuxième enregistreur que j'ai rencontré était la bibliothèque ffmpeg la plus connue et la plus utilisée. J'ai déjà donné un exemple de son utilisation pour convertir une image en vidéo. Il existe plusieurs wrappers pour la bibliothèque. J'ai fini par m'installer sur github.com/SergeyPirogov/video-recorder-java .
Cette bibliothèque m'a attiré par le fait que les mises à jour sont assez récentes - cela signifie que le projet est vivant et on peut espérer que les bugs seront corrigés rapidement. De plus, le wrapper a été écrit spécifiquement pour prendre en charge notre problème - pour filmer une vidéo lorsque les tests ont échoué. Les annotations Java sont la manière la plus simple d'utiliserVidéo(name = "second_test")
Par exemple:
@Test
@Video(name = "second_test")
public void videoShouldHaveNameSecondTest(){
Thread.sleep(1000);
assertTrue(false);
}
La principale chose à retenir est que, par défaut, le wrapper utilise le codec Monte, pas ffmpeg. Par conséquent, n'oubliez pas de remplacer le format vidéo dans le fichier de configuration (vous pouvez voir comment cela se fait sur la page centrale du projet Git) .Il
n'y aura pas de sortie. Pour ma part, j'ai choisi VideoRecorder (par Pirogov), mais sans utiliser d'annotations, mais en utilisant directement des classes qui vous permettent de démarrer et d'arrêter l'enregistrement vidéo. Dans le prochain article, je prévois de décrire cette
méthode, il serait malhonnête de ne pas faire référence aux pages sur lesquelles le code a été honnêtement volé à des fins de recherche:
- 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: Si soudainement, par accident, vous avez des idées de ce que vous pouvez faire d'autre - veuillez ajouter des liens ou du texte dans les commentaires. Merci.