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元素上操作的方法都保留在类文件中。
类的验证的任务应该作为测试方法的一部分分开