【python自动化】使用关键字驱动实现appium自动化
创始人
2024-01-21 15:08:46

在写app自动化用例时,尝试用了关键字驱动的框架

        记录一下自己对关键字驱动的理解

        1 关键字驱动指将用例步骤的操作封装为关键字,比如定位元素、点击元素、获取元素属性值、断言,这些都是操作关键字

        2 在excel中按照用例执行过程,填写操作关键字以及要执行操作指令需要用到的参数信息及操作后保存的对象名

        3 封装的代码框架,可以实现读取excel用例文件,拿到关键字操作及对应的参数

        4 然后按照关键字动作传入对应的参数,去执行

关键点:

1)将用例步骤抽象出关键字

2)怎么执行excel中存放的字符串对应的方法

3)怎么将执行的结果存放到excel指定名称的变量

关键点的解决思路:

1)抽象关键字这一点:

ui用例主要的动作就是找元素、点击、输入、执行脚本、断言、获取属性,其他特殊的需要单独取思考封装

在模型中按照具体的action类型去判断:

if action_ == 'find':

#执行find_element

if action_ =='send_keys':

#对指定元素做输入操作

2)怎么执行excel中存放的字符串对应的方法

这里使用的是string的反射机制、利用类对象的__getattribute__(funcname)()实现动态调用类对象的方法

比如:find操作分为find_element、find_elements,那怎么让driver执行具体的函数?

driver.__getattribute__(find_)(getattr(AppiumBy,selector_),selector_value_)

其中find_是获取的excel定义的调用哪个find方法,值是find_element、find_elements

driver.__getattribute__(find_)就是返回find_element或find_elements函数的引用,就是driver.find_element()或driver.find_elements

getattr(AppiumBy,selector_)是按照excel中指定的定位类型XPATH、ID动态获取AppiumBy类变量值

driver.__getattribute__(find_)(getattr(AppiumBy,selector_),selector_value_)就等于

driver.find_elements(AppiumBy.ID,selector_value_)    假设selector_是ID

 3)怎么将执行的结果存放到excel指定名称的变量?

先解释一下场景:

通过driver.__getattribute__(find_)(getattr(AppiumBy,selector_),selector_value_)返回了一个Weblement对象,需要赋值变量名为excel中定义的save_object值。假设save_object的值为ele1

如果直接写save_object =driver.__getattribute__(find_)(getattr(AppiumBy,selector_),selector_value_)

那save_object 这个变量的值的appUI 元素,而不是ele1=ui元素赋值

如何给指定变量名的变量赋值?

可以通过自定义一块空间,然后对内存空间进行属性名、属性值的赋值 setattr()

实例化类的时候就会申请一块空间

故创建一个Context类,在需要赋值给设定的变量时

使用setattr(context,destname,destvalue)去设定,还是看刚才的例子,可以通过下面代码将find_element()返回的元素赋值给save_obj_指定的变量名

setattr(Context,save_obj_,driver.__getattribute__(find_)(getattr(AppiumBy,selector_),selector_value_))

后续通过getattr(context,obj_name)拿到obj_name这个变量名的值

下面是具体的框架实现,仅简单实现了3个用例,(关键字驱动的util中没有做封装,侧重理解如何实现关键字驱动)

关键字驱动用例的excel文件:

 关键字驱动的关键执行方法:

'''
关键字驱动
'''
import xlrd
from appium.webdriver import WebElement
from appium.webdriver.common.appiumby import AppiumBy
from appium.webdriver.webdriver import WebDriverfrom util.assertUtil import AssertUtilclass Context():pass
def runexcel_case(driver: WebDriver,casename):file = xlrd.open_workbook(filename = 'E:/pythonProjects/appproject/device.xlsx')sheet = file.sheet_by_name(casename)case_key = sheet.row_values(0)rownum = sheet.nrowscase=[]#获取所有用例步骤for i in range(1,rownum):data = sheet.row_values(i)case.append(dict(zip(case_key,data)))for step in case:action_ = step.get('action',None)#如果用step['action'],当step没有action会抛异常,action指操作有定位元素、点击、输入等操作find_ = step.get('find', None)# 定位元素,是find_element、还是find_elementsselector_ = step.get('selector', None)#定位元素的类型selector_value_ = step.get('selector_value', None)#定位元素的值save_obj_ = step.get('save_object', None)#将操作的结果保存的对象名operate_obj_ = step.get('operate_object', None)#对哪个对象进行操作inputtext_ = step.get('inputtext', None)#输入操作的驶入内容attribute_value_ = step.get('attribute_value', None)#获取对象什么属性if action_ == 'find':if save_obj_:if selector_ and selector_value_:# driver.find_element(getattr(AppiumBy,selector_),selector_value_)#使用getattr(AppiumBy,selector_) 将excel定义的ID、XPATH按照字符串取到AppiumBy中对应的定位值setattr(Context,save_obj_,driver.__getattribute__(find_)(getattr(AppiumBy,selector_),selector_value_))#driver.__getattribute__(find_)通过对象按照传入的参数,执行对象指定的方法,# 如果是find_element就执行find_element,如果是find_elements就执行find_elements,#思考: 需要考虑将find查找到的对象用save_object定义的变量名的变量去接收,需要自定义一块空间,然后利用setattribute将值赋给指定的变量else:raise ValueError('在用例文件{}行缺少定义selector_或selector_value_的值'.format(case.index(step)))passelse:raise ValueError('在用例文件{}行缺少定义save_obj的值'.format(case.index(step)))if action_ == 'click':if operate_obj_:getattr(Context,operate_obj_).__getattribute__(action_)()else:raise ValueError('在用例文件{}行缺少定义operate_obj_的值'.format(case.index(step)))if action_ =='send_keys':if operate_obj_:if inputtext_:getattr(Context, operate_obj_).__getattribute__(action_)(inputtext_)else:raise ValueError('在用例文件{}行缺少定义inputtext_的值'.format(case.index(step)))else:raise ValueError('在用例文件{}行缺少定义operate_obj_的值'.format(case.index(step)))if action_ =='get_attribute':if save_obj_:if operate_obj_ :if attribute_value_:ele_obj = getattr(Context,operate_obj_)if isinstance(ele_obj,WebElement):#如果是find_element返回的是单个元素setattr(Context,save_obj_,ele_obj.__getattribute__(action_)(attribute_value_))if isinstance(ele_obj, list):#如果是find_elements返回的是listsetattr(Context,save_obj_,[i.__getattribute__(action_)(attribute_value_)for i in ele_obj])else:raise ValueError('在用例文件{}行缺少定义attribute_value_的值'.format(case.index(step)))else:raise ValueError('在用例文件{}行缺少定义operate_obj_的值'.format(case.index(step)))passelse:raise ValueError('在用例文件{}行缺少定义save_obj_的值'.format(case.index(step)))if action_ == 'assert':assert_type_=  step.get('assert_type',None)assert_value_ = step.get('assert_value',None)expect_value_  = step.get('expect_value',None)if assert_value_:if str(assert_value_).find('$') == 0:# 需要取变量assert_value_ = getattr(Context, str(assert_value_).lstrip('$'))if str(expect_value_).find('$') == 0:expect_value_ = getattr(Context, str(expect_value_).lstrip('$'))if assert_type_ and assert_value_:if assert_type_ == 'assert_textin':AssertUtil.assert_text_in(getattr(Context,assert_value_),expect_value_,'{}不在{}中'.format(expect_value_,assert_value_))if assert_type_ == 'assert_equal':assert assert_value_ == expect_value_,"实际值{}与期望值{}不相等".format(assert_value_,expect_value_)if assert_type_ == 'assert_not_none':assert assert_value_ ,'期望值{}是None'.find(assert_value_)else:raise ValueError('在用例文件{}行缺少定义assert_type_的值'.format(case.index(step)))

testcase文件:

    @pytest.mark.skipdef test_02(self):#casedesc:验证搜索书籍功能runexcel_case(self.driver,'case01')@pytest.mark.skipdef test_03(self):#验证书城初始页面加载的是其他类型的书籍列表runexcel_case(self.driver,'case02')def test_04(self):#验证加入书架功能runexcel_case(self.driver,'case03')

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
1和0什么意思网络用语 0和1... 最近,有网友给大家出了份考卷,卷面是几位“00后”的QQ对 话:dbq、xswl、nss、nbcs、...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
七大洲八大洋 七大洲简易图三角... 一、北美洲(中北美和加勒比海)北美洲面积约2471万平方公里,居世界第三。人口约5.79亿(2016...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...