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();
}
}
|