POM设计模式
- P:page 页面
- O:object 对象
- M:module 模型
是自动化测试框架应用最广泛的设计模式,主要是应用于web自动化测试框架的设计中;
POM也是面向对象的一种应用。
以页面对象为模型进行封装和使用的模式。它的主要用途是把一个具体的页面转换成编程语言当中的一个对象,页面特性转化成对象属性,页面操作转换成对象方法。
在自动化测试当中,主要用来实现对页面操作和测试逻辑的一个分离。
1、用例分层(一般)
基于 POM 的用例组织结构,良好的分层机制,让不同层去做不同类型的事情,让代码结构清晰,增加复用性。
一般而言,可以分以下几层:
page:完成对页面的封装
testcase:调用各类 page 完成业务流程并进行断言
driver:完成对 Web、Android、iOS、接口的驱动
data:配置文件和数据驱动
utils:其他便捷的功能封装,可选
2、核心思想
PO模式的核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可维护性、可读性。
2.1、将页面封装成类
新建一个pom.py文件,封装后台登录页面类
# 封装后台登录页面类
class BackgroundLoginPage():
# 定义一个实例属性获取驱动
def _init_(self,driver):
self.driver = driver
2.2、将页面元素封装成类的属性
# 页面类属性的封装:需要被操作的元素
# pom.py文件
# - 输入账号
ipt_username =(By.XPATH,"/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[2]/td[2]/input")
# - 输入密码
ipt_password =(By.XPATH,"/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[3]/td[2]/input")
#- 输入验证码
ipt_code =(By.XPATH,"/html/body/form/table/tbody/tr/td[3]/table/tbody/tr[5]/td[2]/input")
# - 点击登录
btn_login_submit =(By.XPATH,'//*[@id="login_btn"]')
2.3、将用例执行流程设计成类的实例方法(操作层)
# pom.py文件
def login(self):
self.driver.find_element(*self.ipt_username).send keys("admin")
self.driver.find_element(*self.ipt_password).send keys("888888")
self.driver.find_element(*self.ipt_code).send keys("xcvf")
self.driver.find_element(*self.btn_login_submit).click
# 获取实际结果进行断言
2.4、通过定义好的页面类实例化一个对象,通过对象调用实例方式执行用例(业务层)
# test_login2.py
# 创建webdriver对象
# 获取驱动对象
def test_001():
driver =webdriver.chrome()
# 通过驱动访问页面
driver.get("http://47.107.116.139/fangwei/m.php?m=Public&a=login&")
#将页面最大化
driver.maximize window()
login_page = BackgroundLoginPage(driver)
login_page.login()
----------------------------------------------------------------------------------------------------------------------
3、代码优化
1、使用前后置(夹具),将获取驱动和关闭驱动放在fixture中,在conftest.py文件:
@pytest.fixture
def driverFunc():
print("用例开始执行之前,获取驱动")
driver = webdriver.Chrome()
#通过驱动访问页面
driver.get("http://47.107.116.139/fangwei/m.php?m=Public&a=login&")
#将页面最大化
driver.maximize_window()
yield driver
#用例执行完成之后,关闭驱动
print("用例执行完成之后,关闭驱动")
driver.quit()
2、这样test_login2.py文件:
from pom import BackgroundLoginPage #
# 创建webdriver对象
# 获取驱动对象
def test_001(driverFunc): # fixture 不自动调用的方式
# 实例化页面对象
login_page = BackgroundLoginPage(driver)
# 通过页面对象调用方法执行用例步骤
login_page.login()
# 获取实际结果进行断言
4、POM三层模式
主要分三层:
1.base层(对象库层):page页面一些公共的方法。如:初始化、元素定位、点击、输入、获取文本、截图等方法;
2.page层(操作层):封装对元素的操作。将每个涉及的元素操作单独封装一个操作方法,然后根据需求组装操作步骤,如登录方法=输入帐号+输入密码+点击登录三个操作进行组装;
3.scripts层(业务层):导包调用 page页面,使用单元测试框架对业务逻辑进行封装测试。如:实现登录,直接调用page组装的登陆方法即可。
三者的关系:page层继承base层,scripts层调用page层
核心作用
- 可以减少代码的冗余,而且方便后台维护,若页面元素发生变化,只需要调整页面封装的类属性即可
- 提高用例脚本的维护性和可持续性
5、POM分为四层:
5.1、base层
基类,定义类BasePage,包含提取每个页面相同的数据。
属性:浏览驱动实例对象(访问每个页面都要获取驱动)
方法:点击、输入、定位元素.....
5.2、pageObject层
项目很多页面,每个页面除了base层中相同的 属性和行为外,还各自的一些数据(其他元素、其他操作);
针对每个页面定义一个类。比如:登录页面, 创建loginpage.py中定义LoginPage类。
以此类推xx页面创建xxpage.py中定义xxPage类。
xxPage的定义和包含的内容:
属性:元素(除掉基类以外的)
方法:元素的操作(除掉基类以外的)
5.3、testcase层
测试用例,项目的业务流程
5.4、testdata层
代码和数据的分离。涵盖全局变量、测试用例数据。