TESTEKVN - KIỂM THỬ THỰC CHIẾN Contact: Vincent - 083.286.8822 Email:
[email protected] 1 PAGE OBJECT MODEL POM (Page Object Model) là 1 design pattern giúp ”mô hình hóa” các pages, hoặc các thành phần (component: header, footer, menu…) trong page của trang web thành mỗi đối tượng riêng biệt. Mỗi component/page sẽ chứa tất cả các hành động và các thuộc tính của component/page đó. Kiến trúc POM: Ưu điểm của Page Object Model (POM): Các tương tác, hành vi trong giao diện người dùng được tách biệt, giúp source code dễ hiểu hơn, dễ bảo trì hơn. Lưu trữ đối tượng độc lập với các trường hợp kiểm thử, vì vậy chúng ta có thể sử dụng cùng một đối tượng cho một mục đích khác với các công cụ khác nhau. Code ít hơn và được tối ưu hóa vì các phương thức có thể tái sử dụng trong các lớp POM. Định nghĩa tên phương thức tương ứng với một hoạt động cụ thể, ví dụ hành động truy cập vào trang chủ, tên phương thức giống như 'gotoHomePage()'. Mô hình triển khai thực tế:
TESTEKVN - KIỂM THỬ THỰC CHIẾN Contact: Vincent - 083.286.8822 Email:
[email protected] 1 Ví dụ: Chúng ta sẽ triển khai source code test có cấu trúc như sau: Common: Chứa các thông tin base class, mục đích để tái sử dụng và tập hợp các phương thức phổ biến dùng chung Model: Quản lý các dữ liệu test - được chuyển đổi thành các object model để triển khai và phát triển Page: Chứa thông tin về locator và các behavior của các đối tượng, thuộc tính trong page Testscript: Quản lý, chứa các kịch bản kiểm thử. Base Test: package vincent.training.basic.buoi05.common; import org.testng.annotations.AfterClass; import org.testng.annotations.AfterSuite; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Listeners;
TESTEKVN - KIỂM THỬ THỰC CHIẾN Contact: Vincent - 083.286.8822 Email:
[email protected] 1 @Listeners(TestListener.class) public class BaseTest { public BaseTest(){ } @BeforeSuite public void beforeSuite() throws Exception {} @AfterSuite public void afterSuite() throws Exception {} @AfterClass public void afterClass() throws Exception{} } Base Page: package vincent.training.basic.buoi05.common; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; public class BasePage { protected WebDriver webDriver; protected WebDriverWait webDriverWait; /** * Init a new instance * * @param webDriver : The WebDriver to interact with elements */ public BasePage(WebDriver webDriver) { this.webDriver = webDriver; webDriverWait = new WebDriverWait(webDriver, Duration.ofSeconds(10), Duration.ofMillis(100)); } /** * Finding element */ public WebElement findElement(Object selector) { WebElement element; if (selector instanceof WebElement) element = (WebElement) selector; else if (selector instanceof String) { element = webDriver.findElement(By.xpath(String.valueOf(selector))); } else if (selector instanceof By) { element = webDriver.findElement((By) selector); } else { throw new RuntimeException("Your selector is invalid, you only user String, By or WebElement object"); } return element; } /** * Click element with By/WebElement object * * @param selector */
TESTEKVN - KIỂM THỬ THỰC CHIẾN Contact: Vincent - 083.286.8822 Email:
[email protected] 1 public void clickToElement(Object selector) { // TODO: 12/01/2023 : Cast and verify element WebElement element = getElement(selector); element.click(); } /** * @param selector * @param value */ public void inputText(Object selector, String value) { // TODO: 12/01/2023 : Verify element WebElement element = getElement(selector); element.clear(); element.sendKeys(value); } /** * Get Element * * @param selector */ public WebElement getElement(Object selector) { WebElement element; if (selector instanceof WebElement) element = (WebElement) selector; else if (selector instanceof By) element = webDriver.findElement((By) selector); else throw new RuntimeException("Your object should be a WebElement or a by object"); return element; } /** * Input text voi cac truong text co kieu type dynamically * @param title * @param text */ public void inputTextWithType(String title,String text) { String xpath =String.format(BaseConst.DYNAMIC_INPUT_TYPE_FORM,title); WebElement element = findElement(xpath); inputText(element,text); } } Home Page: package vincent.training.basic.buoi05.page; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import vincent.training.basic.buoi05.common.BasePage; public class HomePage extends BasePage { /** * Init a new instance * * @param webDriver : The WebDriver to interact with elements */ public HomePage(WebDriver webDriver) { super(webDriver); } /** * Go to Login Page */ public LoginPage gotoLoginPage() {