PageObject設計模式
1. Web自動化測試框架(WebTestFramework)是基於Selenium框架且采用PageObject設計模式進行二次開發形成的框架。
2. web測試時,建議強烈推薦使用_谷歌或_火狐瀏覽器。
3. PageObject設計模式:是將某個頁面的所有"元素(包含控件)屬性"及"元素操作"封裝在1個類(Class)里面~~~~
4. 目的: 測試代碼與被測頁面對象代碼分離,后期如果有頁面元素發生了更改,只需要修改相應頁面對象的代碼(即對應Class文件),而不需要修改測試代碼
5. 盡量采用xpath方式來尋找頁面元素,而不建議使用name,Link等方法; xpath是基於頁面元素所處區域,一般不會發生變化,測試代碼基本不受干擾.
6. 將頁面元素屬性信息與代碼分離,即與被測對象代碼分離,目的也是為了進一步降低后續因頁面變化帶來的維護成本
以下是我的一個小的測試實例代碼
Test---java工程名
src---源代碼目錄
CommonObject -----包名--存放公共類代碼, 如 UseBrowser.java , 存放的操作chrome,firfox,ie等瀏覽器的相關代碼
PageObject--------包名--存放頁面對象(Page Object),以及相關的操作, 如 HomePageObject.java, 存放百度搜索主頁的相關對象及操作方法
PagePath----------包名--存放頁面對象元素的相關路徑字符串文件, 如 PageElementPath.java, 存放百度搜索主頁對象的路徑字符串文件,
TestCases---------包名--存放頁面對象的測試案例的相關類, 如 NewTest.java , 存放的就是真正的測試案例, 調用方法,使用數據進行測試的類.
1 //公共類,操作瀏覽器相關的 2 package CommonObject; 3 import java.util.concurrent.TimeUnit; 4 import org.openqa.selenium.WebDriver; 5 import org.openqa.selenium.chrome.ChromeDriver; 6 import org.openqa.selenium.firefox.FirefoxDriver; 7 import org.openqa.selenium.ie.InternetExplorerDriver; 8 import org.openqa.selenium.remote.DesiredCapabilities; 9 10 public class UseBrowser { 11 public WebDriver driver; 12 //啟動谷歌瀏覽器 13 public WebDriver setupChrome(String test_url){ 14 System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe"); 15 driver = new ChromeDriver(); 16 driver.get(test_url); 17 driver.manage().window().maximize(); 18 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 19 return driver; 20 } 21 //啟動火狐瀏覽器(需要最新geckodriver.exe,放到firfox的根目錄) 22 public WebDriver setupFirfox(String test_url){ 23 // System.setProperty("webdriver.firefox.marionette","C:/Program Files(x86)/Mozilla Firefox/geckodriver.exe"); 24 driver = new FirefoxDriver(); 25 driver.get(test_url); 26 driver.manage().window().maximize(); 27 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 28 return driver; 29 } 30 //啟動IE瀏覽器 31 public WebDriver setupIE(String test_url){ 32 System.setProperty("webdriver.ie.driver", "C:\\Program Files\\Internet Explorer\\IEDriverServer.exe"); 33 DesiredCapabilities dc = DesiredCapabilities.internetExplorer(); 34 dc.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true); 35 driver = new InternetExplorerDriver(dc); 36 driver.get(test_url); 37 return driver; 38 } 39 //關閉瀏覽器 40 public void teardownBrowser(){ 41 driver.close(); 42 } 43 }
//pageobject頁面對象類,百度搜索頁面的[輸入框],[百度一下按鈕]對象及操作 package PageObject; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import PagePath.PageElementPath; public class HomePageObject extends PageElementPath{ // 點擊搜索欄 public void click_Search_Bar(WebDriver driver){ driver.findElement(By.id(search_bar_id)).click(); } // 搜索框輸入 public void input_Search_Box(WebDriver driver,String key_word){ driver.findElement(By.id(search_box_id)).clear(); driver.findElement(By.id(search_box_id)).sendKeys(key_word); System.out.println("百度輸入框已經成功輸入的搜索內容:"+key_word); } //點擊搜索按鈕(百度一下) public void click_Search_Button(WebDriver driver){ driver.findElement(By.name(search_button_name)).click(); System.out.println("click the 百度以下,success..."); } }
//頁面對象路徑類, 百度一下頁面的輸入框,按鈕的路徑字符串 package PagePath; public class PageElementPath { public String search_bar_id = "kw"; public String search_box_id = "kw"; public String search_button_name = "wd"; }
// 使用testng框架的測試類, 主要進行頁面輸入框,按鈕的測試, 其中的測試數據也可以分離,暫時沒有進行分離, package TestCases; import org.openqa.selenium.WebDriver; import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeClass; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeTest; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeSuite; import org.testng.annotations.AfterSuite; import CommonObject.UseBrowser; import PageObject.HomePageObject; public class NewTest { HomePageObject page =new HomePageObject(); UseBrowser browser = new UseBrowser(); WebDriver drivers; @Test public void test_baidu() throws Exception { page.click_Search_Bar(drivers); page.input_Search_Box(drivers,"PageObject設計模式"); Thread.sleep(10000); page.click_Search_Button(drivers); } @BeforeMethod public void beforeMethod() { System.out.println("Before method success...."); } @AfterMethod public void afterMethod() { System.out.println("After Method success...."); } @BeforeClass public void beforeClass() { System.out.println("Before Class success...."); } @AfterClass public void afterClass() { System.out.println("After Class success...."); } @BeforeTest public void beforeTest() { System.out.println("Before Test success...."); } @AfterTest public void afterTest() { System.out.println("After Test success...."); } @BeforeSuite public void beforeSuite() { drivers = browser.setupChrome("http://www.baidu.com/"); System.out.println("Before Suite success...."); } @AfterSuite public void afterSuite() { browser.teardownBrowser(); System.out.println("After Suite success...."); } } /**輸入結果為 Before Suite success.... Before Test success.... Before Class success.... Before method success.... 百度輸入框已經成功輸入的搜索內容:PageObject設計模式 click the 百度以下,success... After Method success.... After Class success.... After Test success.... After Suite success.... */
// 不使用testng框架的情況下, 可以使用java的main方法也可以進行測試.如下面 package PageObject; import org.openqa.selenium.WebDriver; import PageObject.HomePageObject; import CommonObject.UseBrowser; public class baidu_main_method{ public static void main(String[]args) throws Exception{ WebDriver drivers; HomePageObject page = new HomePageObject(); UseBrowser browser = new UseBrowser(); drivers= browser.setupChrome("http://www.baidu.com/"); page.click_Search_Bar(drivers); page.input_Search_Box(drivers,"PageObject設計模式"); page.click_Search_Button(drivers); Thread.sleep(5000); browser.teardownBrowser(); } } /* 百度輸入框已經成功輸入的搜索內容:PageObject設計模式 click the 百度以下,success... */
什么是POM?
1. 頁面對象模型 是 為Web UI元素創建Object Repository的設計模式 。
2. 在這個模型下,對於應用程序中的每個網頁,應該有相應的頁面類。
3. 此Page類將會找到該Web頁面的WebElements,並且還包含對這些WebElements執行操作的頁面方法。
4. 這些方法的名稱應該按照他們正在執行的任務給出
POM的優點
1. 頁面對象Patten表示UI中的操作和流程應與驗證分開。這個概念使我們的代碼更清潔,易於理解。
2. 第二個好處是 對象存儲庫獨立於測試用例,因此我們可以使用與不同工具不同的目的使用相同的對象存儲庫。
例如,我們可以將POM與用於功能測試的TestNG / JUnit進行集成,並與JBehave / Cucumber同時進行驗收測試。
3. 由於POM類中的可重用頁面方法,代碼變得更少和優化。
4. 方法采用更實際的名稱 ,可以輕松地映射UI中發生的操作。即如果在點擊按鈕后,我們登陸主頁,方法名稱就像'gotoHomePage()'
如何實現POM?
簡單的POM:
它是頁面對象模型(POM)的基本結構,其中AUT的所有Web元素和在這些Web元素上操作的方法都保留在類文件中。
類的驗證的任務應該作為測試方法的一部分分開