[JAVA] Hinzufügen von Bildschirmaufzeichnungsfunktionen zu Selenium-Testfällen

Hinzufügen von Bildschirmaufzeichnungsfunktionen zu Selenium-Testfällen

In letzter Zeit gibt es zunehmend Möglichkeiten, es zu verwenden, z. B. Autopiloten mit Selenium + Junit, um verschiedene Vorgänge zu automatisieren, und es für Tests vor der Auslieferung von Webanwendungen zu verwenden, insbesondere jedoch für den Betrieb von Diensten, die von anderen bereitgestellt werden. Wenn Sie mit Selen automatisieren, können Sie das Element auch dann nicht identifizieren, wenn Sie eine kleine Änderung vornehmen, z. B. das Seitenlayout ändern oder den Tippfehler ändern, und der automatische Vorgang wird in vielen Fällen nicht fortgesetzt. In einem solchen Fall wird normalerweise derselbe Vorgang ausgeführt, während der Bildschirm erneut visuell überwacht wird, um zu überprüfen, wo das Problem auftritt. In einigen Fällen handelt es sich jedoch um ein seltenes Phänomen oder es kann reproduziert werden. Ich fand den folgenden Artikel über Qiita, als ich dachte, dass es einige Zeit dauern würde und dass es praktisch wäre, wenn ich den Zustand des Bildschirms aufzeichnen könnte, als das Phänomen tatsächlich auftrat.

Aufzeichnung zur Laufzeit mit Selen (Selenid)

Als ich die in diesem Artikel beschriebene Methode tatsächlich übernahm, konnte ich die Effizienz der Korrekturarbeit stärker als erwartet verbessern. Daher fasste ich das Verfahren zum Einfügen der Bildschirmaufzeichnungsfunktion in meinen Code zusammen.

Importieren Sie die Klassen, die zum Aufzeichnen des Bildschirms benötigt werden

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.*;

Definieren Sie Methoden und Regeln für die Bildschirmaufzeichnung

Sie können den Ordner zum Speichern der aufgezeichneten Datei im Teil von "File file = new File (" record ");" in der zweiten Zeile angeben. Codierung und Kompressor bei Aufnahme durch Monte Media Library mit den Parametern "EncodingKey" und "CompressorNameKey" für die Methode "ScreenRecorder" aus der 14. Zeile Sie können die Komprimierungsmethode angeben. Es scheint, dass die Monte Media Library Codierungen und Kompressoren verwenden kann, wie in der folgenden Referenz-URL gezeigt, aber ich konnte keine Beschreibung finden, welche Kombination effektiv ist, so dass dies ein Versuch und Irrtum ist.

Aufgrund meines eigenen Versuchs und Irrtums ist es am besten, den im Beispiel angegebenen TechSmith Screen Capture Codec (ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE) sowohl für die Codierung als auch für den Kompressor zu verwenden. Die Größe der aufgezeichneten Datei wurde verringert, aber zum Abspielen der mit "ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE" aufgezeichneten Datei, einem dedizierten Player oder [Zusätzlicher Codec] für QuickTime Player (https://www.techsmith.com/codecs.html) ) Muss installiert werden.

Zusätzlicher Codec für QuickTime Player (Tech Smith Screen Capture Codec) https://www.techsmith.com/codecs.html

JavaDoc-Seite in der Monte Media Library http://www.randelshofer.ch/monte/javadoc/index.html

Wenn für die Codierung "ENCODING_QUICKTIME_CINEPAK" und für den Kompressor "COMPRESSOR_NAME_QUICKTIME_CINEPAK" angegeben ist, wird die Aufnahmedatei in einem Zustand erstellt, in dem sie wie mit QuickTime Player von macOS abgespielt werden kann, die Datei wird jedoch mit dem Fall der Verwendung von TechSmith Screen Capture Codec verglichen. Da die Größe von ziemlich groß ist, versuchen Sie bitte, die Codierung und den Kompressor an der richtigen Stelle anzugeben.

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());
      //Wenn Sie die aufgezeichnete Datei auch nach erfolgreichem Test behalten möchten, kommentieren Sie die nächste Zeile aus
      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());
    }
  };

Aufruf der Startmethode für die Bildschirmaufzeichnung zum Initialisierungsprozess hinzugefügt

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 {
    //Wenn Sie die Aufzeichnung sofort nach Ende des Tests beenden, wird das Ergebnis möglicherweise nicht bis zum Ende aufgezeichnet. Schlafen Sie also
    Thread.sleep(5000);
    stopRecording();
    driver.quit();
    String verificationErrorString = verificationErrors.toString();
    if (!"".equals(verificationErrorString)) {
      fail(verificationErrorString);
    }
  }

Repository und Abhängigkeit von Monte Media Library zur Maven-Projektdatei (pom.xml) hinzugefügt

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>

Klasse für Screenshots hinzugefügt

Durch das Erben von ScreenRecorder der Monte Media Library und das Überschreiben von createMovieFile lauten der Speicherort und der Dateiname für die Ausgabe der aufgezeichneten Datei Name + JJJJ-MM-TT HH.mm.ss (Datum und Uhrzeit) in dem von movieFolder angegebenen Ordner. ).

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));
  }
}

Ich verwende die Monte Media Library, um Bildschirme aufzuzeichnen, während Testfälle in Selen ausgeführt werden, aber diese Bibliothek führt beispielsweise die Remote-SSH-Anmeldung aus. Wenn Sie versuchen, den Testfall in diesem Zustand auszuführen, tritt ein Fehler auf. Wenn Sie ihn also per Remote-Anmeldung ausführen müssen, müssen Sie den entsprechenden Teil auskommentieren.

Recommended Posts

Hinzufügen von Bildschirmaufzeichnungsfunktionen zu Selenium-Testfällen
So testen Sie den Bildschirm zum Hochladen von Dateien mit Spring + Selenium
Fügen Sie dem Selenium Grid einen Bildwähler hinzu
Dynamisches Schreiben iterativer Testfälle mit test / unit (Test :: Unit)