zoukankan      html  css  js  c++  java
  • po模型

    一、Po模型介绍

    1.简介

    在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相同),通常PO模型可以大大提高测试用例的维护效率

    2.为什么要用PO

    基于python selenium2开始ui自动化测试脚本的编写不是多么艰巨的任务。只需要定位到元素,执行对应元素的操作即可。我们所能做的就是元素的定位,然后进行键盘输入或鼠标动作。但随着时间的迁移,测试套件将持续的增长。脚本也将变的越来越多。如果我们需要维护10个页面,100个页面,甚至1000个呢?那么页面元素的任何改变都会让我们的脚本维护变得繁琐复杂,而且变得耗时易出错。那怎么解决呢?ui自动化中,常用的一种方式,引入Page Object(PO):页面对象模式来解决,po能让我们的测试代码变得可读性更好,可维护性高,复用性高。

    3.PO的优势

    1、PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰。
    2、页面对象与用例分离,使得我们更好的复用对象。
    3、可复用的页面方法代码会变得更加优化
    4、更加有效的命名方式使得我们更加清晰的知道方法所操作的UI元素。
    # 总结:
    重用,业务和对象分离,代码结构清晰,方便代码维护

    二、Po的设计模式

     三、PO的核心要素

    1.在PO模式中抽离封装集成一个BasePage类,该基类应该拥有一个只实现webdriver实例的属性
    2.每一个page都继承BasePage,通过driver来管理本page中元素,将page中的操作封装成一个个方法
    3.TestCase继承unittest.Testcase类,并依赖page类,从而实现相应的测试步骤
    # 总结
    PO设计模式中的BasePage基类对应案例中的BasePage.py文件
    PO模式中的pages中的案例显示Search.py
    PO模式设计中TestCase对应案例中的TestCase.py

     四、非PO实现

    # 代码展示
    from selenium import webdriver
    from time import sleep
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    driver.find_element_by_id("kw").send_keys("jack")
    sleep(1)
    driver.find_element_by_id("su").click()
    sleep(2)
    driver.quit()
    # 代码分析
    不同的运行脚本环境,游览器不同:驱动webdriver.Firefox()可以剥离;
    请求地址的变化(生产环境和测试环境):url = http://www.baidu.com可以剥离;
    操作元素时,常常要等待元素加载完成方可进行操作:可以把webdriver提供的find_element*方法封装,在元素操作前,先判断元素是否可以操作;
    实际测试场景中,可能有多个测试场景,如果每个测试场景都需要维护url,游览器驱动,元素定位等,效率会非常低;
    因此基于以上分析,是否可以设计一个所有测试界面(selenium本身是B/S系统开展测试)的基类,来维护公共的方法,此处定义名字为BasePage.py,用于存放页面公共方法及webdriver原有方法二次封装等。

    五、PO实现(多个 page界面)

    1.Base基类(base.py)

    from selenium.webdriver.common.action_chains import ActionChains  # 鼠标操作
    
    
    class BasePage():
        """初始化方法"""
    
        def __init__(self, dir, url):
            self.dir = dir  
            self.url = url  
    
        """进入网址的方法"""
    
        def enter_url(self):
            self.dir.get(self.url)
    
        """定位元素"""
    
        def find_element(self, *args):
            return self.dir.find_element(*args)
    
        """点击"""
    
        def click_element(self, *args):
            ActionChains(self.dir).click(self.find_element(*args)).perform()
    
        """输入"""
    
        def send_element(self, text, *args):
            self.dir.find_element(*args).send_keys(text)
    
        """清除"""
    
        def clear_element(self, *args):
            self.dir.find_element(*args).clear()
    
        """表单切换"""
    
        def switch_iframe(self, *args):
            self.dir.switch_to.frame(self.dir.find_element(*args))
    
        """窗口切换"""
    
        def switch_window(self, n):
            self.dir.switch_to.window(self.dir.window_handles[n])

    2.Pages查找页面元素类(hao.py和bddt.py)

    # hao.py
    from Base.base import BasePage
    from selenium.webdriver.common.by import By
    from selenium import webdriver
    
    
    class SearchPage(BasePage):
        """初始化"""
    
        def __init__(self, dir, url):
            BasePage.__init__(self, dir, url)
    
        """进入百度"""
    
        def enter_bd(self):
            self.enter_url()
    
        """输入搜索内容"""
    
        def ssnr(self, text):
            self.send_element(text, By.ID, "kw")
    
        """点击百度一下按钮"""
    
        def clickff(self):
            self.click_element(By.ID, "su")
    # bddt.py
    from Base.base import BasePage
    from selenium.webdriver.common.by import By
    from selenium import webdriver
    
    
    class SearchPage2(BasePage):
        """初始化"""
    
        def __init__(self, dir, url):
            BasePage.__init__(self, dir, url)
    
        """点击进入hao123"""
    
        def clickenter(self):
            self.click_element(By.CSS_SELECTOR, ".t>a")
    
        """切换句柄hao123"""
    
        def qiehuan(self, n):
            self.switch_window(n)
    
        """点击百度地图"""
    
        def clickbddt(self):
            self.click_element(By.CSS_SELECTOR, ".js_bd > li:nth-child(6) > div:nth-child(1) > a:nth-child(1)")

    3.Case测试用例(test001.py)

    import unittest
    from selenium import webdriver
    from Pages.hao import SearchPage
    from Pages.bddt import SearchPage2
    import time
    
    class Test01Class(unittest.TestCase):
        @classmethod
        def setUpClass(cls) -> None:
            cls.dir = webdriver.Firefox()
            cls.dir.implicitly_wait(30)
    
        def test01(self):
            url = "http://www.baidu.com"
            s = SearchPage(self.dir, url)
            s.enter_bd()
            s.ssnr("123")
            s.clickff()
    
            # self.dir.switch_to.window(self.dir.window_handles[-1])
    
        def test02(self):
            url = ""
            b = SearchPage2(self.dir, url)
            b.clickenter()
            b.qiehuan(1)
            time.sleep(10)
            b.clickbddt()
    
        @classmethod
        def tearDownClass(cls) -> None:
            cls.dir.quit()
            pass
    
    
    if __name__ == '__main__':
        unittest.main()
  • 相关阅读:
    vs整合MySQL和QT
    VS2019中QT连接及使用
    JavaScript 进阶入门
    解决MySQL workbench的resultgird不出现的问题
    JavaScript入门
    CSS学习
    Linux下如何查看tomcat是否启动、查看tomcat启动日志
    oracle常见的函数
    java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter
    位运算(&、|、^、~、>>、<<)
  • 原文地址:https://www.cnblogs.com/niuniu0328/p/14887116.html
Copyright © 2011-2022 走看看