1. 程式人生 > >Page Object 設計模式介紹

Page Object 設計模式介紹

避免 row 不用 quit sel public 設計模式 imp 提高

Page Object 是 Selenium 自動化測試項目開發實踐的最佳設計模式之一,Page Object 的主要體現於對界面交互細節的封裝,這樣可以使測試案例更關註與業務而非界面細節,提高測試案例的可讀性。

1、認識 Paget Object

Page Object 設計模式的優點如下:

  • 減少代碼的重復;
  • 提高測試用例的可讀性;
  • 提高測試用例的可維護性,特別是針對 UI 頻繁變化的項目;

Paget Object 使用註意:

  • public方法代表Page提供的功能
  • 盡量不要暴露Page的內部細節
  • 不要assertion
  • 方法可以返回其他Page Objects
  • Page Objects不用代表整個頁面,可以是任意一個部分
  • 一樣的操作,不同的結果應該分開(正確登錄,錯誤登錄)

簡單的說,Page Objects是指UI界面上用於與用戶進行交互的對象。它可以指整個頁面,也可以指Page上的某個區域。Page Objects是你的test code的交互對象,是對實際UI的一種抽象模型化。通過Page Objects可以減少重復代碼的編寫,例如,很多頁面都有同樣的header,footer,navigator等部分,如果對這些進行抽象,只寫一次就可以在其他地方通用了。

當在為 Web 頁面編寫測試時,需要操作該 Web 頁面上的元素進行操作。然而,如果在測試代碼中直接操作 HTML 元素,那麽你的代碼是及其脆弱的,因為 UI 會經常變動。我們可以將一個 page 對象封裝成一個 HTML 頁面

,可以通過提供的應用程序特定的 API 來操作頁面元素,而不在 HTML 中四處搜尋。

page 對象的一個基本經驗法則是,凡是人能做的事,page 對象通過軟件客戶端都能夠做到。因此它也應當提供一個易於編程的接口並隱藏窗口中低層的部件。所以訪問一個文本框應該通過一個訪問方法(accessor method)來實現字符串的獲取與返回,復選框應當使用布爾值,按鈕應當被表示為行為導向的方法名。page 對象應當將在 GUI 控件上所有查詢和操作數據的行為封裝為方法。一個好的經驗法則是,即使改變具體的控件,page 對象的接口也不應當發生變化。

盡管該術語是“頁面”對象,但並不意味著需要針對每個頁面建立一個這樣的對象,例如頁面有重要意義的元素可以獨立為一個 page 對象。經驗法則的目的在於通過給頁面建模,從而對應用程序的使用者變得有意義。

2、Paget Object 實例

以 126 郵箱登錄為例,通過 Page Object 設計模式來實現:

(1)首先創建 LoginPage.java 類

將登錄界面LoginPage封裝成對象;在包含主函數的類中直接調用;
分別定義了 126 郵箱首頁的幾個方法,用戶名輸入框,密碼輸入框,登錄按鈕;

package com.mypro.pom;
import ......

public class LoginPage {
    private static WebElement element = null;

    public static WebElement login_UserName(WebDriver driver){
        element = driver.findElement(By.id("idInput"));
        return element;
    }
    public static WebElement login_Password(WebDriver driver){
        element = driver.findElement(By.id("pwdInput"));
        return element;
    }
    public static WebElement login_Button(WebDriver driver){
        element = driver.findElement(By.id("loginBtn"));
        return element;
    }
}
(2)創建 mailLogin.java 類
package com.mypro.pom.test;
import ......

public class mailLogin {
    private static WebDriver driver = null;

    public static void login(WebDriver driver,String username,String password){
        LoginPage.login_UserName(driver).sendKeys(username);
        LoginPage.login_Password(driver).sendKeys(password);
        LoginPage.login_Button(driver).click();
    }
    public static void main(String[] args) throws InterruptedException {
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("http://www.126.com");

        Login(driver,"username","123456");
        Thread.sleep(5000);
        driver.quit();
        System.out.println("test case run end!");
    }
}

定義 login()方法的好處就是再創建測試用例的時只關心測試數據(用戶名和密碼),而不用考慮“登錄”到底需要幾個步驟。
一個有分歧的地方是 page 對象是否應自身包含斷言,或者僅僅提供數據給測試腳本來設置斷言。在page 對象中包含斷言的倡導者認為,這有助於避免在測試腳本中出現重復的斷言,可以更容易地提供更好的錯誤信息,並且提供更接近只做不問風格的 API。不在 page 對象中包含斷言的倡導者則認為,包含斷言會混合訪問頁面數據和實現斷言邏輯的職責,並且導致 page 對象過於臃腫。我贊成在 page 對象中不包含斷言,雖然我們可以通過為常用的斷言提供斷言庫的方式來消除重復,這可以提供更好的診斷,但從站在用戶的角度去自動化的觀點來看,判斷是否登錄成功是用戶需要做的事情,不應該交給頁面對象層來完成。

使用 Page Object 模式之後的另外一個好處就是有助於降低冗余。如果需要在 10 個用例裏面都輸入不同用戶名密碼登錄,那麽用 main()方法寫起來將會變得非常簡便。因此,Page Object 模型的作用在一個測試人員自己寫主場景測試案例時是不容易體會到的,因為你不需要和開發、業務交流案例,也不會寫很多重復動作。但是,當你真正開始嘗試 ATDD 或 BDD,當你開始寫一些重要的異常分支流程時,當你開始為新需求頻繁維護修改案例時,就會意識到 Page Object 的作用。

Page Object 設計模式介紹