[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!

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

  1. Pingback: [Bài 24] Sử dụng log4j để debug trong selenium webdriver | GiangTester Blog

  2. 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 😀

    • Cảm ơn em đã động viên. Do từ lâu rồi anh ko còn viết selenium webdriver nữa nên chắc series cũng sẽ dừng tại đây. Và mục đích của blog là giúp các bạn làm quen chứ ko phải đưa các bạn đến advance nên phần còn lại phụ thuộc vào sức lực của mỗi người thôi.
      Thay vì viết tiếp về selenium thì anh sẽ tiếp tục những phần khác như test API với rest-assured, các tool và các lý thuyết về automation. Hi vọng em vẫn tiếp tục theo dõi blog

  3. 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!

  4. 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.

    • Thanks em. Hi vọng những bài anh viết có ích cho em. Tuy nhiên, đừng trông chờ vào cái anh viết, hay tự mình tìm hiểu tiếp. Good luck!

Leave a Reply

Your email address will not be published. Required fields are marked *