web自动化4-POM模式

本文介绍了POM设计模式在自动化测试中的应用,包括页面对象模型的封装、分层架构、核心思想(减少冗余代码,提高可维护性),以及代码优化如前后置处理和POM的三层/四层结构。
摘要由CSDN通过智能技术生成

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

        代码和数据的分离。涵盖全局变量、测试用例数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值