zoukankan      html  css  js  c++  java
  • selenium3 web自动化测试框架 三:项目实战中PO模型的设计与封装

    po模型设计思想


      Page Object 模式主要是将每个页面设计为一个class,其中包含页面中的需要测试的元素(按钮,输入框,标题等),这样在Selenium测试页面中可以通过调取页面类来获取页面元素,这样避免当页面元素id或者位置变化后,需要改测试代码。当元素ID变化时,只需要改测试页面Class中的页面属性即可。将页面定位与和业务分开,分离测试对象(元素对象)和测试脚本(用例脚本),提高可维护性。

      Page Object模式是一种自动化测试设计模式,将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),提高用例的可维护性。

           unittest是一种单元测试框架,用于设计各式各样的测试用例,可调用PageObject设计的页面类(对象),设计出更加可维护的用例。它提供用例组织与执行,提供丰富的比较(断言)方法,提供丰富的日志,统一适用于web自动化用例的开发与执行。

        How Google Test(谷歌测试之道),书中对web产品测试就分为敏捷测试金字塔的三层,并且工作量配比是,Unit(单元测试):70%,Service(API):20%,UI(GUI):10%。

      所以UI自动化最核心的问题定位是,跟业务层解耦出来,单独处理定位的问题,然后在实现业务层。所使用到的方法是对一个UI页面做测试我们抽取为三层,举例为BasePage+LoginPage+Unittest。   

      后续示例中,PO模型的基本思路:register_page(查找页面元素类) —> register_handle(操作层,将查找到的元素位置上传递数据) —> register_business(业务层:调用操作层,根据操作层的传递的结果进行判断场景,如邮箱错误场景等) —> first_case(封装调用业务层,进行测试用例的场景组装)

    po模型之如何设计操作层


    查找页面元素类:把定位页面元素的方法都封装在相应的一个相应页面中,此页面的元素定位方式都可以在这个文件中找到

    操作层:编写注册过程中需要的方法,比如输入用户名、密码等页面操作,工具类-保存页面操作的所有方法。

    业务层:把操作层组装起来

    查找页面元素类:register_page.py

    操作层:register_handle.py

    业务层:register_business.py

    找找页面元素类


     示例代码:register_page.py

    # -*-  coding:utf-8 -*-
    from  util.find_elemnet import FindElement
    
    class RegisterPage():
        def __init__(self,driver):
            self.find_element = FindElement(driver)
    
        def get_email_element(self):
            return self.find_element.get_element("element_email")
    
        def get_name_elemnet(self):
            return self.find_element.get_element("element_name")
    
        def get_pwd_element(self):
            return self.find_element.get_element("element_pwd")
    
        #错误信息校验
        def get_email_error_info(self):
            return self.find_element.get_element("element_email_error")
    
        def get_name_error_info(self):
            return self.find_element.get_element("element_name_error")
    
        def get_pwd_error_info(self):
            return self.find_element.get_element("element_pwd_error")

    操作层


     示例代码:register_handle.py

    # -*-  coding:utf-8 -*-
    from selenium import webdriver
    
    from page.register_page import RegisterPage
    
    class RegisterHandle(object):
    
        def __init__(self,driver):
            self.register_p = RegisterPage(driver)
    
        #输入邮箱
        def send_user_email(self,email):
            self.register_p.get_email_element().send_keys(email)
    
        #输入用户名
        def send_user_name(self,name):
            self.register_p.get_name_elemnet().send_keys(name)
    
        #输入密码
        def send_user_pwd(self,pwd):
            self.register_p.get_pwd_element().send_keys(pwd)
    
        #获取错误提示信息
        def get_user_text(self,info,user_info):
            text = None
            if info == "element_email_error":
                text = self.register_p.get_email_error_info().get_attribute("value") #value是html标签中的属性值
            elif info == "element_name_error":
                text = self.register_p.get_name_error_info().get_attribute("value")
            elif info == "element_pwd_error":
                text = self.register_p.get_pwd_error_info().get_attribute("value")
            else:
                print("参数输入参数值有误")
            return text
    
    if "__name__" == "__main__":
        pass

    业务层


    示例代码:register_business.py

    # -*-  coding:utf-8 -*-
    from handle.register_handle import RegisterHandle
    from selenium import webdriver
    
    class RegisterBusiness():
        def __init__(self,driver):
            self.register_h = RegisterHandle(driver)
    
        def base_case(self,email,name,pwd):
            self.register_h.send_user_email(email)
            self.register_h.send_user_name(name)
            self.register_h.send_user_pwd(pwd)
    
        #校验邮箱输入错误
        def email_error(self,email,name,pwd):
            self.base_case(email,name,pwd)
            if self.register_h.get_user_text("element_email_error","请输入有效的电子邮件地址") == None:
                print("邮箱校验不成功")
                return AssertionError
            else:
                return False
    
    
    if __name__ == "__main__":
        driver = webdriver.Chrome()
        driver.get("http://www.5itest.cn/register")
        testcase1 = RegisterBusiness(driver)
        testcase1.base_case("111","222","111")
  • 相关阅读:
    Leetcode Plus One
    Leetcode Swap Nodes in Pairs
    Leetcode Remove Nth Node From End of List
    leetcode Remove Duplicates from Sorted Array
    leetcode Remove Element
    leetcode Container With Most Water
    leetcode String to Integer (atoi)
    leetcode Palindrome Number
    leetcode Roman to Integer
    leetcode ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/wuzhiming/p/11768889.html
Copyright © 2011-2022 走看看