Page Object Model (POM) คืออะไร? ทำไม Automation Tester ควรรู้จัก
ในการพัฒนา Automated Test โดยเฉพาะเมื่อใช้ Selenium, Playwright หรือ Cypress หนึ่งในแนวคิดที่ได้รับความนิยมและถูกนำมาใช้กันอย่างแพร่หลายคือ…
Page Object Model (POM) คืออะไร? ทำไม Automation Tester ควรรู้จัก

ในการพัฒนา Automated Test โดยเฉพาะเมื่อใช้ Selenium, Playwright หรือ Cypress หนึ่งในแนวคิดที่ได้รับความนิยมและถูกนำมาใช้กันอย่างแพร่หลายคือ Page Object Model (POM) ซึ่งช่วยให้โค้ดมีโครงสร้างที่ดี ดูแลรักษาง่าย และรองรับการขยายตัวของโปรเจกต์ในระยะยาว
Page Object Model (POM) คืออะไร?

Page Object Model (POM) คือรูปแบบการเขียน Automation Test ที่ช่วยจัดระเบียบโค้ด โดยแยกส่วนของ หน้าเว็บ (Page) ออกจาก Test Case แทนที่จะเขียนคำสั่งหา Element และคลิกปุ่มในทุก Test เราจะสร้าง Class สำหรับแต่ละหน้าเว็บ และเก็บ Element กับ Action ต่าง ๆ ไว้ใน Class นั้น
ปัญหาของการไม่ใช้ POM

หลายโปรเจกต์เริ่มต้นด้วยการเขียน Test Script แบบตรงไปตรงมา เช่น
driver.findElement(By.id("username")).sendKeys("admin");
driver.findElement(By.id("password")).sendKeys("1234");
driver.findElement(By.id("loginBtn")).click();
ในช่วงแรกอาจดูง่าย แต่เมื่อจำนวน Test Case เพิ่มขึ้น จะพบปัญหาหลายอย่าง เช่น
- Locator ถูกใช้งานซ้ำหลายไฟล์
- แก้ไขยากเมื่อ UI เปลี่ยน
- โค้ดอ่านยาก
- การบำรุงรักษาใช้เวลามาก
หากมีการเปลี่ยนแปลง ID ของปุ่ม Login อาจต้องแก้ไขหลายสิบหรือหลายร้อยจุดในโปรเจกต์
ทำไมต้องใช้ POM?
- โค้ดอ่านง่ายขึ้น
- ลดการเขียนซ้ำ
- แก้ไขง่ายเมื่อหน้าเว็บเปลี่ยน
- ดูแลโปรเจกต์ขนาดใหญ่ได้สะดวก
แนวคิดของ POM

POM แก้ปัญหานี้โดยการรวบรวม Element และ Action ของแต่ละหน้าไว้ในคลาสเดียว
ตัวอย่าง LoginPage
public class LoginPage {
private WebDriver driver;
private By username = By.id("username");
private By password = By.id("password");
private By loginBtn = By.id("loginBtn");
public LoginPage(WebDriver driver) {
this.driver = driver;
}
public void login(String user, String pass) {
driver.findElement(username).sendKeys(user);
driver.findElement(password).sendKeys(pass);
driver.findElement(loginBtn).click();
}
}
จากนั้นใน Test Case สามารถเรียกใช้งานได้ง่าย ๆ
@Test
public void loginTest() {
LoginPage loginPage = new LoginPage(driver);
loginPage.login("admin", "1234");
}
โค้ดมีความกระชับและสื่อความหมายมากขึ้น
โครงสร้างโปรเจกต์แบบ POM

ตัวอย่างโครงสร้างที่นิยมใช้งาน
src
│
├── pages
│ ├── LoginPage.java
│ ├── HomePage.java
│ └── ProductPage.java
│
├── tests
│ ├── LoginTest.java
│ └── ProductTest.java
│
├── utils
│ └── DriverFactory.java
│
└── base
└── BaseTest.java
การแบ่งโครงสร้างลักษณะนี้ช่วยให้ทีมสามารถพัฒนาและดูแลระบบทดสอบได้ง่ายขึ้น
ข้อดีของการใช้ POM
1. ลดความซ้ำซ้อนของโค้ด
Locator ถูกเก็บไว้ในที่เดียว ทำให้ไม่ต้องเขียนซ้ำในหลาย Test Case
2. ดูแลรักษาง่าย
เมื่อมีการเปลี่ยนแปลง UI สามารถแก้ไขได้เพียงไฟล์เดียว
3. เพิ่มความสามารถในการอ่านโค้ด
Test Case จะเน้นเฉพาะ Business Flow
loginPage.login("admin", "1234");
homePage.searchProduct("Laptop");
productPage.addToCart();
อ่านแล้วเข้าใจทันทีว่ากำลังทดสอบอะไร
4. รองรับการขยายระบบ
เมื่อจำนวน Test Case เพิ่มขึ้น โครงสร้างยังคงเป็นระเบียบและจัดการได้ง่าย
5. ส่งเสริมการทำงานเป็นทีม
Developer และ QA สามารถเข้าใจโครงสร้างร่วมกันได้ง่ายขึ้น

POM เหมาะกับใคร?
- Automation Tester
- QA Engineer
- SDET (Software Development Engineer in Test)
- ทีมที่ใช้ Selenium
- ทีมที่ใช้ Playwright
- ทีมที่ใช้ Cypress
- โปรเจกต์ที่มี Test Case จำนวนมาก
สรุป
POM คือการสร้าง Class แทนแต่ละหน้าเว็บ และรวบรวม Element กับ Action ของหน้านั้นไว้ในที่เดียว ช่วยให้การเขียน Automation Test มีประสิทธิภาพ ดูแลรักษาง่าย และรองรับการขยายระบบในอนาคต
메타데이터
- post_id
- 63704e1e5c22
- slug
- page-object-model-pom-คืออะไร-ทำไม-automation-tester-ควรรู้จัก-63704e1e5c22
- url
- https://medium.com/@kumoriiz/page-object-model-pom-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-%E0%B8%97%E0%B8%B3%E0%B9%84%E0%B8%A1-automation-tester-%E0%B8%84%E0%B8%A7%E0%B8%A3%E0%B8%A3%E0%B8%B9%E0%B9%89%E0%B8%88%E0%B8%B1%E0%B8%81-63704e1e5c22
- canonical_url
- https://medium.com/@kumoriiz/page-object-model-pom-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-%E0%B8%97%E0%B8%B3%E0%B9%84%E0%B8%A1-automation-tester-%E0%B8%84%E0%B8%A7%E0%B8%A3%E0%B8%A3%E0%B8%B9%E0%B9%89%E0%B8%88%E0%B8%B1%E0%B8%81-63704e1e5c22
- author_url
- https://medium.com/@kumoriiz
- status
- ok
- fetched_at
- 2026-06-10 08:17:25