自动化测试之关键字驱动

其中Sheet1是连接移动设备的配置,剩下四张表是四个测试用例。

 

 

 

 conftest.py:

import pytest
import xlrd
from appium import webdriver

from action_util import Context

@pytest.fixture(autouse=True)
def driver():
    """
    从excel中读取配置信息,url以及caps配置项
    """
    excel_obj = xlrd.open_workbook(r"C:\Users\admin\Desktop\xlrd.xlsx")
    caps_sheet = excel_obj.sheet_by_name("Sheet1")
    url = caps_sheet.cell_value(0, 1)
    caps_keys = caps_sheet.col_values(0, 1)
    caps_values = caps_sheet.col_values(1, 1)
    caps = dict(zip(caps_keys, caps_values))

    # 连接移动设备,向Context中添加属性driver
    driver = webdriver.Remote(url, caps)
    setattr(Context,"driver",driver)

 Assert_util.py

class Assertkeys:
    @staticmethod
    def assert_equel(value1, value2, msg=None):
        assert value1 == value2, msg

    @staticmethod
    def assert_allin(value, obj, msg=None):
        for i in obj:
            assert value in i, msg

    @staticmethod
    def assert_in(value1, value2, msg=None):
        assert value1 in value2, msg

    @staticmethod
    def assert_not_empty(value, msg=None):
        assert value, msg

 action_util.py:

import time

import xlrd
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.webelement import WebElement
from Assert_util import Assertkeys


# 创建一个class,将从文件中读取的obj_name保存为class的属性
class Context:
    """
    存储上下文变量及其值
    """

    class Assertkeys(Assertkeys):
        """
        继承Assert_util中的Assertkeys,只需要修改Assertkeys中的方法
        """


def app_auto(sheet_name):
    # 连接移动设备
    driver = getattr(Context, "driver")

    """
    从excel中读取用例的action信息,组装成字典列表
    """
    excel_obj = xlrd.open_workbook(r"C:\Users\admin\Desktop\xlrd.xlsx")
    action_sheet = excel_obj.sheet_by_name(sheet_name)
    action_list = []
    action_keys = action_sheet.row_values(0)

    # 获取表格总行数,出去第一行是keys,剩下的都是values
    rows = action_sheet.nrows

    # 遍历组装数据,存放到action_list中
    for i in range(1, rows):
        action_values = action_sheet.row_values(i)
        action_list.append(dict(zip(action_keys, action_values)))
    # print(action_list)

    """
    遍历action_list,拿到每一个key对应的value方便后续的关键字驱动操作
    """
    for i in action_list:
        action_ = i.get("action", None)
        find_type_ = i.get("find_type", None)
        selector_ = i.get("selector", None)
        selector_value_ = i.get("selector_value", None)
        obj_name_ = i.get("obj_name", None)
        action_key_ = i.get("action_key", None)
        action_value_ = i.get("action_value", None)
        assert_type_ = i.get("assert_type", None)
        assert_value1_ = i.get("assert_value1", None)
        assert_value2_ = i.get("assert_value2", None)
        # print(action_, find_type_, selector_, selector_value_, obj_name_, action_key_, action_value_, assert_type_,
        # assert_value1_, assert_value2_)

        # 判断关键字是否为find,如果是进入find_element(s)定位元素流程
        if action_ == "find":

            if obj_name_:

                if selector_ and selector_value_:
                    # 存储的信息应该是WebElement或者是WebElement列表
                    setattr(Context, obj_name_,
                            driver.__getattribute__(find_type_)(by=getattr(AppiumBy, selector_), value=selector_value_))

                else:
                    raise ValueError("在文件中的第{}行,selector或selector_value不存在".format(action_list.index(i) + 2))

            else:
                raise ValueError("在文件中的第{}行,obj_name不存在".format(action_list.index(i) + 2))

        # 判断关键字是否为get_attribute,如果是进入获取元素属性流程
        if action_ == "get_attribute":

            if obj_name_:

                if action_key_ and action_value_:
                    obj = getattr(Context, action_key_)

                    if isinstance(obj, WebElement):
                        # 变量名 = 元素名.方法名(属性名)
                        # 存储的是元素的属性
                        setattr(Context, obj_name_, obj.__getattribute__(action_)(action_value_))

                    if isinstance(obj, list):
                        ele_list = [i.__getattribute__(action_)(action_value_) for i in obj]
                        setattr(Context, obj_name_, ele_list)

                else:
                    raise ValueError("在文件中的第{}行,action_key_或action_value_不存在".format(action_list.index(i) + 2))

            else:
                raise ValueError("在文件中的第{}行,obj_name不存在".format(action_list.index(i) + 2))

        # 判断关键字是否为assert,如果是进入断言流程
        if action_ == "assert":

            # 有两个值
            if assert_type_ and assert_value1_ and assert_value2_:
                assert_func_ = getattr(Context.Assertkeys, assert_type_)

                if assert_value1_.startswith("$"):
                    assert_value1_ = getattr(Context, assert_value1_.lstrip("$"), None)

                if assert_value2_.startswith("$"):
                    assert_value2_ = getattr(Context, assert_value2_.lstrip("$"), None)

                # print(assert_value1_, assert_value2_)
                assert_func_(assert_value1_, assert_value2_)
                print(assert_value1_, assert_value2_)
            # 只有一个值
            elif assert_type_ and assert_value1_ and not assert_value2_:
                assert_func_ = getattr(Context.Assertkeys, assert_type_)

                if assert_value1_.startswith("$"):
                    assert_value1_ = getattr(Context, assert_value1_.lstrip("$"), None)

            else:
                raise ValueError(
                    "在文件中的第{}行,assert_type或assert_value1或assert_value2不存在".format(action_list.index(i) + 2))

        # 判断关键字是否为click,如果是进入获取点击事件流程
        if action_ == "click":

            if action_key_:
                getattr(Context, action_key_).__getattribute__(action_)()

            else:
                raise ValueError("在文件中的第{}行,action_key不存在".format(action_list.index(i) + 2))

        # 判断关键字是否为send_keys,如果是为元素填入内容
        if action_ == "send_keys":

            if action_key_:
                obj = getattr(Context, action_key_)
                obj.__getattribute__(action_)(action_value_)

            else:
                raise ValueError("在文件中的第{}行,action_key_不存在".format(action_list.index(i) + 2))

        # 判断关键字是否为sleep,如果是则time.sleep规定秒数,等待元素加载
        if action_ == "sleep":

            if action_value_:
                time.sleep(int(action_value_))

            else:
                time.sleep(2)

 test_buexcel.py:

import xlrd
import pytest

from action_util import app_auto

"""
从excel中读取sheet信息
"""
excel_obj = xlrd.open_workbook(r"C:\Users\admin\Desktop\xlrd.xlsx")
#获取所有表名
sheets = excel_obj.sheet_names()
test_sheets = []
#获取test_开头的表名
for i in sheets:
    if i.startswith("test_"):
        test_sheets.append(i)

@pytest.mark.parametrize("sheet_name",test_sheets)
def test_(sheet_name):
    app_auto(sheet_name)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值