NỘI DUNG BÀI HỌC

✅ Đọc data config từ Properties file trong Selenium Java
✅ Cách ghi data vào Properties file

🔆 Kế thừa các phần trước là Page Object Model và TestNG Framework


1. Tạo tệp có phần mở rộng là .properties

Trong dự án của bạn, tạo một tập tin có tên là configs với phần mở rộng là .properties

Nhấp chuột phải vào folder nào đó (trong hình là resources) và tạo một tệp config.properties

Lưu ý: nên lưu file properties ở package test (src/test/)

Đây là bước đầu tiên chúng ta sẽ thực hiện bằng cách khởi tạo giá trị trong file properties theo cấu trúc "key"="value" như bên dưới.

[Selenium Java] Bài 27: Đọc data test từ Properties file trong Selenium Java | Anh Tester

browser = chrome
url = https://crm.anhtester.com/admin/authentication
email = admin@example.com
password = 123456


Khi mình gọi ra thì mình gọi cái Key chứ không gọi Value nhen.


2. Tạo một class Java để xây dựng hàm Get và Set properties

Tạo một class SystemHelper đặt trong package helpers để lưu các hàm xử lý bổ trợ cho các class khác.

Dùng File.separator thay thế cho ký tự đường dẫn trong máy tính, nó tự hiểu Window và MacOS hay Linux luôn.

public static String getCurrentDir() {
    String current = System.getProperty("user.dir") + File.separator;
    return current;
}


[Selenium Java] Bài 27: Đọc data test từ Properties file trong Selenium Java | Anh Tester


Tạo thêm một lớp mới có tên là "PropertiesHelper" . Có thể đặt nó ở package helpers luôn


Để đọc và ghi trên
tệp .properties thì mình viết một đoạn mã đơn giản tuân theo quy tắc đọc file trong Java

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Properties;

public class PropertiesHelper {

    private static Properties properties;
    private static String linkFile;
    private static FileInputStream file;
    private static FileOutputStream out;
    private static String relPropertiesFilePathDefault = "src/test/resources/configs/config.properties";

    public static Properties loadAllFiles() {
        LinkedList<String> files = new LinkedList<>();
        // Add tất cả file Properties vào đây theo mẫu
        files.add("src/test/resources/configs/config.properties");
//        files.add("src/test/resources/configs/local.properties");
//        files.add("src/test/resources/configs/production.properties");

        try {
            properties = new Properties();

            for (String f : files) {
                Properties tempProp = new Properties();
                linkFile = SystemHelper.getCurrentDir() + f;
                file = new FileInputStream(linkFile);
                tempProp.load(file);
                properties.putAll(tempProp);
            }
            return properties;
        } catch (IOException ioe) {
            return new Properties();
        }
    }

    public static void setFile(String relPropertiesFilePath) {
        properties = new Properties();
        try {
            linkFile = SystemHelper.getCurrentDir() + relPropertiesFilePath;
            file = new FileInputStream(linkFile);
            properties.load(file);
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void setDefaultFile() {
        properties = new Properties();
        try {
            linkFile = SystemHelper.getCurrentDir() + relPropertiesFilePathDefault;
            file = new FileInputStream(linkFile);
            properties.load(file);
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String getValue(String key) {
        String value = null;
        try {
            if (file == null) {
                properties = new Properties();
                linkFile = SystemHelper.getCurrentDir() + relPropertiesFilePathDefault;
                file = new FileInputStream(linkFile);
                properties.load(file);
                file.close();
            }
            // Lấy giá trị từ file đã Set
            value = properties.getProperty(key);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return value;
    }

    public static void setValue(String key, String keyValue) {
        try {
            if (file == null) {
                properties = new Properties();
                file = new FileInputStream(SystemHelper.getCurrentDir() + relPropertiesFilePathDefault);
                properties.load(file);
                file.close();
                out = new FileOutputStream(SystemHelper.getCurrentDir() + relPropertiesFilePathDefault);
            }
            //Ghi vào cùng file Prop với file lấy ra
            out = new FileOutputStream(linkFile);
            System.out.println(linkFile);
            properties.setProperty(key, keyValue);
            properties.store(out, null);
            out.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

}


[Selenium Java] Bài 27: Đọc data test từ Properties file trong Selenium Java | Anh Tester

- Hàm loadAllFiles() để khởi tạo giá trị cho nhiều file properties setup sẵn trong hàm.

- Hàm
setFile() để khởi tạo giá trị cho đối tượng properties của class Properties với đường dẫn đến file configs.properties trên.

- Hàm setDefaultFile() để khởi tạo giá trị cho đối tượng properties của class Properties với đường dẫn có sẵn trong class.

- Hàm getValue() để đọc file đã setup bên trên và lấy giá trị ra theo Key trong file đã tạo.

- Hàm setValue() để gán ngược giá trị vói key tương ứng vào lại file properties trên.

Chúng ta có thể chỉ định file properties default để khi nếu không có chỉ định cụ thể thì nó sẽ hiểu là lấy ra file default này:

private static String relPropertiesFilePathDefault = "src/test/resources/configs/config.properties";


Rồi tiếp theo là gọi hàm ra sử dụng thôi nào

3. Cách đọc giá trị từ properties file

Các bạn nhìn thấy là 3 cái hàm trong class PropertiesHelper là trạng thái static nên khi mình gọi thì lấy luôn cái tên class để chấm gọi chứ không cần khởi tạo đối tượng của class.

Đầu tiên phải gọi hàm loadAllFiles() để khởi tạo tất cả các file properties chỉ định trong chính hàm này

PropertiesHelper.loadAllFiles();

Còn nếu muốn chỉ định ở file cụ thể thì gọi hàm setFile(file path)

Trong TestNG nên là cái này để ở @BeforeClass hoặc @BeforeTest hay @BeforeSuite gì cũng được. Nghĩa là cho nó chạy trước cái hàm getValue() là được.

Tiếp theo muốn ĐỌC giá trị từ file properties thì gọi hàm getValue()

PropertiesHelper.getValue("browser")

Cái giá trị "browser" là cái key trong file properties đó nhen. PHÂN BIỆT HOA THƯỜNG

Vậy thì khi gọi ra nó sẽ trả về hết quả kiểu String thôi. Cụ thể cái giá trị của key "browser" là "chrome" đã tạo bên trên nên nó sẽ trả về giá trị là "chrome"

Ví dụ: mình gọi hàm signIn của phần bài trước để truyền giá trị emailpassword từ properties file

import anhtester.com.pages.SignInPage;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class PropertiesTest {

    private WebDriver driver;
    private SignInPage signInPage;

    @BeforeClass
    public void createDriver() {
        // Gọi hàm để khởi tạo file properties
        PropertiesHelper.loadAllFiles();

        // Đọc data từ file properties với key là "browser"
        driver = new SetupBrowser().createBrowser(PropertiesHelper.getValue("browser"));
    }

    @Test
    public void signinCRM(){
        signInPage = new SignInPage(driver);
        driver.get("https://crm.anhtester.com");

        // Đọc data từ file properties
        signInPage.signIn(PropertiesHelper.getValue("email"),PropertiesHelper.getValue("password"));

    }

    @AfterClass
    public void closeDriver() {
        driver.quit();
    }
}


Bạn muốn giá trị của các key là gì thì vào file đổi thôi rồi chạy lại là xong.

4. Cách ghi giá trị vào properties file

Trước tiên, các bạn cần chỉ định file cụ thể cần ghi vào thông qua hàm setFile. Chúng ta sử dụng đường dẫn tương đối trong project hiện tại.

Tiếp theo, các bạn dùng hàm setValue để truyền giá trị theo từng key là xong.

Ví dụ: tạo hàm thêm test case mới là signinCRM_AfterSetValue() để set giá trị xong chạy lại cái signin bên trên xem nó khác giá trị không nhen.

import anhtester.com.pages.SignInPage;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class PropertiesTest {

    private WebDriver driver;
    private SignInPage signInPage;

    @BeforeClass
    public void createDriver() {
        // Gọi hàm để khởi tạo file properties
        PropertiesHelper.loadAllFiles();

        // Đọc data từ file properties với key là "browser"
        driver = new SetupBrowser().createBrowser(PropertiesHelper.getValue("browser"));
    }

    @Test
    public void signinCRM(){
        signInPage = new SignInPage(driver);
        driver.get("https://crm.anhtester.com");

        // Đọc data từ file properties
        signInPage.signIn(PropertiesHelper.getValue("email"),PropertiesHelper.getValue("password"));

    }

    @Test
    public void signinCRM_AfterSetValue(){
        signInPage = new SignInPage(driver);
        driver.get("https://crm.anhtester.com");

        //Set giá trị vào file properties
        PropertiesHelper.setValue("email", "admin@mailinator.com");

        // Đọc data từ file properties
        signInPage.signIn(PropertiesHelper.getValue("email"),PropertiesHelper.getValue("password"));

    }

    @AfterClass
    public void closeDriver() {
        driver.quit();
    }
}


Khi đó thì thấy là từ email là "teamleader@mailinator.com" nó chuyển thành admin@mailinator.com rồi đúng không 😜

Nếu mà key bị trùng thì nó ghi đè giá trị.

Còn nếu không trùng key thì nó tạo ra thêm 1 dòng mới với key mới và giá trị tương ứng

Ví dụ: mình set 1 biến mới là "pin" với giá trị là "123"

PropertiesHelper.setValue("pin", "123");


Lưu ý: khi ghi vào thì trương hợp có nhiều file thì nó sẽ ghi vào file cuối cùng. Nên thường chúng ta cần chỉ định file cụ thể cần ghi trước ghi set data. Hoặc chỉ dùng 1 file config.


5. Các vị trí dùng config data

WebUI keyword: config các thông số thời gian

private static int TIMEOUT = Integer.parseInt(PropertiesHelper.getValue("EXPLICIT_WAIT_TIMEOUT"));
private static int PAGE_LOAD_TIMEOUT = Integer.parseInt(PropertiesHelper.getValue("PAGE_LOAD_TIMEOUT"));
private static double STEP_TIME = Double.parseDouble(PropertiesHelper.getValue("STEP_TIME"));


BaseTest: config loại browser và thời gian timeout nếu có

public class BaseTest {

    @BeforeMethod
    @Parameters({"browserName"})
    public void createDriver(@Optional("chrome") String browserName) {

        WebDriver driver;

        if(PropertiesHelper.getValue("BROWSER").isEmpty() || PropertiesHelper.getValue("BROWSER") == null){
            browserName = browserName;
        }else {
            browserName = PropertiesHelper.getValue("BROWSER");
        }

        switch (browserName.trim().toLowerCase()) {
            case "chrome":
                System.out.println("Launching Chrome browser...");
                driver = new ChromeDriver();
                break;
            case "firefox":
                System.out.println("Launching Firefox browser...");
                driver = new FirefoxDriver();
                break;
            case "edge":
                System.out.println("Launching Edge browser...");
                driver = new EdgeDriver();
                break;
            default:
                System.out.println("Browser: " + browserName + " is invalid, Launching Chrome as browser of choice...");
                driver = new ChromeDriver();
        }

        DriverManager.setDriver(driver); //Set to ThreadLocal

        DriverManager.getDriver().manage().window().maximize();
        DriverManager.getDriver().manage().timeouts().pageLoadTimeout(Duration.ofSeconds(Long.parseLong(PropertiesHelper.getValue("PAGE_LOAD_TIMEOUT"))));
    }

    @AfterMethod
    public void closeDriver() {
        DriverManager.quit();
    }

}

Teacher

Teacher

Anh Tester

Software Quality Engineer

Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu

Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học