Chào các bạn đã đến với chủ đề tiếp theo của mình. Để tiếp tục chuỗi bài về Selenium Weddriver, hôm nay, mình sẽ tiếp tục giới thiệu đến các bạn cách chụp screenshot sau khi run xong automation test case. Ở bài viết này, mình sẽ qua nội dung như sau:
Nội dung
1. Mở đầu
Chụp ảnh màn hình là 1 trong những phần advance của selenium webdriver. Khi mình mới bắt đầu học automation, thì việc này không quá quan trọng. Vì khi học, mình chỉ quan tâm đến việc làm sao cho code mình có thể chạy được và kết quả run là pass. Với lại, khi mới bắt đầu học, mình chỉ làm 1 vài test case riêng lẻ. Nhưng khi làm việc trong các project lớn, thì việc này lại khá là hữu ích. Giả sử như trong project có tầm khoảng 1000 test cases, khi bạn run regression xong, lúc kiểm tra kết quả thì thấy bị fail khá nhiều. Thông thường thì mình sẽ check log của report xem bị fail ở step nào, nhưng rất khó hình dung trên UI nó bị gì. Tuy nhiên, nếu có screenshot được đính kèm vào trong report, thì việc đoán lỗi sẽ dễ dàng hơn rất nhiều.
2. Nội dung chính
2.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à image.
package utilites;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ScreenShot {
public void takeScreenshot(WebDriver driver, String filename) throws IOException {
String timeStamp = new SimpleDateFormat("dd-MM-yyyy_HH.mm.ss").format(new Date());
String fileName = filename + "-" + timeStamp + ".png";
String directory = System.getProperty("user.dir") + File.separator + "image" + File.separator;
File sourceFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(sourceFile, new File(directory + fileName));
}
}
Trong đó:
String fileName = filename + "-" + timeStamp + ".png";
Đặt tên cho file ảnh, gồm có tên file + timeStamp + 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.
- timeStamp để tránh việc trùng tên file
- Extention là file có đuôi là .png
Đoạn code sau là nơi để lưu file ảnh
String directory = System.getProperty("user.dir") + File.separator + "image" + File.separator;
Đoạn code tiếp theo mình sẽ chụp ảnh và lưu ảnh vào trong folder image của project
File sourceFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(sourceFile, new File(directory + fileName));
2.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 org.example.Topic42;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.testng.Assert;
import org.testng.ITestResult;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import utilites.ScreenShot;
import java.io.IOException;
import java.time.Duration;
public class TakeScreenShot {
WebDriver driver;
@BeforeClass
public void beforeClass() {
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
driver.manage().window().maximize();
driver.get("http://the-internet.herokuapp.com/login");
}
@Test
public void TC_01_Register() {
// Input to username & password
driver.findElement(By.id("username")).sendKeys("tomsmith");
driver.findElement(By.id("password")).sendKeys("SuperSecretPassword!");
// Click login button
driver.findElement(By.xpath("//button[@type='submit']")).click();
// Get welcome message
String welcomeMessage = driver.findElement(By.xpath("//h4")).getText();
// Ở step này, mình sẽ cố tình Fail để chụp màn hình lại
Assert.assertEquals(welcomeMessage, "Take screenshot.");
}
@AfterMethod
public void tearDown(ITestResult testResult) throws IOException {
ScreenShot screenshot = new ScreenShot();
if (testResult.getStatus() == ITestResult.FAILURE) {
screenshot.takeScreenshot(driver, testResult.getName());
}
}
@AfterClass
public void afterClass() {
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:
Lúc này, các bạn sẽ thấy màn hình sẽ được chụp lại và lưu folder image
3. Lời kết
Như vậy chúng ta đã tìm hiểu qua cách chụp screenshot sau khi run xong 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:
https://giangtester.com/bai-25-chup-screenshot-sau-khi-run-test-trong-selenium-webdriver/