其中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)