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
以上是原作者定义的原则,后面的框架设计也是按照这些原则进行封装的
原则解读:
- 用公共方法代表page所提供的功能:将页面所提供的的服务封装成public方法,外界可直接进行调用
- 不要把页面内部的元素暴露给外部: 一般将定位器单独分装成私有元素,无需暴露给外界
- 不要再页面内进行断言:断言统一都放在用例层进行
- 方法应该返回其他的PageObject或者返回用于断言的数据
- 不需要封装页面的所有服务:只需要封装会用到的即可
- 同样的行为不同的结果可以建成不同的方法:登录成功和登录失败可以分开进行封装成两个方法
二、pageObject优点
- pageObject以页面为单位建模,这样子可减少了很多重复事件代码
- 提高整体代码的可阅读性和维护性
- 实现页面和用例分离,页面所做修改就不会影响到用例层
三、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层。
后续完善:
- page公用方法抽取 存在BasePage父类中
- 用例中 类前置进行数据清理、用例前置回到测试页面
- 进行参数化驱动
- 。。。
本文详细介绍PageObject设计模式在UI自动化测试中的应用,包括原则、优势和实战示例,通过实例演示如何封装页面操作并保持代码结构清晰与可维护性。

1457

被折叠的 条评论
为什么被折叠?



