UI自动化 pageObject设计模式实战

本文详细介绍PageObject设计模式在UI自动化测试中的应用,包括原则、优势和实战示例,通过实例演示如何封装页面操作并保持代码结构清晰与可维护性。

PageObject设计模式实战

pageObject作为一个经典的设计模式已经被广泛应用到了UI自动化框架封装当中,当然了,现在接口自动化也能够使用这种设计理念。pageObject设计模式充分利用了面向对象原则,将业务层和用例分离,让使用者能够更好地进行维护。接下来就介绍一下pageObject设计模式的基本理念和实战

一、pageObject的基本原则

● The public methods represent the services that the page offers
● Try not to expose the internals of the page
● Generally don’t make assertions
● Methods return other PageObjects
● Need not represent an entire page
● Different results for the same action are modelled as different method
以上是原作者定义的原则,后面的框架设计也是按照这些原则进行封装的
原则解读:

  1. 用公共方法代表page所提供的功能:将页面所提供的的服务封装成public方法,外界可直接进行调用
  2. 不要把页面内部的元素暴露给外部: 一般将定位器单独分装成私有元素,无需暴露给外界
  3. 不要再页面内进行断言:断言统一都放在用例层进行
  4. 方法应该返回其他的PageObject或者返回用于断言的数据
  5. 不需要封装页面的所有服务:只需要封装会用到的即可
  6. 同样的行为不同的结果可以建成不同的方法:登录成功和登录失败可以分开进行封装成两个方法

二、pageObject优点

  1. pageObject以页面为单位建模,这样子可减少了很多重复事件代码
  2. 提高整体代码的可阅读性和维护性
  3. 实现页面和用例分离,页面所做修改就不会影响到用例层

三、pageObject实战

废话不多说了,直接上代码吧

  • 首先我们需要定义一个主页面MainPage作为UI页面入口
/**
	MainPage作用:
	1. 初始化driver
	2. 作为首页封装对应方法
	3. 通过mainPage获取到其他页面
**/
public class MainPage{

	// 根据原则2 将定位器封装成私有元素
    private By searchInput = By.id("kw");
    private By searchBtn= By.id("su");
	private WebDriver driver;
	
	// 构造方法直接调用初始化driver
	public void MainPage(){
        initDriver();
    }

	// 初始化驱动
    public void initDriver(){
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.manage().window().maximize();
    }

	 /**
     * 退出驱动
     */
    public void teardown(){
        driver.quit();
    }

    /**
     * 搜索方法  根据原则4.点击完搜索后是跳转到搜索结果页面,所以应该时返回另一个pageObject
     */
    public SearchResultPage search(String searchMsg) {
    	driver.findElement(searchInput).sendKeys("searchMsg");
    	driver.findElement(searchBtn).click();
    	// 返回搜索结果页面 并将driver进行传递
        return new SearchResultPage(driver);
    }
	// 根据原则5 我们暂时值用到百度搜索功能 所以暂时就封装一个服务即可
	// ...
}
  • SearchResultPage声明:
public class SearchResultPage{

    private By resultContent = By.id("content_left");
	private WebDriver driver;

    /**
     * 获取搜索结果内容  返回用例用作断言(原则3不要页面进行断言)
     */
    public String getSerachResultContent() {
    	return driver.findElement(resultContent)..getText();
    }
}
  • 以上两个页面便简单封装完成,接下来看用例层
// 这里用的junit5测试框架
public class BaiduTest{
	private static MainPage main;
    @BeforeAll
    static void beforeAll(){
        main = new MainPage(); // 初始化主页面
    }
	
	public void searchTest(){
		//进行断言
		assertTrue(main.search("pageObject").getSerachResultContent().contains("pageObject"))
	}
	
	@AfterAll
    static void afterAll(){
        main.teardown(); // 退出driver
    }
}

以上就是pageObject的简单封装。我知道有部分人认为driver初始化直接放在用例的前置中即可,但是笔者认为,driver是跟page业务相关的,理应放在page层进行初始化,用例层只管调用即可,所以把driver的初始化放在了page层。

后续完善:

  1. page公用方法抽取 存在BasePage父类中
  2. 用例中 类前置进行数据清理、用例前置回到测试页面
  3. 进行参数化驱动
  4. 。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值