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.

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.
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.
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.
👉 Đăng ký miễn phí trực tiếp Selenium Dự án
Ưu điểm của POM
- 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.
- 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.
- 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.
- 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ử.
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
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
Bước 3) Đăng nhập vào ứng dụng
Bước 4) Xác minh rằng Trang chủ có chứa văn bản là “Id Manger: demo”
Trong ví dụ này, chúng ta đang làm việc với hai trang:
- Đăng nhập Trang
- 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.
@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ơ đồ:
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'.
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











