[JAVA] Ajoutez des capacités d'enregistrement d'écran aux cas de test Selenium

Ajoutez des capacités d'enregistrement d'écran aux cas de test Selenium

Récemment, il y a de plus en plus d'opportunités de l'utiliser, comme le pilotage automatique avec Selenium + Junit pour automatiser diverses opérations, et son utilisation pour des tests de pré-livraison d'applications Web, mais surtout le fonctionnement de services fournis par d'autres. Si vous automatisez avec Selenium, vous ne pourrez pas identifier l'élément même si vous apportez un petit changement tel que changer la mise en page ou modifier la faute de frappe, et l'opération automatique ne se poursuivra pas dans de nombreux cas. Dans un tel cas, généralement, la même opération est effectuée tout en surveillant à nouveau visuellement l'écran pour vérifier où le problème se produit, mais dans certains cas, il s'agit d'un phénomène rare ou il peut être reproduit. J'ai trouvé l'article suivant sur Qiita quand j'ai pensé que cela prendrait du temps et que ce serait pratique si je pouvais enregistrer l'état de l'écran lorsque le phénomène s'est réellement produit.

Enregistrer lors de l'exécution avec Selenium (Selenide)

Ainsi, lorsque j'ai effectivement adopté la méthode décrite dans cet article, j'ai pu améliorer l'efficacité du travail de correction plus que prévu, j'ai donc résumé la procédure pour incorporer la fonction d'enregistrement d'écran dans mon code.

Importez les classes nécessaires pour enregistrer l'écran

python


import java.io.File;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import org.junit.rules.TestName;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
import org.monte.media.Format;
import org.monte.media.math.Rational;
import static org.monte.media.FormatKeys.*;
import static org.monte.media.VideoFormatKeys.*;

Définir des méthodes et des règles pour l'enregistrement d'écran

Vous pouvez spécifier le dossier pour stocker le fichier enregistré dans la partie de Fichier fichier = nouveau fichier (" enregistrement "); sur la deuxième ligne. Encodage et compresseur lors de l'enregistrement par Monte Media Library avec les paramètres ʻEncodingKey et CompressorNameKeydonnés à la méthodeScreenRecorder` à partir de la 14e ligne Vous pouvez spécifier la méthode de compression). Il semble que la bibliothèque multimédia Monte puisse utiliser des encodages et des compresseurs comme indiqué dans l'URL de référence ci-dessous, mais je n'ai pas trouvé de description de la combinaison efficace, il s'agit donc d'un processus d'essai et d'erreur.

À la suite de mes propres essais et erreurs, il est préférable d'utiliser TechSmith Screen Capture Codec (ʻENCODING_AVI_TECHSMITH_SCREEN_CAPTURE) spécifié dans l'exemple pour l'encodage et le compresseur. La taille du fichier enregistré est devenue plus petite, mais pour la lecture du fichier enregistré avec ʻENCODING_AVI_TECHSMITH_SCREEN_CAPTURE, un lecteur dédié ou [Codec supplémentaire] pour QuickTime Player (https://www.techsmith.com/codecs.html) ) Doit être installé.

Codec supplémentaire pour QuickTime Player (Tech Smith Screen Capture Codec) https://www.techsmith.com/codecs.html

Page JavaDoc dans Monte Media Library http://www.randelshofer.ch/monte/javadoc/index.html

Lorsque ʻENCODING_QUICKTIME_CINEPAKest spécifié pour l'encodage et queCOMPRESSOR_NAME_QUICKTIME_CINEPAK` est spécifié pour le compresseur, le fichier enregistré est créé dans un état où il peut être lu tel quel avec QuickTime Player de macOS. Comme la taille de est assez grande, veuillez essayer de spécifier l'encodage et le compresseur au bon endroit.

python


  public void startRecording(String name) throws Exception {
    File file = new File("record");

    Dimension screenSize = driver.manage().window().getSize();
    int width = screenSize.width;
    int height = screenSize.height;

    java.awt.Rectangle captureSize = new java.awt.Rectangle(0,0, width, height);

    GraphicsConfiguration gc = GraphicsEnvironment
      .getLocalGraphicsEnvironment()
      .getDefaultScreenDevice()
      .getDefaultConfiguration();

    this.screenRecorder = new ScreenRecorder(gc, captureSize,
      new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, MIME_QUICKTIME),
      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, file, name);
    this.screenRecorder.start();
  }

  public void stopRecording() throws Exception {
    this.screenRecorder.stop();
  }

  private ScreenRecorder screenRecorder;

  @Rule
  public TestName testName = new TestName();

  @Rule
  public TestWatcher watchman = new TestWatcher() {

    @Override
    protected void succeeded(Description d) {
      System.out.println("I am succeeded() method. name -> " + d.getMethodName());
      //Si vous souhaitez conserver le fichier enregistré même si le test est réussi, commentez la ligne suivante
      screenRecorder.getCreatedMovieFiles().stream().filter(a -> a.toPath().toString().contains(testName.getMethodName())).forEach(a -> a.deleteOnExit());
    }

    @Override
    protected void failed(Throwable th, Description d) {
      System.out.println("I am failed() method. name -> " + d.getMethodName());
      System.out.println(th.toString());
    }
  };

Ajout de l'appel de méthode de démarrage d'enregistrement d'écran au processus d'initialisation

python


  @Before
  public void setUp() throws Exception {

    driver = new FirefoxDriver();

    baseUrl = "https://console.firebase.google.com";
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    startRecording(testName.getMethodName());
  }

python


  @After
  public void tearDown() throws Exception {
    //Si vous arrêtez l'enregistrement immédiatement après la fin du test, le résultat peut ne pas être enregistré jusqu'à la fin, alors dormez
    Thread.sleep(5000);
    stopRecording();
    driver.quit();
    String verificationErrorString = verificationErrors.toString();
    if (!"".equals(verificationErrorString)) {
      fail(verificationErrorString);
    }
  }

Ajout du référentiel et de la dépendance de Monte Media Library au fichier de projet maven (pom.xml)

pom.xml


  <repositories>
      ...
    <repository>
      <id>additional-repo1</id>
      <name>Alfresco Public Repository</name>
      <url>https://artifacts.alfresco.com/nexus/content/repositories/public/</url>
    </repository>
  </repositories>

pom.xml


  <dependencies>
    <dependency>
       ...
    </dependency>
    <dependency>
      <groupId>org.monte</groupId>
      <artifactId>monte-screen-recorder</artifactId>
      <version>0.7.7</version>
    </dependency>
  </dependencies>

Classe ajoutée pour les captures d'écran

En héritant de ScreenRecorder de Monte Media Library et en remplaçant createMovieFile, l'emplacement et le nom de fichier pour sortir le fichier enregistré sont name + yyyy-MM-dd HH.mm.ss (date et heure) sous le dossier spécifié par movieFolder. ).

ScreenRecorder.java


package net.hoge2.test;

import java.awt.AWTException;
import java.awt.GraphicsConfiguration;
import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.monte.media.Format;
import org.monte.media.Registry;

public class ScreenRecorder extends org.monte.screenrecorder.ScreenRecorder {
  private String name;

  public ScreenRecorder(GraphicsConfiguration cfg,
    Rectangle captureArea, Format fileFormat, Format screenFormat,
    Format mouseFormat, Format audioFormat, File movieFolder,
    String name) throws IOException, AWTException {
    super(cfg, captureArea, fileFormat, screenFormat, mouseFormat,
      audioFormat, movieFolder);
    this.name = name;
  }

  @Override
  protected File createMovieFile(Format fileFormat) throws IOException {
    if (!movieFolder.exists()) {
      movieFolder.mkdirs();
    }
    else if (!movieFolder.isDirectory()) {
      throw new IOException("\"" + movieFolder + "\" is not a directory.");
    }

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss");
    return new File(movieFolder,
      name + "-" + dateFormat.format(new Date()) + "."
      + Registry.getInstance().getExtension(fileFormat));
  }
}

J'utilise la Monte Media Library pour enregistrer des écrans tout en exécutant des cas de test dans Selenium, mais cette bibliothèque fait des choses comme la connexion SSH à distance. Si vous essayez d'exécuter le scénario de test dans cet état, une erreur se produira, donc si vous devez l'exécuter par connexion à distance, vous devez commenter la partie correspondante.

Recommended Posts

Ajoutez des capacités d'enregistrement d'écran aux cas de test Selenium
Comment tester l'écran de téléchargement de fichiers avec Spring + Selenium
Ajouter un sélecteur d'image à Selenium Grid
Comment écrire dynamiquement des cas de test itératifs à l'aide de test / unit (Test :: Unit)