Skip to content

Commit c81372e

Browse files
committed
Bài 30 - Take Screenshot and Record video
1 parent 3bb6a76 commit c81372e

File tree

6 files changed

+206
-10
lines changed

6 files changed

+206
-10
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,6 @@ build/
4444
.classpath
4545
.idea/
4646
out/
47-
*.iml
47+
*.iml
48+
reports/
49+
report/

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@
6565
<version>2.15.0</version>
6666
</dependency>
6767

68+
<!-- https://mvnrepository.com/artifact/com.github.stephenc.monte/monte-screen-recorder -->
69+
<dependency>
70+
<groupId>com.github.stephenc.monte</groupId>
71+
<artifactId>monte-screen-recorder</artifactId>
72+
<version>0.7.7.0</version>
73+
</dependency>
74+
6875
</dependencies>
6976

7077
</project>
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package com.anhtester.helpers;
2+
3+
import com.anhtester.drivers.DriverManager;
4+
import org.monte.media.Format;
5+
import org.monte.media.Registry;
6+
import org.monte.media.math.Rational;
7+
import org.monte.screenrecorder.ScreenRecorder;
8+
import org.openqa.selenium.OutputType;
9+
import org.openqa.selenium.TakesScreenshot;
10+
import org.openqa.selenium.io.FileHandler;
11+
12+
import java.awt.*;
13+
import java.io.File;
14+
import java.io.IOException;
15+
import java.text.SimpleDateFormat;
16+
import java.util.Date;
17+
18+
import static org.monte.media.FormatKeys.*;
19+
import static org.monte.media.VideoFormatKeys.*;
20+
21+
public class CaptureHelper extends ScreenRecorder {
22+
23+
// Record with Monte Media library
24+
public static ScreenRecorder screenRecorder;
25+
public String name;
26+
27+
//Hàm xây dựng
28+
public CaptureHelper(GraphicsConfiguration cfg, Rectangle captureArea, Format fileFormat, Format screenFormat, Format mouseFormat, Format audioFormat, File movieFolder, String name) throws IOException, AWTException {
29+
super(cfg, captureArea, fileFormat, screenFormat, mouseFormat, audioFormat, movieFolder);
30+
this.name = name;
31+
}
32+
33+
//Hàm này bắt buộc để ghi đè custom lại hàm trong thư viên viết sẵn
34+
@Override
35+
protected File createMovieFile(Format fileFormat) throws IOException {
36+
37+
if (!movieFolder.exists()) {
38+
movieFolder.mkdirs();
39+
} else if (!movieFolder.isDirectory()) {
40+
throw new IOException("\"" + movieFolder + "\" is not a directory.");
41+
}
42+
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH-mm-ss");
43+
return new File(movieFolder, name + "-" + dateFormat.format(new Date()) + "." + Registry.getInstance().getExtension(fileFormat));
44+
}
45+
46+
// Start record video
47+
public static void startRecord(String methodName) {
48+
//Tạo thư mục để lưu file video vào
49+
File file = new File(SystemHelper.getCurrentDir() + PropertiesHelper.getValue("VIDEO_RECORD_PATH"));
50+
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
51+
int width = screenSize.width;
52+
int height = screenSize.height;
53+
54+
Rectangle captureSize = new Rectangle(0, 0, width, height);
55+
56+
GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
57+
try {
58+
screenRecorder = new CaptureHelper(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, methodName);
59+
screenRecorder.start();
60+
} catch (IOException e) {
61+
throw new RuntimeException(e);
62+
} catch (AWTException e) {
63+
throw new RuntimeException(e);
64+
}
65+
}
66+
67+
// Stop record video
68+
public static void stopRecord() {
69+
try {
70+
screenRecorder.stop();
71+
} catch (IOException e) {
72+
throw new RuntimeException(e);
73+
}
74+
}
75+
76+
77+
//Tạo format ngày giờ để xíu gắn dô cái name của screenshot hoặc record video không bị trùng tên (không bị ghi đè file)
78+
private static SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH-mm-ss");
79+
80+
public static void captureScreenshot(String screenshotName) {
81+
try {
82+
// Tạo tham chiếu đối tượng của TakesScreenshot với dirver hiện tại
83+
TakesScreenshot ts = (TakesScreenshot) DriverManager.getDriver();
84+
// Gọi hàm getScreenshotAs để chuyển hóa hình ảnh về dạng FILE
85+
File source = ts.getScreenshotAs(OutputType.FILE);
86+
//Kiểm tra folder nếu không tồn tại thì tạo folder
87+
File theDir = new File(SystemHelper.getCurrentDir() + PropertiesHelper.getValue("SCREENSHOT_PATH"));
88+
if (!theDir.exists()) {
89+
theDir.mkdirs();
90+
}
91+
// Chổ này đặt tên thì truyền biến "screenName" gán cho tên File chụp màn hình
92+
FileHandler.copy(source, new File(SystemHelper.getCurrentDir() + PropertiesHelper.getValue("SCREENSHOT_PATH") + File.separator + screenshotName + "_" + dateFormat.format(new Date()) + ".png"));
93+
System.out.println("Screenshot taken: " + screenshotName);
94+
System.out.println("Screenshot taken current URL: " + DriverManager.getDriver().getCurrentUrl());
95+
} catch (Exception e) {
96+
System.out.println("Exception while taking screenshot: " + e.getMessage());
97+
}
98+
}
99+
100+
public static void takeScreenshot(String screenshotName) {
101+
// Tạo tham chiếu của TakesScreenshot
102+
TakesScreenshot ts = (TakesScreenshot) DriverManager.getDriver();
103+
// Gọi hàm để chụp ảnh màn hình - getScreenshotAs
104+
File source = ts.getScreenshotAs(OutputType.FILE);
105+
// Kiểm tra folder tồn tại. Nếu không thì tạo mới folder theo đường dẫn
106+
File theDir = new File(SystemHelper.getCurrentDir() + PropertiesHelper.getValue("SCREENSHOT_PATH"));
107+
if (!theDir.exists()) {
108+
theDir.mkdirs(); //Tạo mới thư mục
109+
}
110+
// Lưu file ảnh với tên cụ thể vào đường dẫn
111+
try {
112+
FileHandler.copy(source, new File(SystemHelper.getCurrentDir() + PropertiesHelper.getValue("SCREENSHOT_PATH") + screenshotName + ".png"));
113+
System.out.println("Take screenshot " + screenshotName + " successfully.");
114+
} catch (IOException e) {
115+
System.out.println("ERROR. Can not Take screenshot " + screenshotName + ".");
116+
e.printStackTrace();
117+
}
118+
}
119+
120+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.anhtester.Bai30_TakeScreenshot_RecordVideo;
2+
3+
import com.anhtester.Bai26_CustomDriverParallelExecution.pages.LoginPage;
4+
import com.anhtester.common.BaseTest;
5+
import com.anhtester.helpers.CaptureHelper;
6+
import com.anhtester.helpers.ExcelHelper;
7+
import org.testng.annotations.Test;
8+
9+
public class DemoTakeScreenshot extends BaseTest {
10+
11+
LoginPage loginPage;
12+
13+
@Test
14+
public void testLoginCRM_Success() {
15+
System.out.println("=====testLoginCRM_Success=====");
16+
CaptureHelper.startRecord("testLoginCRM_Success");
17+
18+
loginPage = new LoginPage();
19+
20+
ExcelHelper excelHelper = new ExcelHelper();
21+
excelHelper.setExcelFile("src/test/resources/testdata/LoginData.xlsx", "Sheet1");
22+
23+
loginPage.loginCRM(
24+
excelHelper.getCellData("EMAIL", 1),
25+
excelHelper.getCellData("PASSWORD", 1)
26+
);
27+
28+
//CaptureHelper.takeScreenshot("testLoginCRM_Success");
29+
30+
//CaptureHelper.stopRecord();
31+
32+
loginPage.verifyLoginSuccess();
33+
34+
}
35+
36+
@Test
37+
public void testLoginCRM_Fail() {
38+
System.out.println("=====testLoginCRM_Success=====");
39+
CaptureHelper.startRecord("testLoginCRM_Fail");
40+
41+
loginPage = new LoginPage();
42+
43+
ExcelHelper excelHelper = new ExcelHelper();
44+
excelHelper.setExcelFile("src/test/resources/testdata/LoginData.xlsx", "Sheet1");
45+
46+
loginPage.loginCRM(
47+
excelHelper.getCellData("EMAIL", 2),
48+
excelHelper.getCellData("PASSWORD", 2)
49+
);
50+
51+
//CaptureHelper.takeScreenshot("testLoginCRM_Fail");
52+
53+
//CaptureHelper.stopRecord();
54+
55+
loginPage.verifyLoginSuccess();
56+
57+
}
58+
59+
}

src/test/java/com/anhtester/common/BaseTest.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
package com.anhtester.common;
22

33
import com.anhtester.drivers.DriverManager;
4+
import com.anhtester.helpers.CaptureHelper;
45
import com.anhtester.helpers.PropertiesHelper;
6+
import com.anhtester.keywords.WebUI;
57
import org.openqa.selenium.WebDriver;
68
import org.openqa.selenium.chrome.ChromeDriver;
79
import org.openqa.selenium.edge.EdgeDriver;
810
import org.openqa.selenium.firefox.FirefoxDriver;
11+
import org.testng.ITestResult;
912
import org.testng.annotations.*;
1013

1114
public class BaseTest {
1215

1316
@BeforeSuite
14-
public void beforeSuite(){
15-
//Chỉ cần load 1 lần là đã lưu giá trị vào bộ nhớ tạm, áp dụng cho toàn phiên chạy
17+
public void beforeSuite() {
1618
PropertiesHelper.loadAllFiles();
1719
}
1820

1921
@BeforeMethod
2022
@Parameters({"browser"})
2123
public void createDriver(@Optional("chrome") String browserName) {
22-
WebDriver driver = setupBrowser(browserName); //Khởi tạo loại browser và gán vào driver
23-
//new WebUI(driver);
24-
DriverManager.setDriver(driver); //Mang giá trị driver đã khởi tạo vào trong ThreadLocal
24+
WebDriver driver = setupBrowser(browserName);
25+
DriverManager.setDriver(driver);
2526
}
2627

27-
//Viết hàm trung gian để lựa chọn Browser cần chạy với giá trị tham số "browser" bên trên truyền vào
28-
public WebDriver setupBrowser(String browserName){
28+
public WebDriver setupBrowser(String browserName) {
2929
WebDriver driver;
3030
switch (browserName.trim().toLowerCase()) {
3131
case "chrome":
@@ -44,7 +44,6 @@ public WebDriver setupBrowser(String browserName){
4444
return driver;
4545
}
4646

47-
// Viết các hàm khởi chạy cho từng Browser đó
4847
private WebDriver initChromeDriver() {
4948
WebDriver driver;
5049
System.out.println("Launching Chrome browser...");
@@ -70,7 +69,14 @@ private WebDriver initFirefoxDriver() {
7069
}
7170

7271
@AfterMethod
73-
public void closeDriver() {
72+
public void closeDriver(ITestResult result) {
73+
if (result.getStatus() == ITestResult.FAILURE) {
74+
CaptureHelper.takeScreenshot(result.getName());
75+
}
76+
77+
WebUI.sleep(1);
78+
CaptureHelper.stopRecord();
79+
7480
DriverManager.quit();
7581
}
7682
}

src/test/resources/configs/configs.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ email=admin@example.com
44
message=Add customer successfully
55
password=123456
66
url=https\://crm.anhtester.com/admin/authentication
7+
SCREENSHOT_PATH = reports/screenshots/
8+
VIDEO_RECORD_PATH = reports/videorecords/

0 commit comments

Comments
 (0)