Selenium Khung: Dữ liệu, Từ khóa & Điều khiển Kết hợp

⚡ Tóm tắt thông minh

Selenium Khung làm việc: Các phương pháp tiếp cận dựa trên dữ liệu, từ khóa và kết hợp xác định cách người kiểm thử tổ chức mã tự động hóa, phân tách dữ liệu kiểm thử và tái sử dụng logic. Bài viết này giải thích từng loại khung làm việc, kiến ​​trúc, ưu điểm và cách triển khai chúng từng bước với các ví dụ thực tế. Selenium Ví dụ mã WebDriver.

  • Định nghĩa cốt lõi: A Selenium Framework là một kiến ​​trúc mã có cấu trúc giúp cải thiện khả năng tái sử dụng, tính di động và khả năng bảo trì của các kịch bản kiểm thử tự động.
  • 📊 Triển khai dựa trên dữ liệu: Tách dữ liệu kiểm thử khỏi logic bằng cách sử dụng Excel, CSV hoặc XML, và đọc dữ liệu đầu vào thông qua Apache POI (HSSF cho XLS, XSSF cho XLSX).
  • 🔑 Thiết kế dựa trên từ khóa: Điều khiển các thao tác giao diện người dùng thông qua bảng từ khóa và kho lưu trữ đối tượng để người kiểm thử thủ công có thể xây dựng các trường hợp mà không cần viết mã. Java Mã.
  • ⚙️ Tối ưu hóa kết hợp: Kết hợp TestNG Các nhà cung cấp dữ liệu với tính năng thực thi từ khóa giúp tăng tính linh hoạt, khả năng mở rộng và giảm chi phí bảo trì kịch bản.
  • 🧩 Lợi ích của kho lưu trữ đối tượng: Tập trung các bộ định vị vào một tệp thuộc tính để khi thay đổi phần tử, chỉ cần cập nhật một vị trí duy nhất trên tất cả các trường hợp kiểm thử.

Selenium Khung

Là gì Selenium Khung?

Selenium Khung tự động hóa Framework là một kiến ​​trúc mã có cấu trúc giúp việc bảo trì kiểm thử trở nên đơn giản, dễ mở rộng và hiệu quả. Nếu không có framework, người kiểm thử thường đặt mã và dữ liệu ở cùng một vị trí, điều này khiến mã không thể tái sử dụng và khó đọc. Việc áp dụng một framework mang lại những lợi ích có thể đo lường được như khả năng tái sử dụng mã cao hơn, tính di động tốt hơn, giảm chi phí bảo trì kịch bản, cải thiện khả năng đọc hiểu và phân tách rõ ràng hơn giữa logic kiểm thử và dữ liệu đầu vào.

Tại sao sử dụng Selenium Khung tự động hóa?

Một thiết kế tốt Selenium Khung công tác này giải quyết ba vấn đề dai dẳng trong tự động hóa kiểm thử: trùng lặp mã, bộ định vị dễ bị lỗi và dữ liệu kiểm thử khó quản lý. Bằng cách thiết lập cấu trúc rõ ràng, các nhóm có thể mở rộng bộ kiểm thử của họ từ một vài kịch bản lên đến hàng trăm mà không mất kiểm soát.

  • Khả năng bảo trì: Các bộ định vị tập trung và các phương thức hỗ trợ có nghĩa là chỉ cần một thay đổi duy nhất sẽ cập nhật mọi bài kiểm tra sử dụng phần tử đó.
  • Khả năng tái sử dụng: Các thao tác thông thường như đăng nhập, điều hướng hoặc nhập biểu mẫu được viết một lần và được gọi trong nhiều trường hợp kiểm thử khác nhau.
  • Khả năng mở rộng: Việc thêm các trường hợp kiểm thử mới trở thành một công việc cập nhật dữ liệu thay vì một tác vụ lập trình, điều này cho phép những người không phải là lập trình viên đóng góp các kịch bản.
  • Báo cáo và Cộng tác: Cấu trúc được tiêu chuẩn hóa giúp dễ dàng tích hợp với các công cụ báo cáo, quy trình CI/CD và hệ thống kiểm soát phiên bản.

các loại Selenium Khung

Có ba chính các loại khung được xây dựng trên Selenium WebDriver được sử dụng để tự động hóa các trường hợp kiểm thử thủ công. Mỗi kiểu thiết kế hướng đến sự cân bằng khác nhau giữa nỗ lực của nhà phát triển, sự tham gia của người kiểm thử và tính linh hoạt của dữ liệu.

  • Khung điều khiển dữ liệu
  • Khuôn khổ theo hướng từ khóa
  • Khung điều khiển lai

các loại Selenium Khung

Các phần tiếp theo sẽ giải thích chi tiết từng khung lý thuyết, bắt đầu từ phương pháp dựa trên dữ liệu đơn giản nhất và tiến đến mô hình lai linh hoạt nhất.

Khung điều khiển dữ liệu trong Selenium

Khung điều khiển dữ liệu trong Selenium Đây là phương pháp tách biệt tập dữ liệu kiểm thử khỏi logic của trường hợp kiểm thử. Sau khi dữ liệu được tách rời, bạn có thể sửa đổi đầu vào cho một chức năng cụ thể mà không cần chạm vào mã kiểm thử. Phương pháp này thường được sử dụng để lấy các trường hợp kiểm thử và bộ kiểm thử từ các nguồn bên ngoài, chẳng hạn như... Excel, .csv, .xml, hoặc các bảng trong cơ sở dữ liệu.

Khung điều khiển dữ liệu trong Selenium

Để đọc hoặc ghi các tệp Excel, Apache cung cấp thư viện POI nổi tiếng. Thư viện này có thể xử lý cả hai định dạng. xlsXLSX các định dạng. Các HSSF Việc triển khai này đọc các tệp XLS cũ, trong khi... XSSF Ứng dụng này hỗ trợ các tệp XLSX hiện đại.

Chúng ta đã đề cập đến Kiểm thử dựa trên dữ liệu trong bài viết trước. hướng dẫn trước.

Khung điều khiển từ khóa trong Selenium

Khung điều khiển từ khóa trong Selenium Đây là một phương pháp giúp tăng tốc tự động hóa bằng cách tách các từ khóa cho các chức năng và hướng dẫn chung. Tất cả các thao tác và hướng dẫn được viết trong một tệp bên ngoài, thường là một bảng tính Excel. Người kiểm thử có thể chỉ định các chức năng mà họ muốn xác thực mà không cần sửa đổi tệp gốc. Java Điều này làm cho phong cách này trở nên lý tưởng cho các nhóm mà các nhà phân tích nghiệp vụ hoặc chuyên viên kiểm thử thủ công đóng góp vào việc định nghĩa các bài kiểm thử.

Đây là toàn bộ cấu trúc khung:

Khung điều khiển từ khóa trong Selenium

Như bạn thấy, đây là một khuôn khổ gồm 5 bước. Chúng ta hãy cùng nghiên cứu chi tiết từng bước một.

Bước 1)

  • Tập lệnh điều khiển Execute.java gọi hàm Read.Guru99ExcelFile.java.
  • ĐọcGuruTệp 99ExcelFile.java chứa mã POI đọc dữ liệu từ Excel.

Bước 2)

  • ĐọcGuru99ExcelFile.java đọc dữ liệu từ TestCase.xlsx.
  • Đây là hình dạng của bảng tính:

Bảng tính Excel về Khung dựa trên từ khóa Selenium

  • Dựa trên các từ khóa được ghi trong tệp Excel, khung phần mềm sẽ thực hiện hành động tương ứng trên giao diện người dùng.
  • Ví dụ, để nhấp vào nút có nhãn “Đăng nhập”, bảng tính Excel sẽ lưu trữ từ khóa “Click”. Để xác định nút Đăng nhập trong số nhiều nút trên một trang, hàng trong Excel định nghĩa Tên đối tượng là loginButton và Loại đối tượng là name (xem hàng được tô sáng trong hình). Loại đối tượng cũng có thể là XPath, CSS, class hoặc bất kỳ chiến lược định vị nào khác.

Bước 3) ĐọcGuruTệp 99ExcelFile.java chuyển dữ liệu đã được phân tích cú pháp trở lại tập lệnh điều khiển Execute.java.

Bước 4)

  • Đối với tất cả các phần tử giao diện người dùng web, bạn duy trì một kho lưu trữ đối tượng chứa các định vị phần tử như XPath, tên, CSS hoặc tên lớp.

Kho lưu trữ đối tượng trong Khung hướng từ khóa

  • Tập lệnh Execute.java (tập lệnh điều khiển) đọc toàn bộ kho lưu trữ đối tượng và lưu trữ nó vào một biến.
  • Lớp hỗ trợ ReadObject cung cấp phương thức getObjectRepository để tải kho lưu trữ tại thời điểm chạy.

Lớp trợ giúp ReadObject cho Keyword Driven Framework

LƯU Ý: Bạn có thể thắc mắc tại sao cần đến kho lưu trữ đối tượng. Câu trả lời là khả năng bảo trì. Nếu một nút có tên = btnlogin được sử dụng trong 10 trường hợp kiểm thử và nhà phát triển đổi tên nó thành submit, nếu không bạn sẽ phải chỉnh sửa 10 tệp. Với kho lưu trữ đối tượng, bạn chỉ cần thay đổi bộ định vị ở một nơi duy nhất.

Bước 5)

  • Trình điều khiển truyền dữ liệu từ Excel và kho lưu trữ đối tượng đến giao diện người dùng.Operalớp tion.
  • UIOperaNó chứa các hàm ánh xạ từng từ khóa như CLICK và SETTEXT đến một hành động WebDriver cụ thể.
  • UIOperation là một Java Lớp này chứa mã thực thi để tương tác với các phần tử web.

UIOperalớp tion trong Keyword Driven Framework

Cấu trúc dự án hoàn chỉnh như sau:

Cấu trúc dự án hoàn chỉnh của Keyword Driven Framework

Chúng ta hãy xem xét một ví dụ thực tế:

Kịch bản thử nghiệm: Chúng tôi đang thực hiện 2 trường hợp kiểm thử.

  • Trường hợp thử nghiệm 1:
  • Goto https://demo.guru99.com/V4/
  • Nhập ID người dùng
  • Nhập mật khẩu
  • Nhấp vào Đặt lại
  • Trường hợp thử nghiệm 2:
  • Goto https://demo.guru99.com/V4/
  • Nhập ID người dùng
  • Nhập mật khẩu
  • Bấm Đăng nhập

object.properties

url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset

ĐọcGuru99ExcelFile.java

package excelExportAndFileIO;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadGuru99ExcelFile {
    public Sheet readExcel(String filePath, String fileName, String sheetName) throws IOException {
        // Create a File object to open the xlsx file
        File file = new File(filePath + "\\" + fileName);
        // Create a FileInputStream to read the Excel file
        FileInputStream inputStream = new FileInputStream(file);
        Workbook guru99Workbook = null;
        // Detect the file extension
        String fileExtensionName = fileName.substring(fileName.indexOf("."));
        if (fileExtensionName.equals(".xlsx")) {
            guru99Workbook = new XSSFWorkbook(inputStream);
        } else if (fileExtensionName.equals(".xls")) {
            guru99Workbook = new HSSFWorkbook(inputStream);
        }
        // Read the sheet inside the workbook by its name
        Sheet guru99Sheet = guru99Workbook.getSheet(sheetName);
        return guru99Sheet;
    }
}

ReadObject.java

package operation;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ReadObject {
    Properties p = new Properties();

    public Properties getObjectRepository() throws IOException {
        // Read the object repository file
        InputStream stream = new FileInputStream(new File(System.getProperty("user.dir") + "\\src\\objects\\object.properties"));
        // Load all objects
        p.load(stream);
        return p;
    }
}

UIOperation.java

package operation;
import java.util.Properties;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class UIOperation {
    WebDriver driver;

    public UIOperation(WebDriver driver) {
        this.driver = driver;
    }

    public void perform(Properties p, String operation, String objectName, String objectType, String value) throws Exception {
        System.out.println("");
        switch (operation.toUpperCase()) {
            case "CLICK":
                driver.findElement(this.getObject(p, objectName, objectType)).click();
                break;
            case "SETTEXT":
                driver.findElement(this.getObject(p, objectName, objectType)).sendKeys(value);
                break;
            case "GOTOURL":
                driver.get(p.getProperty(value));
                break;
            case "GETTEXT":
                driver.findElement(this.getObject(p, objectName, objectType)).getText();
                break;
            default:
                break;
        }
    }

    private By getObject(Properties p, String objectName, String objectType) throws Exception {
        if (objectType.equalsIgnoreCase("XPATH")) {
            return By.xpath(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("CLASSNAME")) {
            return By.className(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("NAME")) {
            return By.name(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("CSS")) {
            return By.cssSelector(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("LINK")) {
            return By.linkText(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("PARTIALLINK")) {
            return By.partialLinkText(p.getProperty(objectName));
        } else {
            throw new Exception("Wrong object type");
        }
    }
}

Thực thiTest.java

package testCases;
import java.util.Properties;
import operation.ReadObject;
import operation.UIOperation;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
import excelExportAndFileIO.ReadGuru99ExcelFile;

public class ExecuteTest {
    @Test
    public void testLogin() throws Exception {
        WebDriver webdriver = new FirefoxDriver();
        ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
        ReadObject object = new ReadObject();
        Properties allObjects = object.getObjectRepository();
        UIOperation operation = new UIOperation(webdriver);
        // Read keyword sheet
        Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir") + "\\", "TestCase.xlsx", "KeywordFramework");
        // Find the number of rows in the Excel file
        int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
        for (int i = 1; i < rowCount + 1; i++) {
            Row row = guru99Sheet.getRow(i);
            if (row.getCell(0).toString().length() == 0) {
                System.out.println(row.getCell(1).toString() + "----" + row.getCell(2).toString() + "----" +
                        row.getCell(3).toString() + "----" + row.getCell(4).toString());
                operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(),
                        row.getCell(3).toString(), row.getCell(4).toString());
            } else {
                System.out.println("New Testcase->" + row.getCell(0).toString() + " Started");
            }
        }
    }
}

Sau khi thực thi, kết quả sẽ trông như sau:

Kết quả thực thi của Khung điều khiển từ khóa

Tải về Selenium Tệp dự án cho bản demo trong hướng dẫn này

Khung điều khiển lai

Khung điều khiển lai in Selenium Nó kết hợp những ưu điểm của cả khung kiểm thử dựa trên từ khóa và dựa trên dữ liệu. Đây là một mô hình dễ sử dụng, cho phép người kiểm thử thủ công tạo các trường hợp kiểm thử chỉ bằng cách chỉnh sửa từ khóa, dữ liệu kiểm thử và kho lưu trữ đối tượng, mà không cần viết bất kỳ mã khung nào.

Ở đây, các tệp Excel lưu giữ các từ khóa cho từng bước, và TestNG'S nhà cung cấp dữ liệu Cung cấp dữ liệu thử nghiệm. Việc phân chia này cho phép bạn mở rộng quy mô cả từ vựng hành động và các biến thể đầu vào một cách độc lập.

Kiến trúc khung điều khiển lai

Đối với khung làm việc lai của chúng tôi, cấu trúc hướng từ khóa không thay đổi: chúng tôi chỉ đơn giản thay thế ExecuteTest.java bằng HybridExecuteTest.java.

Thay thế thành phần khung điều khiển lai

Tệp HybridExecuteTest này chứa toàn bộ logic điều khiển bằng từ khóa kết hợp với TestNGCơ chế cung cấp dữ liệu của 's.

Toàn bộ cấu trúc khung lai được thể hiện bằng hình ảnh như sau:

Khung điều khiển lai (Hybrid Driven Framework) - Biểu diễn đầy đủ

HybridExecuteTest.java

package testCases;
import java.io.IOException;
import java.util.Properties;
import operation.ReadObject;
import operation.UIOperation;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import excelExportAndFileIO.ReadGuru99ExcelFile;

public class HybridExecuteTest {
    WebDriver webdriver = null;

    @Test(dataProvider = "hybridData")
    public void testLogin(String testcaseName, String keyword, String objectName, String objectType, String value) throws Exception {
        if (testcaseName != null && testcaseName.length() != 0) {
            webdriver = new FirefoxDriver();
        }
        ReadObject object = new ReadObject();
        Properties allObjects = object.getObjectRepository();
        UIOperation operation = new UIOperation(webdriver);
        operation.perform(allObjects, keyword, objectName, objectType, value);
    }

    @DataProvider(name = "hybridData")
    public Object[][] getDataFromDataprovider() throws IOException {
        Object[][] object = null;
        ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
        Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir") + "\\", "TestCase.xlsx", "KeywordFramework");
        int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
        object = new Object[rowCount][5];
        for (int i = 0; i < rowCount; i++) {
            Row row = guru99Sheet.getRow(i + 1);
            for (int j = 0; j < row.getLastCellNum(); j++) {
                object[i][j] = row.getCell(j).toString();
            }
        }
        System.out.println("");
        return object;
    }
}

Tải về Selenium Tệp dự án cho bản demo trong hướng dẫn này

Câu Hỏi Thường Gặp

Chọn Keyword Driven khi người kiểm thử thủ công cần xây dựng các trường hợp mà không cần lập trình. Chọn Data Driven khi cùng một kịch bản phải chạy với nhiều biến thể đầu vào khác nhau. Sử dụng Hybrid khi bạn cần cả tính linh hoạt về dữ liệu và khả năng viết kiểm thử ở cấp độ từ khóa cùng một lúc.

Apache POI đọc và ghi các tệp Excel được sử dụng làm nguồn dữ liệu. HSSF xử lý các tệp .xls cũ, trong khi XSSF xử lý các tệp .xlsx hiện đại. Cả hai cùng nhau cho phép các tập lệnh kiểm thử của bạn lấy dữ liệu đầu vào động từ bảng tính mà không cần mã hóa cứng dữ liệu.

Kho lưu trữ đối tượng tập trung các bộ định vị phần tử như XPath, CSS hoặc tên. Nếu nhà phát triển đổi tên một điều khiển giao diện người dùng, bạn chỉ cần cập nhật một mục duy nhất thay vì mọi trường hợp kiểm thử, điều này giúp giảm đáng kể thời gian bảo trì và nguy cơ lỗi kịch bản.

AI cải thiện Selenium Các khung công tác được xây dựng dựa trên các bộ định vị tự phục hồi, ưu tiên kiểm thử thông minh và xác thực trực quan. Các công cụ AI phát hiện sự thay đổi vị trí bộ định vị, đề xuất các bộ chọn ổn định và phân tích các mẫu lỗi, giúp duy trì độ tin cậy của các bộ kiểm thử lai khi ứng dụng được kiểm thử phát triển.

Đúng vậy. Các trợ lý AI hiện đại phân tích ứng dụng đang được kiểm thử và đề xuất các thư viện từ khóa, các ví dụ đầu vào và các trường hợp ngoại lệ. Người kiểm thử xem xét và tinh chỉnh các đề xuất, giúp tăng tốc quá trình thiết lập khung phần mềm trong khi vẫn duy trì sự ổn định.ping Sự thiếu sót của con người trong logic xác thực quan trọng.

Tóm tắt bài viết này với: