zoukankan      html  css  js  c++  java
  • selenium+unittest实现po模型

    1.PO模型简介:

    PO模型是Page Object Model的简写, 页面对象模型。
    PO模型又叫PO设计模式,是selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装,将页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,在实际测试中只需要关注业务流程,从而提高可维护性。
    PO模型简单来说:就是通过面向对象的方式,封装页面定位和页面动作操作。与测试的逻辑分开。
    
    通俗解释一下就是每个页面当成一个对象,给这些页面写一个类,每一个page class维护着该web页的标签元素集和操作这些元素的方法;至于测试脚本则单独写,需要什么就去这些页面类去调用即可。这样的好处就是如果页面元素发生变化,你去维护页面类即可,测试类你基本不用管。
    
    po 是一种设计思想,不同的人根据这个思想写出来的代码是不一样的。(重点看如何封装)
    
    总结:PO模型实现过程是:通过面向对象的方式,对页面定位和页面操作进行分离封装(解耦合,方便后续维护)。
    
    优点:
    提高代码的可读性
    减少了代码的重复
    提高代码的可维护性, 特别是针对UI界面频繁变动的项目.
    (也就是面向对象的优点)
    缺点:
    造成项目结构比较复杂(因为是根据流程进行了模块化处理)
    

    2.如何实现 PO 模型

    PO模型一般首先抽象封装一个BasePage类,这个基类拥有一些指向Webdriver实例的属性,然后每一个Page继承基类BasePage,可以通过driver管理每一个Page中的元素,而且在Page中将这些操作封装为一个一个的方法。在测试用例中使用这些page类,进行组织测试步骤的工作。
    
    这样做的好处,就是有元素变化,只需要维护每一个Page就行了,测试步骤变化,只需要维护TestCase即可。
    

    PO实现案例:

    点击百度,输入123,点击搜索,找到好123的官网,进入,在官网找到百度地图,点击查看。

    案例分析

    page为3,第一页为百度搜索页,第二页为好123搜索页,第三页为百度地图展示页。根据PO模型的设计理念,基类的封装一般包括,定位,点击,输入发送请求等。因为是多页,所以unittest应该使用@classmethod实现,所以如下:

    basepage:基类   searchpage:页数       test_case:测试用例
    
    # base.py
    # 基类,实际上也就是封装-------把公共的方法封装起来,用的时候直接调用即可
    from selenium.webdriver.common.action_chains import ActionChains  # 鼠标操作
    
    
    class BasePageClass(object):
        def __init__(self, driver, url):
            self.driver = driver
            self.base_url = url
    
        # 进入网址
        def get(self):
            self.driver.get(self.base_url)
    
        # 元素定位,替代八大定位
        def get_element(self, *locator):
            return self.driver.find_element(*locator)
    
        # 点击
        def left_click(self, *locator):
            ActionChains(self.driver).click(self.get_element(*locator)).perform()
    
        # 输入
        def send_text(self, text, *locator):
            self.driver.find_element(*locator).send_keys(text)
    
        # 清除
        def clear_text(self, *locator):
            self.driver.find_element(*locator).clear()
    
    
    # search01.py
    # 继承基类。业务逻辑的实现。如果有多页,则有多个该文件
    from basepage.base import BasePageClass
    from selenium.webdriver.common.by import By
    
    
    class SearchPageClass01(BasePageClass):
        def __init__(self, driver, url):
            BasePageClass.__init__(self, driver, url)
    
        # 1.进入百度
        def go_baidu(self):
            self.get()
    
        # 2.定位百度输入框并清空发送文本
        def input(self, text):
            self.get_element(By.ID, "kw").click()
            self.send_text(text, By.ID, "kw")
    
        # 3.点击搜索按钮
        def click(self):
            self.left_click(By.ID, "su")
    
        # 4.定位好123点击
        def hao123(self):
            self.get_element(By.XPATH, ".//*[@id='1']/h3/a[1]").click()
    
    
    # search02.py
    # 继承基类。业务逻辑的实现。如果有多页,则有多个该文件
    from basepage.base import BasePageClass
    from selenium.webdriver.common.by import By
    
    
    class SearchPageClass02(BasePageClass):
        def __init__(self, driver, url):
            BasePageClass.__init__(self, driver, url)
    
        # 定位百度地图并点击
        def biumap(self):
            self.get_element(By.XPATH, ".//*[@id='userCommonSites']/ul/li[6]/div/a").click()
    
    
    # search03.py
    # 继承基类。业务逻辑的实现。如果有多页,则有多个该文件
    from basepage.base import BasePageClass
    
    class SearchPageClass03(BasePageClass):
        def __init__(self, driver, url):
            BasePageClass.__init__(self, driver, url)
    
    # test_01.py
    # 继承基类。业务逻辑的实现。如果有多页,则有多个该文件
    from basepage.base import BasePageClass
    
    class SearchPageClass03(BasePageClass):
        def __init__(self, driver, url):
            BasePageClass.__init__(self, driver, url)
    

    以上就是最简单的实现PO模型的全部内容

    如果要导入日志,报告,数据等其他的内容,可以参考博客:https://www.cnblogs.com/helenMemery/p/6687669.html

  • 相关阅读:
    【BNUOJ 4358】 左手定则
    【NOIP】关押罪犯
    【数算A】表达式·表达式树·表达式求值
    【POJ1679】The Unique MST
    【数算A】舰队、海域出击!
    【NOI2014】动物园
    【POJ1308】&&【HDU1272】Is It A Tree && 小希的迷宫
    【NOI2002】银河英雄传说
    html5之本地存储localStorage示例
    html5之应用缓存示例
  • 原文地址:https://www.cnblogs.com/zjldeboke/p/14886877.html
Copyright © 2011-2022 走看看