十、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
原文地址:https://www.cnblogs.com/zhangjx2457/p/13840704.html