zoukankan      html  css  js  c++  java
  • 十、PageObject

    一、PageObject页面对象

    页面对象:会把某个网页页面封装成对象

    对象

    • --属性:元素定位器、URL、标题

    • --方法:元素定位、点击、拖拽(在页面做了某个动作,执行了某步操作)

    pageobject原则:

    是不是所有的动作都需要封装成页面对象的方法:

    • --可以封装

    • --不必要这么做

    • --遵循的原则,你用到了什么行为,就封装什么行为

    封装的页面的返回值

    • --self  或者是其他的页面

    • --如果需要获取某个元素或者属性,就直接返回元素本身或该属性的值

    • --如果一个操作可能会有多个结果,比如进行页面调转或者本页面,那就根据结果封装成多个方法

    PageObject好处:

    • --可读性。PO模式函数名本身具有注释的功能

    • --可维护性。修改一个地位可全局修改,不需要一个个修改

    • --扩展性。当有新功能需要实现,更加方便

    • --页面逻辑和测试逻辑分离。

    • --可复用性。重复使用

    测试用例编写:

    • -- 1.初始化页面

    • --2.调用页面逻辑操作,目的是获取实际结果

    • --3.结果对比

     二、数据分组

    分组的依据:测试步骤不一致

    保存用例,不要通过excel1去管理:

    • --用py文件

    • --用ymal文件,也支持字典格式

    py文件进行测试用例的管理:data目录下login_data.py

    """登录测试用例数据"""
    
    #登录失败数据
    data_error = [
        {"username":"","password":"","expected_results":"请输入手机号"},
        {"username":"123","password":"","expected_results":"请输入正确的手机号"}
    ]
    
    #登录成功用例
    data_success = [
        {"username": "18621346545", "password": "12345678", "expected_results": "我的帐户[小样儿]"}
    
    ]

    test_login()测试用例

    """登录功能的测试用例"""
    
    import pytest
    from middware.pages.login import LoginPage
    from data.login_data import data_error,data_success
    from middware.handler import HandlerMiddle
    #获取excel中login数据
    # data = HandlerMiddle.excel.read_data("login")
    
    
    @pytest.mark.login
    class TestLogin:
        """登录功能的测试类"""
    
        @pytest.mark.error
        @pytest.mark.parametrize("test_info",data_error)
        def test_login_error(self,test_info,driver):
           """登陆失败用例"""
    
           #初始化 操作的页面 对象
           login_page  = LoginPage(driver)
    
           #测试步骤:输入用户名、密码、登录(调用po中的方法)
           actual_result =login_page.login_fail(username=test_info["username"],
                            password=test_info["password"]).get_error_info()
    
           # 断言
           expected_result = test_info["expected_results"]
           try:
            assert actual_result in expected_result
           except AssertionError as e:
               HandlerMiddle.logger.error("测试用例username为{},不通过!".format(test_info["username"]))
               raise e
    
    
        @pytest.mark.success
        @pytest.mark.parametrize("test_info",data_success)
        def test_login_success(self,test_info,driver):
            """登录成功测试用例"""
    
            #初始化页面对象
            login_page = LoginPage(driver)
    
            #执行测试,获取实际结果,
            actual_result = login_page.login_success(username=test_info["username"],
                            password=test_info["password"]).get_account_name()
    
            #断言
            try:
                assert actual_result in test_info["expected_results"]
            except AssertionError as e:
                HandlerMiddle.logger.error("测试用例username为{},不通过!".format(test_info["username"]))
                raise e

    三、locator分层

    1)优化URL

    将域名host放在yaml配置文件中管理,将URL作为类属性。

    URL  =HandlerMiddle.yaml_data["host"] + "/Index/login.html"

    2)将访问页面单独进行封装

    """登录页面"""
    from middware.pages.index import IndexPage
    from middware.handler import HandlerMiddle
    
    
    class LoginPage:
        """登录"""
        URL  =HandlerMiddle.yaml_data["host"] + "/Index/login.html"
    
        #初始化driver
        def __init__(self,driver):
            self.driver = driver
    
        def get(self):
            """访问页面"""
            self.driver.get(self.URL)
            return self
    
        def login_fail(self,username,password):
            # 输入用户名和密码,点击登录进行提交
            self.enter_username(username)
            self.enter_password(password)
            self.driver.find_element_by_class_name("btn-special").click()
            return self
    
        def login_success(self,username,password):
            # 输入用户名和密码,点击登录进行提交
            self.enter_username(username)
            self.enter_password(password)
            self.driver.find_element_by_class_name("btn-special").click()
            return IndexPage(self.driver)
    
        def enter_username(self,username):
            # 输入用户名
            self.driver.find_element_by_name("phone").send_keys(username)
            return self
    
        def enter_password(self,password):
           # 输入密码
            self.driver.find_element_by_name("password").send_keys(password)
            return self
    
        def get_error_info(self):
           # 获取登录失败的错误信息
            return self.driver.find_element_by_class_name("form-error-info").text
    actual_result =login_page.get().login_fail(username=test_info["username"],password=test_info["password"]).get_error_info()

    3)优化元素定位

    将元素定位locators,提取出来

    • locators是跟页面LoginPage绑定在一起的,是该页面的属性,所以可以提取出来作为类属性;

    • find_element()方法,源码中的2个参数为:by,value,即定位的方式,和值。调用locator的元组()表示方式)),用*args进行元组解包;调用locator的字典{}表示方式,用**args进行字典解包

    eg元组表示:

    login_btn_locator = ("name","btn-special")

    调用:

    def login_fail(self,username,password):
            self.enter_username(username)
            self.enter_password(password)
            self.driver.find_element(*self.login_btn_locator).click()
            return self

    eg字典表示:

    login_btn_locator = {"by":"name","value":"btn-special"}

    调用:

    def login_fail(self,username,password):
            self.enter_username(username)
            self.enter_password(password)
            self.driver.find_element(**self.login_btn_locator).click()
            return self
  • 相关阅读:
    php xdebug的配置、调试、跟踪、调优、分析
    alpine使用的避坑指南
    nginx fastcgi模块ngx_http_fastcgi_module详细解析、使用手册、完整翻译
    深入理解 Kubernetes 资源限制:CPU
    使用xdebug对php做性能分析调优
    alpine安装sshd/ssh server
    冒泡排序的终极改进优化
    基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建
    NPM使用
    NodeJS学习历程
  • 原文地址:https://www.cnblogs.com/zhangjx2457/p/13840704.html
Copyright © 2011-2022 走看看