Nội dung bài viết
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!
[…] ← Previous Next → […]
Tiếp đi bạn ơi
Dạo này mình đang làm cái khác nên chưa có thời gian viết tiếp, tầm nửa tháng nữa mới viết tiếp được.
lót dép hóng
Chịu =)))))
Cam on Giang
Minh da hoc duoc rat nhieu tu nhung bai viet cua ban.
Mong cho nhung bai viet moi cua Giang
Mình hiện tại ít làm với selenium nên không viết thêm được gì. Nhưng trong blog của mình còn nhiều phần khác, bạn có thể ngó qua. Thanks!
Generator.java viết gì vậy anh ơi?
Anh dùng để tạo dummy data thôi em. https://giangtester.com/bai-13-tao-dummy-data-va-su-dung-unit-test/
Nếu em ko muốn tự viết cái dummy data thì tìm lib ở trên mvn repo, chắc cũng có nhiều lắm.
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
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!
Cái đó a viết ở chỗ này: https://giangtester.com/bai-13-tao-dummy-data-va-su-dung-unit-test/
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!
cảm ơn bác rất nhiều vì những chia sẻ cho cộng đồng !
Thanks bạn!
@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
Em ơi, anh có mở lớp java cho tester đấy. Em có muốn đăng ký không? Lỗi cơ bản quá.
Trong java, mỗi biến đều phải có Type. Em chỉ viết thế kia, java ko hiểu biến screenshot của em là type gì.
1.Sửa screenshot là biến local:
Screenshot screenshot = new Screenshot(gen, driver)
2.hoặc sửa nó thành biến instance:
Screenshot screenshot;
@BeforeMethod
public void setUp() {
…
screenshot = new Screenshot(gen, driver);
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.
Mình viết lâu quá rồi, không biết source code nằm ở đâu nữa, để mình tìm lại.
Mình ko dùng excel hay word nên ko biết viết thêm cái gì. Sorry bạn.