[Bài 25] Chụp screenshot sau khi run test trong selenium webdriver

I. Mở đầu

Chụp ảnh màn hình là 1 trong những phần advance của selenium webdriver, đối với mình thì nó không quá quan trọng nhưng có thể đối với bạn nó lại là thứ cần thiết, nên hôm nay mình viết thêm về nó. Cái hướng dẫn dưới đây có thể nó sẽ không giống với những gì được chia sẽ trên mạng ở 1 vài điểm nhỏ, nhưng mình tin là sẽ hữu ích hơn là chỉ follow 100% những gì của các anh zai nước ngoài viết.

II. Nội dung chính

1. Class chụp ảnh màn hình:

Vì chụp ảnh là 1 phần tách riêng, nó không liên quan gì đến quá trình test cũng những là logic của app nên ta sẽ đặt nó ở trong package utilities. Bạn cũng nên tạo ra 1 folder để chứa những screenshot, ở đây mình đặt là img.

package utilities;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;

public class Screenshot {

	Generator gen;
	WebDriver driver;

	public Screenshot(Generator gen, WebDriver driver) {
		this.gen = gen;
		this.driver = driver;
	}

	public void takeScreenshot(String filename) throws IOException {
		String fileName = filename + "-" + gen.getTimeInFormat() + ".png";
		String directory = Links.PATH_TO_IMG;

		File sourceFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
		FileUtils.copyFile(sourceFile, new File(directory + fileName));
	}
}

Trong đó:

String fileName = filename + gen.getTimeInFormat() + ".png"

Đặt tên cho file ảnh, gồm có tên file + time + extension

  • Tên file chính là tên của method Test, ở dưới mình sẽ hướng dẫn cách truyền tên của method Test.
  • Time để tránh việc trùng tên file
  • Extention là file có đuôi là .png
String directory = Links.PATH_TO_IMG

Đây là nơi để lưu file ảnh, chỗ này mình làm giống với bài 23, đọc file excel. Các bạn có thể xem lại.

package utilities;

import java.io.File;

public class Links {
	
	public static final String PATH_TO_IMG = System.getProperty("user.dir") + File.separator + "img" + File.separator;
}
File sourceFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(sourceFile, new File(directory + fileName));

Chụp ảnh và lưu ảnh vào trong folder img ở project.

2. Chọn nơi để thực hiện việc chụp ảnh:

Bạn có thể trigger việc chụp ảnh ở bất cứ nơi nào bạn muốn, nhưng để tránh việc phải viết quá nhiều, mình chỉ chụp ảnh sau khi run xong test, ở chỗ @AfterMethod.

Ngoài ra thì method test của mình cũng nhiều nên mình chỉ muốn chụp ảnh cho các Test fail, mình sẽ không chụp cho method pass nữa.

Mình sẽ implement như sau:

package tests;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;

import utilities.Generator;
import utilities.Links;
import utilities.Screenshot;

public class BaseTest {

	...
	Screenshot screenshot;

	@BeforeMethod
	public void setUp() {
		...
		screenshot = new Screenshot(gen, driver);
	}

	@AfterMethod
	public void tearDown(ITestResult testResult) throws IOException {
		if (testResult.getStatus() == ITestResult.FAILURE) {
			screenshot.takeScreenshot(testResult.getName());
		}
		driver.quit();
	}
}

Trong đó:

  • Mình sử dụng Interface ITestResult của TestNG để có thể dễ dàng lấy được tên của method Test, cũng như check được xem kết quả của Test là Pass hay Fail.
  • Chỉ khi nào fail thì mình sẽ gọi có function chụp screenshot với tham số đầu vào chính là tên của Method Test.

Demo: sau khi mình run thử Test thì sẽ có kết quả như sau:

III. Tổng kết

Các bạn sẽ thấy mình sửa 1 số chỗ với các bài hướng dẫn trên mạng để phù hợp với việc viết test trong các dự án.

  • Không fixed cứng đường dẫn đến folder lưu ảnh –> không save được ảnh khi run ở 2 máy khác nhau.
  • Lấy tên ảnh theo tên method Test + time –> không bị lưu ảnh trùng nhau.

Bài đến đây là hết, có điểm nào chưa hiểu thì hãy comment xuống phía dưới nhé. Thanks!

5 1 vote
Article Rating
Subscribe
Notify of
guest
22 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
trackback

[…] ← Previous Next → […]

tuan anh
tuan anh
5 years ago

Tiếp đi bạn ơi

Đoán Xem
Đoán Xem
5 years ago
Reply to  Giang Nguyen

lót dép hóng

Phulikely
Phulikely
4 years ago

Cam on Giang

Minh da hoc duoc rat nhieu tu nhung bai viet cua ban.

Phulikely
Phulikely
4 years ago
Reply to  Phulikely

Mong cho nhung bai viet moi cua Giang

Ni
Ni
4 years ago

Generator.java viết gì vậy anh ơi?

Khánh
Khánh
4 years ago

Bài học hay quá anh, không biết là anh còn viết thêm nữa hay tới bài 25 này là dừng rồi. Hy vọng anh ra bài mới với các trường hợp testcase phức tạp 😀

Minh
Minh
4 years ago

String fileName = filename + gen.getTimeInFormat() + “.png”

anh ơi em copy doan code trên mà nó báo lỗi ở chỗ getTimeInFormat. có phải em inport thiếu thư viện nào không cho em hỏi làm sao fix nó ạ.
em đang dùng maven project thì in port Repository nào ạ.

Em cảm ơn anh!

Hoàng Thị Hiên
Hoàng Thị Hiên
4 years ago

Anh ơi, em chờ bài viết tiếp theo của anh ạ. Cảm ơn anh rất nhiều về những kiến thức mà anh chia sẻ ạ. Nhờ nó mà em có động lực để tìm hiểu Automation.

trienkhaiweb
4 years ago

cảm ơn bác rất nhiều vì những chia sẻ cho cộng đồng !

Ngoc Anh
Ngoc Anh
3 years ago

@BeforeMethod
public void setUp() {

screenshot = new Screenshot(gen, driver);
}
Anh cho em hỏi ở bước này báo lỗi gen cannot be resolved to a variable trong khi ở class Screenshot đã khai báo rồi ạ.
Em cảm ơn anh

duong pham
duong pham
3 years ago

Anh em còn mu muội bác đưa lên github anh em downloa về vọc cho chuẩn.
Chủ đề Excel hay Word bác làm kĩ hơn 2-3 phát, vì test case anh em hay viết file này.