前言
英文名:Page Object Model 简称:POM
英文别称:Page Object Pattern 简称:POP
中文名:页面对象模式
中文别称:页面对象模型
任何长期可维护的Ui功能自动化项目必须使用的设计模式之一,它解决了查找控件与操作操作的大量代码重复的问题,消除了重复代码的项目,才是真正可靠的项目
POM历史
POM,来源于Web端的Ui功能自动化测试框架Selenium社区,Selenium官方对此模式的概念有了一个清晰的描述:无论Web浏览器端、还是Android、Ios、小程序、WebView,只是平台不同,它们都属于前端,所以POM可以自然无缝的用在任何前端项目中,当然包括Android端的ui功能自动化项目中!因为在Selenuum项目中,称用户看到的是浏览器,而在浏览器中,又称呼看到的为页面,所以在任何移动端上,我们都称呼用户看到的东西为页面,我觉得在移动端上,可以将用户看到的,称为Window或者Screen更准确一些!
POM解决问题
1、解决查找控件的代码重复编写问题
整个项目中,用于查找某个页面中的某个控件的代码,只有1处定义!
2、解决操作控件的代码重复编写问题
整个项目中,操作某个页面的某个控件的代码,只有1处定义!
POM核心思想
1、页面类产生的对象表示一个页面
想一想某个App的页面有哪些功能?
2、页面类产生的对象表示一个窗口
想一想某个App弹出来的一个窗口有哪些功能?
3、页面类产生的对象表示一个对话框
想一想一个弹窗上,有哪些功能?
4、页面类产生的对象表示页面中任意的某一部分
想一想一个页面,某一部分有哪些功能?
仔细想想,人能在手机上干点啥?
用手……未来可能会更频繁的用到眼睛与嘴……我们先说手的情况……
1、点击
2、双击
3、多次点击
4、长按
5、快速滑动(左、上、下、右)
6、慢速滑动(左、上、下、右)
7、非规律滑动
8、多指收缩
9、多指展开
10、按下back键
11、按下power键
12、按下音量键
13、同时按下某些实体按键组合
14、轻微触动屏幕
15、特殊的滑动手势,比如从屏幕边缘开始滑动
也就是说某个页面最多全部支持这些交互功能而已,正常人类真的目前只用【手】玩手机!
POM带来的好处
1、项目可维护,被测产品的Ui改变了,你只需要修改一处页面类中对应的查找控件、操作控件的代码,测试用例的代码几乎不用动……除非因为需求,控件都没了……
2、更方便你去封装测试用例中的复合操作到一个对象中
3、在测试用例代码中方便使用调用链模式,POM是重要的一个前提
4、测试用例编写过程,以页面的API为联想范围,不会超出页面提供的交互功能
5、每个页面或者某一部分具备什么样的功能,可以快速获知某个页面具备哪些交互能力
6、测试用例中的链式调用+POM的代码可读性非常好,不使用Page Object的代码真的太难读了
POM带来的缺点
1、类数量的大爆炸,由于某块区域用对象来表示,所以业务逻辑越复杂,要创建类会非常多
2、总之对于复杂业务逻辑,利大于弊
POM实战:微信主页面(基于UI Automator测试框架)
微信主页面的底部有4个tab,算上主页面本身,可设计出5个页面类,它们分别是
1、微信底部的Tab类 TabPage
2、微信页类 WeChatPage
3、通讯录页 ContactPage
4、发现页 DiscoverPage
5、我页 MePage
规范:页面类往往以Page结尾(用Screen结尾也可以)
任意一个页面类产生的对象,表示一个页面、或者表示一个对话框,或者表示任意一部分
TabPage设计(表示微信底部的四个Tab)
public class TabPage extends BasePage {
private BySelector weChatTab = By.text("首页");
private BySelector contactTab = By.text("通讯录");
private BySelector discoverTab = By.text("发现");
private BySelector meTab = By.text("我");
/**
* @return WeChatPage对象,表示跳转到微信页
*/
public WeChatPage openWeChatScreen() {
clickView(weChatTab);
return new WeChatPage();
}
/**
* @return ContactPage对象,表示跳转到联系人页
*/
public ContactPage openContactScreen() {
clickView(contactTab);
return new ContactPage();
}
/**
* @return DiscoverPage对象,表示跳转到发现页
*/
public DiscoverPage openDiscoverScreen() {
clickView(discoverTab);
return new DiscoverPage();
}
/**
* @return MeScreen对象,表示跳转到我页
*/
public MePage openMeScreen() {
clickView(meTab);
return new MePage();
}
}
WeChatPage设计
public class WeChatPage extends TabPage {
//省略……
}
继承TabPage,因聊天页展示在底部四个Tab的上方展示具体的内容,相当于在底部Tab之上做的扩展,这样聊天页将天生具备跳转到其他页面的方法!
ContactPage设计
public class ContactPage extends TabPage {
}
DiscoverPage设计
public class DiscoverPage extends TabPage {
}
MePage设计
public class MePage extends TabPage {
}
总结
1、本文使用的继承方式来实现的POM,更佳的办法是使用持有,即组合方式,构造POM!后面我再写一篇使用组合构造微信App的例子!
2、除了使用POM,也可以使用通用信息持久化在文件中的方式,这些后面文章会提及!