selenium中PO模式(Page Object Model)小结
1. PO模式的概念
Page Object是selenium目前比较流行的一种设计模式。它将页面作为一个对象,为每一个页面设计一个类class,这个类中封装了测试中需要用到的元素的获取方法和对这些元素的操作方法。写测试用例时,只要调用页面对象中的属性和方法,就可以操作元素以执行用例。
Page Object Model很好地利用了java面向对象和封装的思想,对页面细节交互的操作进行封装,那么我们在写测试用例的时候,可以更加专注于页面而不是界面细节。
2. PO模式的优点
1)提高了测试代码的可读性;
2)降低测试代码的维护成本,当页面中的测试方法需要调整,我们只要去对应的页面类下进行调整即可;而传统的测试代码模式,所有页面的元素获取、元素操作和测试用例都是在一起的,维护起来相对不方便;
3)减少了代码的重复;
3. PO模型代码示例
以搜索功能的测试用例为例,以下举例中,我将该页面分成了三个类:
page类:封装获取执行搜索测试时,需要用到的元素的定位方法;
pageHandle类:封装对元素的操作方法,例如,点击元素、在元素上悬停、在元素中输入内容等一系列常规操作;
pageBusiness类:通过调用pageHandle类中的方法,对测试时具体需要执行的业务操作进行封装;
page类:
package com.hizuche.page; import com.hizuche.base.BaseDriver; import com.hizuche.util.LocateWay; import org.openqa.selenium.WebElement; /** * @Author mac * @Description: 获取页面中各元素的定位方法,并返回出去 * @date: Create in 2018/10/18 16:39 */ /*构造函数传入创建对象时所指定的浏览器驱动driver*/ public class Page extends BasePage { public Page(BaseDriver driver) { super(driver); } /** * 获取【公司车辆】-搜索条件-车牌号搜索框的元素定位方法 * @return 返回车牌号搜索框的定位方法 */ public WebElement getCarNo() { //为了减少代码冗余,定义了findElement方法为元素定位方法 return findElement(LocateWay.getLocateWay("car_no")); } /** * 获取【公司车辆】-搜索条件-车架号搜索框的元素定位方法 * @return 返回车架号搜索框的定位方法 */ public WebElement getVin() { return findElement(LocateWay.getLocateWay("vin")); } /** * 获取【公司车辆】-搜索按钮的元素定位方法 * @return 返回搜索按钮的元素定位方式 */ public WebElement getSearchBtn() { return findElement(LocateWay.getLocateWay("searchCarBtn")); } }
pageHandle类:
package com.hizuche.handle; import com.hizuche.base.BaseDriver; import com.hizuche.page.Page; import org.openqa.selenium.*; import org.openqa.selenium.interactions.Actions; /** * @Author hp // * @Description: CompanyCarPageHandle类,定义了对【公司车辆】页面中元素的操作,如点击、输入等 * @date: Create in 2018/10/18 17:51 */ public class PageHandle { public BaseDriver driver; public Page page; public WebDriver driver1; public Actions action; public PageHandle(BaseDriver driver) { this.driver = driver; page = new Page(driver); } /** * 在【公司车辆】-车牌号搜索框中,输入搜索内容 * @param car_no 传入搜索车牌号的关键字参数 */ public void inputCarNo(String car_no) { page.sendKeys(page.getCarNo(),car_no); } /** * 在【公司车辆】-车架号搜索框中,输入搜索内容 * @param vin 传入搜索车架号的关键字参数 */ public void inputVin(String vin) { page.sendKeys(page.getVin(),vin); } /** * 在【公司车辆】中点击搜索按钮 */ public void clickSearchBtn() { page.click(page.getSearchBtn()); } }
pageBusiness类:
package com.hizuche.business; import com.hizuche.base.BaseDriver; import com.hizuche.handle.PageHandle; public class PageBH { public BaseDriver driver; public PageHandle pageHandle; public PageBH(BaseDriver driver) { this.driver = driver; pageHandle= new PageHandle(driver); } /** * 封装【公司车辆】的搜索操作 */ public void searchCompanyCar() throws Exception { /*调用PageHandle类中的方法,在车牌号搜索框中输入浙A59关键字*/ pageHandle.inputCarNo("浙a59"); pageHandle.inputVin("LDp"); /*在页面中点击搜索按钮*/ pageHandle.clickSearchBtn(); Thread.sleep(500); } }
这样在实际测试的时候,只要直接调用PageHandleBH类,就可以执行测试用例,对于搜索框、搜索按钮的元素定位方法,以及业务上的操作,全部封装在了对应的类中。如果其中一个方法发生变化,只要找到对应页面的操作层进行改动即可。作为selenium的初学者来讲,PO设计模式是一种分层合理、逻辑清晰的设计方式,推荐在初学时就形成这种良好的用例设计习惯。