Chào các bạn đã đến với chủ đề tiếp theo của mình. Hôm nay, mình sẽ tiếp tục hướng dẫn các bạn cách record lại video khi chạy automation test case trong Selenium Webdriver. Ở bài viết này, mình sẽ giới thiệu 2 thư viện để record video là Monte Media và ATU Test Recorder.
Nội dung
1. Record screen với thư viện Monte Media
1.1. Cài đặt thư viện
Đầu tiên, để cài đặt thư viện, các bạn hãy copy đoạn text sau và paste vào file POM.xml trong project của bạn
<!-- https://mvnrepository.com/artifact/com.github.stephenc.monte/monte-screen-recorder -->
<dependency>
<groupId>com.github.stephenc.monte</groupId>
<artifactId>monte-screen-recorder</artifactId>
<version>0.7.7.0</version>
</dependency>
1.2. Implement
Sau khi cài đặt xong, chúng ta bắt đầu code luôn nhé. Ở đây mình sẽ tạo 1 class riêng, ví dụ như RecordVideoByMonteScreenHelper. Mục đích của class này là để Record lại video và có thể sử dụng lại ở bất kỳ test case nào.
RecordVideoByMonteScreenHelper.java
package utilites;
import org.monte.media.Format;
import org.monte.media.FormatKeys;
import org.monte.media.Registry;
import org.monte.media.math.Rational;
import org.monte.screenrecorder.ScreenRecorder;
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import static org.monte.media.FormatKeys.*;
import static org.monte.media.VideoFormatKeys.*;
public class RecordVideoByMonteScreenHelper extends ScreenRecorder {
// ------Record with Monte Media library---------
public static ScreenRecorder screenRecorder;
public String name;
//Hàm xây dựng
public RecordVideoByMonteScreenHelper(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;
}
//Hàm này bắt buộc để ghi đè custom lại hàm trong thư viên viết sẵn
@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("dd-MM-yyyy_HH-mm-ss");
return new File(movieFolder,
name + "-" + dateFormat.format(new Date()) + "." + Registry.getInstance().getExtension(fileFormat));
}
// Hàm Start record video
public static void startRecord(String methodName) throws Exception {
//Tạo thư mục để lưu file video vào
File file = new File("./test-recordings/");
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();
screenRecorder = new RecordVideoByMonteScreenHelper(gc, captureSize,
new Format(MediaTypeKey, FormatKeys.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, methodName);
screenRecorder.start();
}
// Stop record video
public static void stopRecord() throws Exception {
screenRecorder.stop();
}
}
Sau khi implement class dùng chung xong, trong file test case, mình sẽ để hàm startRecord vào chổ @BeforeClass và stopRecord vào chổ @AfterClass. Ví dụ như sau:
package org.example.Topic43;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import utilites.RecordVideoByMonteScreenHelper;
import java.time.Duration;
public class RecordVideoByMonteScreen {
WebDriver driver;
@BeforeClass
public void beforeClass() throws Exception {
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
driver.manage().window().maximize();
// Gọi lại hàm startRecord
RecordVideoByMonteScreenHelper.startRecord("ManageDocument");
driver.get("http://the-internet.herokuapp.com/login");
}
@Test
public void TC_01_Register() throws InterruptedException {
// Input to username & password
driver.findElement(By.id("username")).sendKeys("tomsmith");
driver.findElement(By.id("password")).sendKeys("SuperSecretPassword!");
Thread.sleep(3000);
// Click login button
driver.findElement(By.xpath("//button[@type='submit']")).click();
Thread.sleep(3000);
// Get and verify welcome message
String welcomeMessage = driver.findElement(By.xpath("//h4")).getText();
Assert.assertEquals(welcomeMessage, "Welcome to the Secure Area. When you are done click logout below.");
Thread.sleep(3000);
}
@AfterClass
public void afterClass() throws Exception {
driver.quit();
// Gọi lại hàm startRecord
RecordVideoByMonteScreenHelper.stopRecord();
}
}
Sau khi chạy xong, thằng Monte sẽ xuất file video có đuôi là AVI và bỏ trong folder test-recordings
Lưu ý: khi các bạn mở file video lên xem, có thể bạn sẽ gặp lỗi không xem được. Lý do là vì thằng Windows Media Player không support 1 vài định dạng của file video. Vì thế, các bạn hãy cài đặt thêm K-Lite Codec Pack để xem video nha
2. Record screen với thư viện ATU Test Recorder
2.1. Cài đặt thư viện
Cách tiếp theo mình muốn giới thiệu ở đây là sử dụng thư viện ATU Test Recorder. Cách này thì Maven không có support, nên phải download trực tiếp về máy.
Các bạn down về tại đây nhé: ATUTestRecorder.jar
Tiếp theo, mình sẽ import nó vào project.
2.2. Code
Cũng tương tự như thằng Monte, mình cũng sẽ tạo 1 class riêng. Ví dụ như RecordVideoByATURecorderHelper.
RecordVideoByATURecorderHelper.java
package utilites;
import atu.testrecorder.ATUTestRecorder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class RecordVideoByATURecorderHelper {
public static ATUTestRecorder recorder;
static DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH-mm-ss");
static Date date = new Date();
public static void startRecordATU(String videoName) throws Exception {
recorder = new ATUTestRecorder("./test-recordings/", videoName + "-" + dateFormat.format(date), false);
recorder.start();
}
public static void stopRecordATU() throws Exception {
recorder.stop();
}
}
Nhìn thì nó có vẻ đơn giãn hơn thằng Monte đúng không?
Sau đó, trong file test case, mình sẽ để hàm startRecordATU vào chổ @BeforeClass và stopRecordATU vào chổ @AfterClass. Ví dụ như sau:
package org.example.Topic43;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import utilites.RecordVideoByATURecorderHelper;
import java.time.Duration;
public class RecordVideoByATURecorder {
WebDriver driver;
@BeforeClass
public void beforeClass() throws Exception {
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
driver.manage().window().maximize();
// Gọi lại hàm startRecord
RecordVideoByATURecorderHelper.startRecordATU("ManageDocument");
driver.get("http://the-internet.herokuapp.com/login");
}
@Test
public void TC_01_Register() throws InterruptedException {
// Input to username & password
driver.findElement(By.id("username")).sendKeys("tomsmith");
driver.findElement(By.id("password")).sendKeys("SuperSecretPassword!");
Thread.sleep(3000);
// Click login button
driver.findElement(By.xpath("//button[@type='submit']")).click();
Thread.sleep(3000);
// Get and verify welcome message
String welcomeMessage = driver.findElement(By.xpath("//h4")).getText();
Assert.assertEquals(welcomeMessage, "Welcome to the Secure Area. When you are done click logout below.");
Thread.sleep(3000);
}
@AfterClass
public void afterClass() throws Exception {
driver.quit();
// Gọi lại hàm startRecord
RecordVideoByATURecorderHelper.stopRecordATU();
}
}
Sau khi chạy xong, thằng ATU Test Recorder sẽ xuất file video có đuôi là MOV và bỏ trong folder test-recordings
3. Lời kết
Như vậy chúng ta đã tìm hiểu qua cách record video khi chạy automation test case. Các bạn hãy xem lại ví dụ trên và làm lại 1 lần nữa để hiểu bài hơn nhé. Mình hy vọng bài viết này sẽ hữu ích cho các bạn. Cảm ơn các bạn đã theo dõi bài viết của mình. Hẹn gặp lại các bạn ở những chủ đề tiếp theo.
Nguồn: