1. 程式人生 > >selenium測試框架篇,頁面物件和元素物件的管理

selenium測試框架篇,頁面物件和元素物件的管理

轉載自:http://www.cnblogs.com/tobecrazy/ 

做自動化框架,不可避免的就是物件庫。

有一個好的物件庫,可以讓整個測試體系:

  •  更容易維護
  •  大大增加程式碼重用
  •  增加測試系統的穩定性

這裡先了解一下我所說的物件庫:

所謂的頁面物件,是指每一個真是的頁面是一個物件。

比如zhihu的登陸頁面是一個頁面物件,http://www.zhihu.com/#signin

這個頁面物件主要包含一個輸入郵箱的輸入框(一個元素物件),一個輸入密碼的密碼框

一個登陸框。當然,zhihu不止一個頁面,有無數頁面,每一個頁面都可以封裝為一個物件。而每個

頁面的元素,也可以封裝成一個個元素物件。

為什麼要封裝成一個個物件?

還是以這個登陸頁面為例,如果有一天zhihu改版,登陸介面UI變了,(但是需要輸入使用者名稱和密碼還有登陸按鈕不會消失吧)。

登陸頁面的元素的位置也相應改變,如果你的測試用例沒有封裝過頁面和元素, 每個頁面都是拿webdriver 直接寫,頁面元素定位

也分佈到測試用例中,這要維護起來要全部改掉測試用例。如果你封裝了頁面,封裝了元素,再封裝一個對應的登陸Action,你的每個

測試用例是呼叫的login.action()。  這樣,你只需要改變你物件庫的內容就完美解決UI變化,而不必一個個修改測試用例。

測試框架目錄如下:

  

接下來一這個登陸為例:

首先封裝一個BasePage的類,畢竟所有的頁面都有共同的東西,每個頁面都有元素,每個頁面元素都有相應的方法

這裡簡單封裝了幾個方法,如type 

 View Code

接下來封裝元素,Webdriver的元素,每個元素都有相應的定位地址(xpath路徑或css或id)等待時間和定位型別,預設為By.xpath

 View Code

接下來就是登陸頁面的類,這個登陸頁面的元素,放在excel統一管理,要獲取元素的資訊,首先從excel讀取。

讀取excel的頁面元素是使用POI開源框架

 View Code

頁面類

複製程式碼
package com.dbyl.libarary.pageAction;

import java.io.IOException; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import com.dbyl.libarary.utils.BasePage; import com.dbyl.libarary.utils.Locator; public class LoginPage extends BasePage { WebDriver driver; public WebDriver getDriver() { return driver; } public LoginPage(WebDriver driver) throws IOException { super(driver); driver.get("http://www.zhihu.com/#signin"); } Locator loginEmailInputBox = new Locator("loginEmailInputBox"); Locator loginPasswordInputBox = new Locator("loginPasswordInputBox"); Locator loginButton = new Locator("loginButton"); Locator profile = new Locator( "profile"); public void typeEmailInputBox(String email) throws Exception { type(loginEmailInputBox, email); } public void typePasswordInputBox(String password) throws Exception { type(loginPasswordInputBox, password); } public void clickOnLoginButton() throws Exception { click(loginButton); } public boolean isPrestentProfile() throws IOException { return isElementPresent(profile, 20); } public void waitForPageLoad() { super.getDriver().manage().timeouts() .pageLoadTimeout(30, TimeUnit.SECONDS); } }
複製程式碼

接下來就是登陸的Action

複製程式碼
package com.dbyl.libarary.action;

import org.openqa.selenium.WebDriver;
import org.testng.Assert;

import com.dbyl.libarary.pageAction.HomePage;
import com.dbyl.libarary.pageAction.LoginPage;

public class CommonLogin {

    private static WebDriver driver;

    public static WebDriver getDriver() {
        return driver;
    }

    static LoginPage loginPage;

    public static HomePage login(String email, String password)
            throws Exception {
        loginPage = new LoginPage(getDriver());
        loginPage.waitForPageLoad();
        loginPage.typeEmailInputBox(email);
        loginPage.typePasswordInputBox(password);
        loginPage.clickOnLoginButton();
        Assert.assertTrue(loginPage.isPrestentProfile(), "login failed");
        return new HomePage(getDriver());
    }

    public static HomePage login() throws Exception {
        return CommonLogin.login("[email protected]", "cookies123");
    }

    public static void setDriver(WebDriver driver) {
        CommonLogin.driver = driver;
    }

}
複製程式碼

至此為止,已經封裝完畢

接下來就能在測試用例直接呼叫者

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 package com.dbyl.tests; import org.openqa.selenium.WebDriver; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.dbyl.libarary.action.ViewHomePage; import com.dbyl.libarary.utils.DriverFactory; import com.dbyl.libarary.utils.UITest; public class loginTest extends UITest{ WebDriver driver=DriverFactory.getChromeDriver(); @BeforeMethod(alwaysRun=true) public void init() { super.init(driver); ViewHomePage.setDriver(driver); //CommonLogin.setDriver(driver); } @Test(groups="loginTest") public void loginByUerName() throws Exception { //CommonLogin.login("[email protected]","cookies123"); ViewHomePage.viewMyProfile(); } @AfterMethod(alwaysRun=true) public void stop() { super.stop(); } }