SELENIUM Bài 10: Chụp ảnh màn hình trong Selenium

  

I. Tại sao chúng ta phải chụp ảnh lại màn hình.

Chúng ta chụp ảnh màn hình khi chúng ta cần chứng cứ cho các test của chúng ta, nhiều khi khách hàng yêu cầu chúng ta chụp lại ảnh màn hình khi mà test case bị FAIL, hoặc chúng ta chụp ảnh màn hình làm chứng cứ cứ cho đội dev không cãi mỗi khi log bug.

Hình 1: Chụp ảnh màn hình trong Selenium

II. Cách chụp ảnh màn hình

Để chụp ảnh màn hình chúng ta sẽ dùng class TakesScreenshot của selenium

public void testTakesScreenshot()

{

    try {

// Đầu tiên chúng ta sẽ tạo ra một file ép kiểu driver thành TakesScreenshot sau đó sẽ gọi hàm getScreenhotAs() truyền vào đầu ra là 1 file

// Sau đó gọi đến FileUtils.copyFile() để copy cái source file này vào trong ổ cứng của chúng ta

        File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

        FileUtils.copyFile(scrFile, new File("c:\\tmp\\main_page.png"));

    } catch (Exception e) {

        e.printStackTrace();

    }

III. Cách chụp ảnh màn hình khi test case bị FAIL

Đề bài: Áp dụng Data Provider để đọc Data từ trong file excel sau đó chụp ảnh màn hình test case bị fail

Bước 1: Tạo 1 project mới tên là BlogTestNGFirstTest, import toàn bộ thư viện của selenium, apache poi vào build path, ngoài ra còn phải add thêm file jquery-3.5.1.jar và commons-io-2.9.0.jar để tránh bị báo lỗi và dùng thứ liên quan đến file, các bạn có thể download file này TẠI ĐÂY, trong project này sẽ tạo các package là tests và utils chứa 2 file Constants.java và ExcelUtils.java, các bạn có thể down load 2 file utils đó TẠI ĐÂY 

Bước 2: Chuột phải vào package tests chọn New - Other - TestNG Class - Next - Điền class name là TakeScreenShotTest - Tích chọn anotation @BeforeMethod, @AfterMethod  và Data Provider - XML Suite file: điền TakeScreenShotTest - Nhấn Finish

Bước 3: Tạo 2 Folder là Data và Screenshots,  trong folder Data sẽ chứa file LoginTest.xlsx nội dung file sẽ có chứa dữ liệu username, password, kết quả mong muốn và kết quả thực tế, còn folder Screenshots để chứa ảnh chụp màn hình test case FAIL. Tài khoản này các bạn có thể tự tạo hoặc, các bạn có thề tải file chưa tài khoản đó TẠI ĐÂY

Bước 4: Code theo framework TestNG và đây là nội dung file code và giải thích File TakeScreenShotTest.java

//Các phần của Data Provider thì không cần giải thích lại, chúng ta sẽ chỉ giải thích những phần liên quan đến chụp ảnh màn hình

package tests;

import org.testng.annotations.Test;

import utils.Constants;
import utils.ExcelUtils;

import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;

import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

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.testng.Assert;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;

public class TakeScreenShotTest {
WebDriver driver;

@Test(dataProvider = "LoginDataExcel")
public void loginSuccessfulTest(String testcaseID, String username, String password, String expected)
throws Exception {
driver.findElement(By.className("login")).click();
driver.findElement(By.id("email")).sendKeys(username);
driver.findElement(By.id("passwd")).sendKeys(password);
driver.findElement(By.id("SubmitLogin")).click();
ExcelUtils excel1 = new ExcelUtils(Constants.DATA_LOGIN_PATH, Constants.DATA_LOGIN_SHEET);

try {
driver.findElement(By.className("logout")).click();
if (expected.equalsIgnoreCase("pass")) {
excel1.setCellData("pass", excel1.getRowContains(testcaseID, Constants.COL_LOGIN_TESTCASEID),
Constants.COL_LOGIN_RESULT);
} else {
excel1.setCellData("fail", excel1.getRowContains(testcaseID, Constants.COL_LOGIN_TESTCASEID),
Constants.COL_LOGIN_RESULT);
Assert.fail("Login successful but expected result is fail");
}
} catch (Exception e) {
if (expected.equalsIgnoreCase("fail")) {
excel1.setCellData("pass", excel1.getRowContains(testcaseID, Constants.COL_LOGIN_TESTCASEID),
Constants.COL_LOGIN_RESULT);
} else {
excel1.setCellData("fail", excel1.getRowContains(testcaseID, Constants.COL_LOGIN_TESTCASEID),
Constants.COL_LOGIN_RESULT);
Assert.fail("Login unsuccessful but expected result is pass");
}
}

}

//@BeforeMethod thường để setup các môi trường
@BeforeMethod
public void setUp() {
System.setProperty("webdriver.chrome.driver",
"D:\\Work\\Automation Test\\Selenium\\Tool\\Selenium\\Library\\Selenium-java-3.141.59 and Driver\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get(Constants.BASE_URL);
}

// @AfterMethod thường đưa vào các hàm teardown để giải phóng môi trường
//  Phần chụp ảnh màn hình test case bị FAIL sẽ được đưa vào hàm afterMethod() hàm này sẽ có tham số truyền vào là result với kiểu trả về là ITestResult
// Đầu tiên chúng ta sẽ khai báo điều kiện nếu test case FAIL thì sẽ chụp ảnh màn hình, để lấy được kết quả FAIL chúng ta sẽ dùng hàm geStattus() so sánh với  ITestResult.FAILURE, nếu giống nhau thì chúng ta sẽ chụp ảnh màn hình


@AfterMethod
public void afterMethod(ITestResult result) throws IOException {
if (result.getStatus()==ITestResult.FAILURE) {
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");

 
// Chúng ta sẽ tạo ra một đối tượng là dateFormat có định dạng yyyyMMddHHmmss
// Và một đối tượng cal, sau đó khi báo biến timestamp = dateFormat.format(cal.getTime());
// Nói chung mục đích của đoạn này là lấy ra cái khoảng thời gian chụp ảnh màn hình để gắn vào đuôi tên file cho các tên ảnh chụp file màn hình không bị trùng nhau.
Calendar cal = Calendar.getInstance();
String timestamp = dateFormat.format(cal.getTime());

// Chúng ta sẽ tạo ra một file ép kiểu driver thành TakesScreenshot sau đó sẽ gọi hàm getScreenhotAs() truyền vào đầu ra là 1 file

// Sau đó gọi đến FileUtils.copyFile() để copy cái source file này vào trong ổ cứng của chúng ta có đường dẫn và dạng tên file kiểu: Screenshot-+timestamp + .png

        File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(scrFile, new File("C:\\Users\\HienDV94\\eclipse-workspace\\BlogTestNGFirstTest\\Screenshots\\Screenshot-" +timestamp + ".png"));

}
driver.quit();
}

@DataProvider(name = "LoginDataExcel")
public Object[][] loadExcelData() throws Exception {
ExcelUtils excel = new ExcelUtils(Constants.DATA_LOGIN_PATH, Constants.DATA_LOGIN_SHEET);
return excel.getTableArray(4);// hàm getTableArray() load toàn bộ 4 cột

}

}
// Như vậy là xong, sau đó chạy testcase, nếu trong đó có 1 test case nào đó bị FAIL, selenium sẽ chụp lại ảnh màn hình và lưu vào thư mục Screenshots, chúng ta chỉ cần F5 lại thư mục đó sẽ thấy file ảnh chụp màn hình đã được tạo ra.

Giới thiệu về HIENDV94

Mình là Hiển. Đây là blog ghi chép lại những thứ mình trải qua và học được hàng ngày, mình luôn luôn muốn học hỏi để trau dồi kinh nghiệm, hoàn thiện bản thân. Rất mong được làm quen mọi người. Hãy kết bạn với mình qua Facebook các bạn nhé.

0 Bình luận:

Đăng nhận xét