CYBERSOFT
Đăng nhập

Page Object Model (POM) cho người mới: tổ chức script tự động bền vững (có code chạy được)

Chuyên công nghệNền tảngNgười mớiChuẩn SEO
🗓 1 tháng trước19 phút đọc·👁 692 lượt xem👤 381 người đọc

Bài cho người mới: học Page Object Model (POM) qua app TMĐT ShopEasy. Vì sao cần tách locator/hành động khỏi test, cấu trúc thư mục chuẩn, viết class LoginPage/CartPage bằng Playwright chạy được, hai tình huống thật (đổi id nút gây hỏng 50 test, locator lặp lại khó bảo trì), nhiều mockup giao diện, FAQ và trắc nghiệm 5 câu. Chuẩn SEO, dẫn về khóa Tester CyberSoft.

1. Tóm tắt nhanh & màn hình bạn sẽ test

⭐ TL;DR — Page Object Model (POM) là cách tổ chức code automation: mỗi màn hình có 1 lớp riêng chứa locator + hành động, còn file test chỉ gọi hàm để kiểm tra kết quả. Bài này bám màn đăng nhập và giỏ hàng của app TMĐT ShopEasy: bạn học vì sao cần POM, cách tách test khỏi locator, cấu trúc thư mục chuẩn, và viết class LoginPage/CartPage bằng Playwright chạy được thật. Nhiều hình minh hoạ và trắc nghiệm cuối bài.

Chào bạn mới! Khi vừa học automation, phản xạ tự nhiên là viết thẳng: mở trình duyệt, tìm phần tử bằng id, click, nhập liệu — tất cả nằm gọn trong 1 file test. Cách này chạy tốt với vài test đầu tiên. Nhưng khi số lượng test tăng lên vài chục, và nhiều test cùng phải 'đăng nhập' trước khi làm việc khác, bạn sẽ thấy cùng một đoạn code lặp đi lặp lại ở khắp nơi. Page Object Model chính là cách giải quyết vấn đề này: gom mọi thứ 'biết về giao diện' vào một lớp riêng, để file test chỉ còn tập trung vào việc kiểm tra đúng/sai. Chúng ta sẽ học qua màn đăng nhập và giỏ hàng thật của ShopEasy, có hình minh hoạ và code Playwright chạy được.

🔒 shopeasy.vn/dang-nhap ShopEasy · TMĐT ShopEasy · Đăng nhập Email mai.tran@gmail.comMật khẩu ••••••••Đăng nhập Locator: #email-input Locator: #password-input Locator: #btn-login
Màn hình test: trang đăng nhập ShopEasy, chú thích locator từng ô nhập và nút
📖 Page Object Model: cách tổ chức code automation, mỗi màn hình ứng dụng có 1 lớp riêng chứa locator và hành động, file test chỉ gọi hàm của lớp đó.

2. Vấn đề: test tự động không có cấu trúc rõ ràng

Hãy hình dung bạn viết 10 test cho ShopEasy, và cả 10 test đều cần đăng nhập trước. Nếu không có cấu trúc, mỗi file test sẽ có đúng đoạn code: tìm ô email bằng '#email-input', tìm ô mật khẩu bằng '#password-input', click nút '#btn-login'. Ban đầu điều này có vẻ vô hại — chỉ là copy-paste vài dòng. Nhưng khi dự án lớn lên tới 50, 100 test, cùng một đoạn code đăng nhập tồn tại ở 50, 100 nơi khác nhau.

Trước và sau khi áp dụng Page Object Model Tiêu chíKHÔNG dùng POMCÓ dùng POMVị trí locatorViết thẳng trong từng file testGom trong 1 lớp Page Object (LoginPage, CartPage...)UI đổi id nútPhải sửa lại ở MỌI file test có dùng nút đóChỉ sửa đúng 1 chỗ trong Page ObjectLuồng đăng nhập lặp lạiCopy-paste code đăng nhập ở nhiều testGọi loginPage.login(email, password)Đọc hiểu test mớiLẫn lộn thao tác UI và logic kiểm traTest đọc như câu chuyện nghiệp vụ, dễ hiểuBảo trì khi dự án lớnNgày càng giòn, sợ sửa vì dễ vỡ nhiều nơiỔn định hơn, sửa 1 nơi đúng phạm vi ảnh hưởngCùng 1 tính năng, chỉ khác cách tổ chức code — nhưng chi phí bảo trì khác nhau rất nhiều.
Bảng so sánh: cùng tính năng đăng nhập/giỏ hàng, tổ chức KHÔNG có POM và CÓ POM

Vấn đề thật sự lộ ra khi giao diện thay đổi — điều gần như chắc chắn sẽ xảy ra trong một dự án đang phát triển. Đội thiết kế đổi id nút, thêm bước xác thực, hay đổi nhãn ô nhập. Nếu locator nằm rải rác trong 50 file, bạn phải rà từng file để sửa, dễ bỏ sót, dễ sửa sai chỗ này đúng chỗ kia. Đây chính là lúc chi phí bảo trì automation vượt xa lợi ích nó mang lại — và cũng là lý do nhiều đội automation 'bỏ cuộc' giữa chừng vì test ngày càng giòn, khó tin tưởng.

📖 Locator: cách tìm một phần tử trên giao diện (id, class, text, role...), để công cụ automation biết thao tác lên đúng phần tử đó.

3. Page Object Model là gì & nguyên tắc cốt lõi

Nguyên tắc cốt lõi của POM là 'tách biệt trách nhiệm' (separation of concerns): mỗi màn hình của ứng dụng được đại diện bởi một lớp — gọi là Page Object — chứa TẤT CẢ những gì liên quan tới giao diện màn hình đó: locator của các phần tử, và các hành động có thể thực hiện (điền form, bấm nút, đọc nội dung). File test không còn 'biết' id hay class CSS nào cả — nó chỉ gọi các hàm như loginPage.login(email, password) rồi kiểm tra kết quả.

Sơ đồ tách Test ↔ Page Object ↔ Giao diện ShopEasy gọi loginPage.login() thao tác #email-input...Test filelogin.spec.jsPage Objectclass LoginPageGiao diện ShopEasyDOM thật trên trình duyệt
Sơ đồ luồng gọi: test file gọi hàm của Page Object, Page Object mới thao tác trực tiếp lên giao diện

Nói cách khác: Page Object 'biết' giao diện trông ra sao và cách thao tác lên nó, còn file test chỉ 'biết' nghiệp vụ — dữ liệu nào cần nhập, kết quả nào là đúng. Khi giao diện đổi, chỉ phần 'biết giao diện' (Page Object) cần sửa; phần 'biết nghiệp vụ' (test) hầu như không đổi vì logic kiểm tra vẫn y hệt. Đây là lý do POM giúp automation bền vững hơn hẳn theo thời gian, đặc biệt với dự án nhiều màn hình dùng chung (như đăng nhập xuất hiện trước hầu hết mọi luồng).

💡 Đặt tên lớp Page Object theo đúng tên màn hình (LoginPage, CartPage, CheckoutPage...) để bất kỳ ai đọc code cũng đoán được nó đại diện màn hình nào.

4. Cấu trúc thư mục dự án automation dùng POM

Một dự án Playwright dùng POM thường tách rõ 2 khu vực: thư mục pages/ chứa các lớp Page Object (mỗi màn hình 1 file), và thư mục tests/ chứa các kịch bản test (mỗi luồng nghiệp vụ 1 file). Cách đặt tên nhất quán giúp bất kỳ thành viên mới nào cũng nhanh chóng tìm đúng chỗ cần sửa khi có lỗi.

Cấu trúc thư mục dự án automation dùng POM Thư mục / TệpVai tròpages/LoginPage.jsLớp Page Object: locator + hành động của màn Đăng nhậppages/CartPage.jsLớp Page Object: locator + hành động của màn Giỏ hàngpages/BasePage.jsLớp cha chứa hành vi dùng chung (goto, chờ tải trang...)tests/login.spec.jsKịch bản test dùng LoginPage, KHÔNG chứa locator trực tiếptests/cart.spec.jsKịch bản test dùng LoginPage + CartPageplaywright.config.jsCấu hình chạy test: trình duyệt, baseURL, số lần thử lạiMỗi màn hình ShopEasy ứng với đúng 1 lớp Page Object; test chỉ gọi hàm, không tự tìm locator.
Cấu trúc thư mục thường gặp của dự án Playwright áp dụng Page Object Model
text
shopeasy-automation/
├── pages/
│   ├── BasePage.js       # hanh vi dung chung: goto, cho tai trang...
│   ├── LoginPage.js      # locator + hanh dong man Dang nhap
│   └── CartPage.js       # locator + hanh dong man Gio hang
├── tests/
│   ├── login.spec.js     # kich ban test dang nhap, dung LoginPage
│   └── cart.spec.js      # kich ban test gio hang, dung LoginPage + CartPage
├── fixtures/
│   └── test-data.json    # du lieu mau: tai khoan, san pham...
├── playwright.config.js
└── package.json
💡 Nếu nhiều Page Object dùng chung 1 hành vi (ví dụ hàm goto chờ trang tải xong), tách ra một lớp BasePage rồi cho các Page Object khác kế thừa — tránh lặp lại chính trong các lớp Page Object.
🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 25% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!