POM,中文:页面对象模型,POM是近几年非常流行的自动化测试模型,或者思想,POM不是框架,是解决问题的一种思想。

采用POM目的:为了解决前端中UI变化频繁,从而造成测试自动化脚本维护的成本越来越大

自动化框架 (Automation Framework)需要 :

1.配置文件管理    (我选用ini文件)
     2.业务逻辑代码和测试脚本分离
     3.输出测试报告文件
     4.输出日志(log)文件
     5.自定义的库封装(我们有很多方法需要重复调用,例如浏览器的引擎以及basepage.py的封装)
     6.管理,执行脚本的方式(比如unittest框架 执行效率比较高)
     7.第三方插件引入(例:html第三方报告)

框架设计如下
1.配置文件 PS:我们需要适用一个自己熟悉类型的文件来管理配置数据和全局变量
2.框架的主要代码 PS: 主要包含 日志类(log) 自定义封装基类 配置文件读取类以及各种调度
3.产品业务页面 PS:页面对象,业务逻辑分层,分页独立出来
4.测试脚本集合 PS:考虑采用第三方框架和创建测试单元 例如unitest
5.日志和报告 PS: 测试报告和日志的输出,报告需要采用第三方插件来实现
6.邮件功能或者持续集成 PS:例如jenkins 以及其他可以扩展的功能

POM思路:把页面元素和业务逻辑和测试脚本分离开到两个不同的类文件。class A只写页面元素定位,和业务逻辑代码操作的封装,class B只写测试脚本,

不关心如何元素定位,只写调用class A的代码去覆盖不同的测试场景,如果前端页发生变化,只需要修改Class A的元素定位,而不需要去修改class B中的测试脚本代码。

POM主要有以下优点:

  1. 把web ui对象仓库从测试脚本分离,业务代码和测试脚本分离。
  2. 每一个页面对应一个页面类,页面的元素写到这个页面类中。
  3. 页面类主要包括该页面的元素定位,和和这些元素相关的业务操作代码封装的方法。
  4. 代码复用,从而减少测试脚本代码量。
  5. 层次清晰,同时支持多个编写自动化脚本开发,例如每个人写哪几个页面,不影响他人。
  6. 建议页面类和业务逻辑方法都给一个有意义的名称,方便他人快速编写脚本和维护脚本。

prophet模型 python python pom模型_业务逻辑

PO模型分三层:
1.基础层BasePage:封装一些最基础的selenium的原生的api方法,元素定位,框架跳转等。

2.PO层:元素定位、获得元素对象,页面动作

3.测试用例层:业务逻辑,数据驱动!

三者的关系:PO层继承继承层,测试用例层调用PO层

基础层BasePage:

# -*- coding: utf-8 -*-

"""
POM Page Object Model  ===》  页面对象模型  一句话解释,就是将页面封装成一个对象;
"""
from appium.webdriver.common.mobileby import MobileBy

class PageObject:
    """
    将页面封装的元素全部放进来,
    我们定位元素的时候,实际上是通过页面元素的定位方式 和定位的值来定位元素
    所以在脚本里面,页面元素的代表者就是 定位方式 + 定位的值
    """

    city = (MobileBy.ACCESSIBILITY_ID, "书城")  # 页面中 书城这个元素
    book_list = (MobileBy.XPATH, '//*[@resource-id="com.zhao.myreader:id/rv_book_list"]/android.widget.LinearLayout')
    city_book_name = (MobileBy.ID, "com.zhao.myreader:id/tv_book_name")
    city_book_desc = (MobileBy.ID, "com.zhao.myreader:id/tv_book_desc")
    city_book_author = (MobileBy.ID, "com.zhao.myreader:id/tv_book_author")
    read_book = (MobileBy.ID, "com.zhao.myreader:id/btn_read_book")
    book_content = (MobileBy.ID, "com.zhao.myreader:id/tv_content")
    chapter_list = (MobileBy.ID, "com.zhao.myreader:id/ll_chapter_list")
    chapter_list_info = (
        MobileBy.XPATH, '//*[@resource-id="com.zhao.myreader:id/lv_chapter_list"]/android.widget.LinearLayout')

PO层

from selenium.webdriver.common.by import By

from base.base_page import BasePage

 
class BaiduPage(BasePage):

#元素定位,

baidu_text_loc = (By.ID, 'kw')

baidu_submit_loc = (By.ID, 'su')

#获得元素对象,

def get_text_obj(self):

ele = self.find_ele(*BaiduPage.baidu_text_loc)

return ele

def get_submit_obj(self):

ele = self.find_ele(*BaiduPage.baidu_submit_loc)

return ele

#页面操作

def search(self,search_string):

self.get_text_obj().send_keys(search_string)

self.get_submit_obj().click()

测试用例层:业务逻辑和数据驱动

from ddt import ddt, data

from po.baidu_page import BaiduPage

 
@ddt

class BaiduTest(unittest.TestCase):

 
@data('软件测试','硬件测试')

def test01(self,seaString):

BaiduPage().search(seaString)

time.sleep(5)

 
if __name__ == '__main__':

unittest.main()