webentwicklung-frage-antwort-db.com.de

Wie man ein Video mit Selenium Webdriver und Java API aufzeichnet

Ich habe automatisierte Skripte, die jede Nacht ausgeführt werden (etwa 50 Skripte oder Testfälle). Ich möchte ein Video von jedem Testfall aufzeichnen (Selen Java API + Cucumber). Gibt es ein Tool oder eine Methode, mit der ich die Videoaufzeichnung für jeden Testfall separat steuern kann? Ich möchte während Ein Testfall-Setup startet die Aufzeichnung und beendet während des Herunterfahrens die Aufzeichnung und speichert das Video lokal mit einem bestimmten Namen und Datum. Ich sollte also 50 Videos für jeden Testfall haben (am besten nur Videos für die fehlgeschlagenen Testfälle speichern).

Gibt es eine Möglichkeit, diese Funktionalität in den Code zu integrieren, den ich für meine Setups und Teardowns verwende?

8
sgrillon

Ich finde eine Lösung hier aber wenn du eine bessere findest, kannst du eine andere Antwort posten:

org.monte.screenrecorder.ScreenRecorder  screenRecorder = new ScreenRecorder...

Vollständiger Hauptcode:

import static org.monte.media.FormatKeys.EncodingKey;
import static org.monte.media.FormatKeys.FrameRateKey;
import static org.monte.media.FormatKeys.KeyFrameIntervalKey;
import static org.monte.media.FormatKeys.MIME_AVI;
import static org.monte.media.FormatKeys.MediaTypeKey;
import static org.monte.media.FormatKeys.MimeTypeKey;
import static org.monte.media.VideoFormatKeys.CompressorNameKey;
import static org.monte.media.VideoFormatKeys.DepthKey;
import static org.monte.media.VideoFormatKeys.ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE;
import static org.monte.media.VideoFormatKeys.QualityKey;

import Java.awt.Dimension;
import Java.awt.GraphicsConfiguration;
import Java.awt.GraphicsEnvironment;
import Java.awt.Rectangle;
import Java.awt.Toolkit;
import Java.io.File;

import org.monte.media.Format;
import org.monte.media.FormatKeys.MediaType;
import org.monte.media.math.Rational;
import org.monte.screenrecorder.ScreenRecorder;
import org.openqa.Selenium.By;
import org.openqa.Selenium.WebDriver;
import org.openqa.Selenium.WebElement;
import org.openqa.Selenium.chrome.ChromeDriver;
import org.openqa.Selenium.remote.DesiredCapabilities;

public class VideoReord {

    public static final String USER_DIR = "user.dir";
    public static final String DOWNLOADED_FILES_FOLDER = "downloadFiles";

    private ScreenRecorder screenRecorder;

    public static void main(String[] args) throws Exception {

        VideoReord videoReord = new VideoReord();
        videoReord.startRecording();

        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        WebDriver driver = new ChromeDriver(capabilities);
        driver.get("http://www.google.com");

        WebElement element = driver.findElement(By.name("q"));
        element.sendKeys("BreizhCamp 2018");
        element.submit();
        System.out.println("Page title is: " + driver.getTitle());
        driver.quit();
        videoReord.stopRecording();
    }

    public void startRecording() throws Exception {
        File file = new File(System.getProperty(USER_DIR) + File.separator + DOWNLOADED_FILES_FOLDER);

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        int width = screenSize.width;
        int height = screenSize.height;

        Rectangle captureSize = new Rectangle(0, 0, width, height);

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

        this.screenRecorder = new SpecializedScreenRecorder(gc, captureSize, 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, file, "MyVideo");
        this.screenRecorder.start();

    }

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

Die SpecializedScreenRecorder-Klasse erweitert die ScreenRecorder-Klasse:

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;
import org.monte.screenrecorder.ScreenRecorder;

public class SpecializedScreenRecorder extends ScreenRecorder {

    private String name;

    public SpecializedScreenRecorder(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));
    }
}

Maven-Import:

    <dependency>
        <groupId>org.seleniumhq.Selenium</groupId>
        <artifactId>Selenium-server</artifactId>
        <version>3.5.3</version>
        <exclusions>
            <exclusion>
                <groupId>com.codeborne</groupId>
                <artifactId>phantomjsdriver</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

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

    <!-- guava -->
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>${guava.version}</version>
    </dependency>

ACHTUNG: Wenn Sie dies unter Unix ohne GUI verwenden, haben Sie diesen Fehler:

No X11 DISPLAY variable was set, but this program performed an operation which requires it.

Ich suche das Xvfb Plugin für Jenkins und Travis-ci und bearbeite diesen Beitrag erneut.

EDIT 1:

Wenn Sie dies unter Unix ohne GUI verwenden, können Sie das Plugin Jenkins + Xvfb verwenden.

5
sgrillon

Sie können sich diese Bibliothek von Sergey Pirogov ansehen.

3
Oleksii

Sie könnten versuchen, entweder Selenium-Grid-Extras oder Zalenium zu verwenden.
Beide basieren auf Webdriver und führen die Aufzeichnung automatisch durch.

2