Mô hình đối tượng trang & Nhà máy trong Selenium

⚡ Tóm tắt thông minh

Mô hình đối tượng trang và Nhà máy trang trong Selenium Bài viết này định nghĩa một mẫu thiết kế có cấu trúc để xây dựng các khung tự động hóa kiểm thử mạnh mẽ và dễ bảo trì. Nó nhấn mạnh việc tạo ra các lớp dành riêng cho từng trang, bao gồm các WebElements và hành vi của chúng, từ đó giảm sự trùng lặp và cải thiện khả năng đọc hiểu cũng như khả năng mở rộng của mã nguồn. Selenium kịch bản thử nghiệm.

  • Khái niệm cốt lõi: Mỗi trang ứng dụng tương ứng với một Lớp Trang riêng biệt, chứa cả các WebElement và các hành động được thực hiện trên chúng, cho phép phân tách rõ ràng giữa cấu trúc giao diện người dùng và logic kiểm thử.
  • Tập trung thực hiện: POM thúc đẩy việc quản lý các phần tử có thể tái sử dụng và tập trung — việc sửa đổi các phần tử trang chỉ cần cập nhật trong một lớp duy nhất thay vì nhiều tập lệnh.
  • Ưu điểm thiết kế: Mô hình này đảm bảo các kho lưu trữ đối tượng sạch hơn, có tính mô-đun và độc lập với công cụ, có thể tích hợp với các framework như... TestNG, JUnit, Cucumberhoặc JBehave.
  • Quy ước đặt tên: Các phương thức bên trong Lớp Trang phải phản ánh chính xác các hành động giao diện người dùng thực tế (ví dụ: gotoHomePage()), giúp tăng cường tính rõ ràng về ngữ nghĩa trong quy trình tự động hóa.
  • Cấu trúc nâng cao: Page Factory tinh chỉnh POM bằng cách sử dụng @FindBy chú thích và PageFactory.initElements() để tự động khởi tạo WebElement, loại bỏ sự lặp lại. findElement cuộc gọi.
  • Tối ưu hóa Hiệu suất: AjaxElementLocatorFactory Giới thiệu tính năng tải lười (lazy loading) — các phần tử chỉ được định vị khi được truy cập — giúp cải thiện hiệu quả thực thi và xử lý hành vi trang động một cách mượt mà.
  • Kết quả: Cách tiếp cận thống nhất này tạo ra kiến ​​trúc tự động hóa kiểm thử dễ bảo trì, dễ đọc và có khả năng mở rộng, phù hợp với các tiêu chuẩn hiện đại. Selenium thực hành.

Mô hình đối tượng trang

Page Object Model là gì? Các thành phần chính của nó là gì?

Mô hình đối tượng trang (POM) Đây là một mẫu thiết kế, được sử dụng phổ biến trong tự động hóa kiểm thử, tạo ra một kho lưu trữ đối tượng (Object Repository) cho các phần tử giao diện người dùng web. Ưu điểm của mô hình này là giảm thiểu sự trùng lặp mã và cải thiện khả năng bảo trì kiểm thử.

Theo mô hình này, mỗi trang web trong ứng dụng sẽ có một Lớp Trang tương ứng. Lớp Trang này sẽ xác định các WebElement của trang web đó và cũng chứa các phương thức Trang thực hiện các thao tác trên các WebElement đó. Tên của các phương thức này nên được đặt theo nhiệm vụ mà chúng đang thực hiện, ví dụ: nếu trình tải đang chờ cổng thanh toán xuất hiện, tên phương thức POM có thể là waitForPaymentScreenDisplay().

Các thành phần chính của mô hình đối tượng trang (Page Object Model)

  • Các lớp trang: Biểu diễn mỗi trang web như một lớp riêng biệt.
  • Định vị: Xác định các phần tử web bằng cách sử dụng ID, XPath hoặc bộ chọn CSS.
  • Phương pháp: Chứa các hành động hoặc thao tác được thực hiện trên các phần tử .page.
  • Khả năng tái sử dụng: PromoTái sử dụng mã kiểm thử và bảo trì dễ dàng hơn trên nhiều bài kiểm thử.
  • Tách biệt mối quan tâm: Giữ cấu trúc trang độc lập với logic kiểm thử để tổ chức tốt hơn.

Mô hình đối tượng trang

Tại sao mô hình đối tượng trang?

Bắt đầu tự động hóa giao diện người dùng trong Selenium webdriver Đây KHÔNG phải là một nhiệm vụ khó khăn. Bạn chỉ cần tìm các phần tử và thực hiện các phép toán trên chúng.

Hãy xem xét đoạn mã đơn giản này để đăng nhập vào một trang web.

Mô hình đối tượng trang

Như bạn có thể quan sát, tất cả những gì chúng ta đang làm là tìm các phần tử và điền giá trị cho các phần tử đó.

Đây là một kịch bản tốn thời gian và dễ xảy ra lỗi. Ban đầu có vẻ dễ dàng, nhưng khi bộ kiểm thử mở rộng, việc quản lý các thay đổi của các phần tử trở nên khó khăn. Nhưng theo thời gian, bộ kiểm thử sẽ ngày càng lớn mạnh. Khi bạn thêm ngày càng nhiều dòng mã, mọi thứ sẽ trở nên khó khăn hơn.

Vấn đề chính với việc bảo trì tập lệnh là nếu 10 tập lệnh khác nhau đang sử dụng cùng một thành phần trang, thì với bất kỳ thay đổi nào trong thành phần đó, bạn cần phải thay đổi tất cả 10 tập lệnh. Việc này tốn thời gian và dễ xảy ra lỗi.

Một cách tiếp cận tốt hơn để bảo trì kịch bản là tạo một tệp lớp riêng biệt để tìm các phần tử web, điền thông tin hoặc xác minh chúng. Lớp này sau đó có thể được sử dụng lại trong nhiều kịch bản kiểm thử tương tác với cùng một phần tử. Trong tương lai, nếu có sự thay đổi trong phần tử web, chúng ta chỉ cần thực hiện thay đổi trong 1 tệp lớp duy nhất thay vì 10 kịch bản khác nhau.

Cách tiếp cận này được gọi là Mô hình đối tượng trang trong SeleniumNó giúp cho mã nguồn dễ đọc hơn, dễ bảo trì hơn và dễ tái sử dụng hơn.

 Mô hình đối tượng trang

👉 Đăng ký miễn phí trực tiếp Selenium Dự án

Ưu điểm của POM

  1. Mẫu thiết kế đối tượng trang cho biết các hoạt động và luồng trong giao diện người dùng phải được tách biệt khỏi quá trình xác minh. Khái niệm này làm cho mã của chúng tôi sạch hơn và dễ hiểu hơn.
  2. Lợi ích thứ hai là kho lưu trữ đối tượng độc lập với các trường hợp kiểm thử, do đó chúng ta có thể sử dụng cùng một kho lưu trữ đối tượng cho các mục đích khác nhau với các công cụ khác nhau. Ví dụ, chúng ta có thể tích hợp Page Object Model vào Selenium với TestNG/JUnit cho chức năng Kiểm tra và đồng thời với JBehave/Cucumber cho việc kiểm tra chấp nhận.
  3. Code Nó trở nên ít tốn tài nguyên hơn và được tối ưu hóa vì nó tái sử dụng các phương thức trang trong các lớp POM.
  4. Các phương thức sẽ có tên gọi thực tế hơn, dễ dàng liên kết với thao tác đang diễn ra trên giao diện người dùng. Ví dụ: nếu sau khi nhấp vào nút, chúng ta được chuyển đến trang chủ, tên phương thức sẽ là 'gotoHomePage()'.

Cách triển khai POM trong Selenium?

PLog đơn giản trong cấu trúc nền tảng của khung Page Object Model, trong đó whereManagereIDElements của AUT Và phương thức hoạt động trên các Web Element này được duy trì bên trong một tệp clog. Một tác vụ như xác minh nên được tách riêng như một phần của các phương thức kiểm thử.

Triển khai POM

Hoàn thành ví dụ

Trường hợp thử nghiệm: Đến phần GuruTrang web demo 99.

Bước 1) Đi đến GuruTrang web demo 99

Triển khai POM

Bước 2) Trên trang chủ, hãy kiểm tra xem văn bản “GuruNgân hàng 99 có mặt

Triển khai POM

Bước 3) Đăng nhập vào ứng dụng

Triển khai POM

Bước 4) Xác minh rằng Trang chủ có chứa văn bản là “Id Manger: demo”

Triển khai POM

Trong ví dụ này, chúng ta đang làm việc với hai trang:

  1. Đăng nhập Trang
  2. Trang chủ (hiển thị khi bạn đăng nhập)

Theo đó chúng ta tạo 2 POM trong Selenium các lớp học

Guru99 Trang đăng nhập POM

package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99Login {
    WebDriver driver;
    By user99GuruName = By.name("uid");
    By password99Guru = By.name("password");
    By titleText =By.className("barone");
    By login = By.name("btnLogin");
    public Guru99Login(WebDriver driver){
        this.driver = driver;
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        driver.findElement(user99GuruName).sendKeys(strUserName);
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
         driver.findElement(password99Guru).sendKeys(strPassword);
    }
    //Click on the login button
    public void clickLogin(){
            driver.findElement(login).click();
    }
    //Get the title of Login Page
    public String getLoginTitle(){
     return    driver.findElement(titleText).getText();
    }
    /**
     * This POM method allows the test case to perform the login operation
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();        
    }
}

Guru99 Trang chủ POM trong Selenium

package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99HomePage {
    WebDriver driver;
    By homePageUserName = By.xpath("//table//tr[@class='heading3']");
    public Guru99HomePage(WebDriver driver){
        this.driver = driver;
    }
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    driver.findElement(homePageUserName).getText();
        }
}

Guru99 POM đơn giản trong Selenium Kiểm tra trường hợp

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import pages.Guru99HomePage;
import pages.Guru99Login;
public class Test99GuruLogin {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage;
    @BeforeTest
    public void setup(){
	System.setProperty("webdriver.gecko.driver", driverPath);        
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test case will login in https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }

Page Factory là gì Selenium?

Nhà máy trang ở Selenium là một khái niệm khung Mô hình Đối tượng Trang có sẵn dành cho Selenium WebDriver cải thiện khả năng bảo trì bằng cách giảm thiểu việc tìm kiếm phần tử lặp đi lặp lại thông qua chú thích, chứ không phải bằng tốc độ thực thi. Nó được sử dụng để khởi tạo các đối tượng Page hoặc để tạo một thể hiện của chính đối tượng Page. Nó cũng được sử dụng để khởi tạo các phần tử của lớp Page mà không cần sử dụng "FindElement/s".

Ở đây cũng vậy, chúng tôi tuân theo khái niệm tách biệt Kho lưu trữ đối tượng trang và Phương thức kiểm tra. Ngoài ra, với sự trợ giúp của lớp PageFactory trong Selenium, chúng tôi sử dụng chú thích @FindBy Để tìm WebElement, chúng ta sử dụng phương thức initElements để khởi tạo các phần tử web.

Trang Nhà máy ở Selenium

@FindBy có thể chấp nhận tagName, một phầnLinkText, tên, linkText, id, css, className, xpath dưới dạng các thuộc tính.

Hãy xem ví dụ tương tự như trên bằng cách sử dụng Page Factory

GuruTrang đăng nhập 99 với Page Factory

package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99Login {
    /**
     * All WebElements are identified by @FindBy annotation
     */
    WebDriver driver;
    @FindBy(name="uid")
    WebElement user99GuruName;
    @FindBy(name="password")
    WebElement password99Guru;    
    @FindBy(className="barone")
    WebElement titleText;
    @FindBy(name="btnLogin")
    WebElement login;
    public Guru99Login(WebDriver driver){
        this.driver = driver;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        user99GuruName.sendKeys(strUserName);     
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
    password99Guru.sendKeys(strPassword);
    }
    //Click on login button
    public void clickLogin(){
            login.click();

    }  
    //Get the title of Login Page
    public String getLoginTitle(){
     return    titleText.getText();
    }
    /**
     * This POM method will be exposed in test case to login in the application
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();           
    }
}

GuruTrang chủ 99 với Page Factory

package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99HomePage {
    WebDriver driver;
    @FindBy(xpath="//table//tr[@class='heading3']")
    WebElement homePageUserName;    
    public Guru99HomePage(WebDriver driver){
        this.driver = driver;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }   
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    homePageUserName.getText();
        }
}

Guru99 trường hợp thử nghiệm với khái niệm Page Factory

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import PageFactory.Guru99HomePage;
import PageFactory.Guru99Login;
public class Test99GuruLoginWithPageFactory {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage; 
    @BeforeTest
    public void setup(){
        System.setProperty("webdriver.gecko.driver", driverPath);       
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test go to https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }
}

Cấu trúc dự án hoàn chỉnh sẽ giống như sơ đồ:

Nhà máy trang ở Selenium

AjaxElementLocatorNhà máy

AjaxElementLocatorNhà máy là một khái niệm tải từng phần của PageFactory trong SeleniumNó được sử dụng để tìm các phần tử web chỉ khi các phần tử đó được sử dụng trong bất kỳ thao tác nào. Nó gán thời gian chờ cho WebElements cho lớp trang đối tượng. Một trong những ưu điểm chính của việc sử dụng mẫu PageFactory là... Selenium là Lớp AjaxElementLocatorFactory.

Ở đây, khi một thao tác được thực hiện trên một phần tử, thời gian chờ để phần tử đó hiển thị bắt đầu từ thời điểm đó. Nếu phần tử không được tìm thấy trong khoảng thời gian đã cho, Trường hợp thử nghiệm việc thực thi sẽ đưa ra ngoại lệ 'NoSuchElementException'.

Nhà máy định vị AjaxElement

Ví dụ:

AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10);
PageFactory.initElements(factory, this);

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

Page Object Model là một mẫu thiết kế bao gồm...tracPhân tách các phần tử trang web thành các lớp riêng biệt. Điều này giúp đơn giản hóa quá trình tự động hóa bằng cách tách biệt tương tác giao diện người dùng khỏi logic kiểm thử, thúc đẩy tính rõ ràng, khả năng mở rộng và giảm sự trùng lặp mã.

In SeleniumPOM biểu diễn mỗi trang web như một lớp riêng biệt chứa các bộ định vị và hành động. Nó đóng gói các phần tử giao diện người dùng, cho phép các kịch bản kiểm thử hoạt động độc lập với các thay đổi cấu trúc trang bên dưới.

POM không phải là một framework độc lập mà là một mẫu thiết kế. Nó có thể được tích hợp vào bất kỳ framework tự động hóa nào để cấu trúc các bài kiểm thử một cách hiệu quả, đảm bảo tính tổ chức, khả năng tái sử dụng và khả năng bảo trì tốt hơn.

POM là một nguyên tắc thiết kế trong đó mỗi trang web được mô hình hóa như một lớp với các bộ định vị và phương thức được xác định rõ. Nó tách rời logic kiểm thử khỏi các phần tử giao diện người dùng, giúp tăng cường khả năng đọc hiểu, khả năng mở rộng và khả năng bảo trì lâu dài.

POM định nghĩa cấu trúc thiết kế cho trang abstractrong khi Page Factory cung cấp các chú thích và phương thức (@FindBy) để khởi tạo các phần tử web một cách hiệu quả. Page Factory là một cải tiến về mặt triển khai của POM.

POM tập trung các bộ định vị phần tử và các thao tác trang vào các lớp chuyên dụng. Bất kỳ sửa đổi nào đối với giao diện người dùng đều chỉ cần cập nhật ở một nơi duy nhất, giảm thiểu việc làm lại, cải thiện khả năng tái sử dụng mã và tăng tốc độ bảo trì kiểm thử.

Đúng vậy. Các công cụ tạo kiểm thử dựa trên AI có thể tự động tạo các lớp POM bằng cách phân tích cấu trúc phân cấp giao diện người dùng, duy trì sự tách biệt logic giữa các mối quan tâm đồng thời tăng tốc quá trình tạo kiểm thử đầu cuối.

POM thúc đẩy các thành phần kiểm thử dạng mô-đun và có thể tái sử dụng, cho phép tích hợp với các công cụ bảo trì kiểm thử dựa trên AI tự động cập nhật vị trí, giảm thiểu tính dễ hỏng của kịch bản và chi phí bảo trì.

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