前言
本文的方法针对下面文章的框架而写
https://blog.csdn.net/weixin_40331132/article/details/106482043
框架源码下载:
https://download.csdn.net/download/weixin_40331132/85580645
框架源码中没有包含本文代码,请自行按照本文的步骤添加断言方法
针对这编文章中自动化框架的断言,很多人问我如何实现,当时写博客时没考虑断言场景,只是把框架搭建完成,让大家自行扩展,现在我在这里将如何实现断言详细步骤输出。
相信完整的学习完这个内容之后,应该更加熟练的自由扩展这个自动化框架了。
下面是断言用例的一个初始设计方案
如上图所示,实现断言,需要先获取断言对象的相关属性的值,然后通过对属性的值进行相关校验。来判断用例是否执行成功。
效果视频:
Web自动化框架断言实现
具体实现请仔细阅读后续。
1、设计用例方法关键字
1.1、获取元素属性值
获取元素属性值内容:
type,localtor,index这三个参数可以将目标元素定位到
value参数传入attribute(属性)类型,通过这个参数来取对应属性的值
返回参数是result 获取元素的value值,然后存放到${xxxxx}
变量中,图中变量就是${attr_value}
${attr_value}
,后面的用例行可以使用到,不理解可自行搜索自动化测试中的参数化知识点,此处不过多解释
2.1、断言
断言的内容
参数type,断言对像的数据类型,float(浮点型),int(整形 ),string(字符串)
参数locator, 断言方式:相等、不相等, 大于,小于
参数input, 断言对象,可以参数化
参数check, 判断值
逻辑就是通过 对断言对象 与 判断值 它俩是不是相等(或其它方式判断)得出结论用例是否通过
2、代码实现
2.1、实现获取元素属性值
在这个框架里面实现 ’获取元素属性值‘方法分三步骤
1、在webdriveroperator.py文件 WebdriverOperator 类里添加一个函数get_element_attribute_value实现业务代码
2、将函数在base.ini配置成方法关键字
3、编写用例调试功能
2.1.1 函数实现
编写下面代码之前,先在webdriveroperator.py添加两个import
#用来辅助联元素的方法
from selenium.webdriver.remote.webelement import WebElement
#存放变量的单例类
from basefactory.customfunctiontor import CaseData
在webdriveroperator.py文件 WebdriverOperator 类添加函数get_element_attribute_value
代码如下:
def get_element_attribute_value(self, **kwargs):
'''
获取元素属性值
kwargs:
result: 存放获取到元素值的变量
type: 定位器类型
locator:元素定位器
index:元素序号
'''
try:
res_params = kwargs['result']
type = kwargs['type']
locator = kwargs['locator']
attr_name = kwargs['input']
except KeyError:
return False, '[获取元素属性值]缺少传参'
try:
index = kwargs['index']
except KeyError:
index = 0
#先通过已有的获取元素方法获取到元素
isOK, result = self.find_element(type, locator, index)
#获取元素失败,将失败原因返回
if isOK is False:
return isOK, result
element: WebElement = result
try:
value = element.get_attribute(attr_name) #获取元素的属性值
setattr(CaseData, res_params, value) #将获取到的属性值 存放到 res_params 里去
except Exception as e:
return False, '[获取元素属性值]执行失败,具体原因:【{}】'.format(str(e))
return True, '[获取元素属性值]执行成功,已将元素【{}】的【{}】属性值【{}】存放到变量中'.format(locator, attr_name, value)
2.1.2 方法配置
在base.ini的【Function】下添加一行
获取元素属性值 = get_element_attribute_value
2.1.2 用例调试
编写用例:
id | result | keyword | type | locator | index | input | check | time |
---|---|---|---|---|---|---|---|---|
1 | 打开网页 | url | https://www.baidu.com | |||||
2 | 等待元素可见 | xpath | //*[@id=“kw”] | 3 | ||||
3 | 输入 | xpath | //*[@id=“kw”] | 飞人 | ||||
4 | 调用用例 | common-bai | ||||||
5 | 点击 | xpath | //*[@id=“su”] | |||||
9 | attr_value | 获取元素属性值 | xpath | //*[@id=“su”] | value |
直接看第9行用例,它表示:
获取 //*[@id=“su”] (百度按钮)的value 属性的值,存放到变量${attr_value}中
运行框架的入口文件 test_run.py
它自动运行,最终结果如下图
查看运行日志
调试成功,
2.1.3 html属性
html有很多属性,如下图(这时不一定全面)
里面红框标记的属性,都可以获取一些文字或数据,全部可以用来断言,要获取对应属性的值,只需要编写用例时,使用’获取元素属性值’,在input字段给出对应的属性名即可。
接下来可以实现断言方式了
2.2、实现断言
在这个框架里面实现 ’断言‘方法分三步骤
1、在webdriveroperator.py文件 WebdriverOperator 类里添加一个函数case_assert实现业务代码
2、将函数在base.ini配置成方法关键字
3、编写用例调试功能
2.2.1 函数
函数里需要两层判断,
第一层判断,断言对象的数据类型,不同数据类型,断言方式里的实现代码不相同
第二层判断,断言方式,针对不同的判断方式,写出不同逻辑代码与断言结果
在webdriveroperator.py文件 WebdriverOperator 类里添加函数case_assert
代码如下:
def case_assert(self, **kwargs):
'''
断言
kwargs:
type:断言对像的数据类型,float(浮点型),int(整形 ),string(字符串)
locator: 断言方式:相等、不相等, 大于,小于
input: 断言对象
check: 判断值
desc:通过 对断言对象 与 判断值 它俩是不是相等(或其它方式判断)得出结论用例是否通过
'''
try:
type = kwargs['type']
ass_func = kwargs['locator']
ass_obj = str(kwargs['input'])
check = str(kwargs['check'])
except KeyError:
return False, '缺少传参'
try:
if str.lower(type) == 'string':
if ass_func == '相等':
isOK, result = (True, '[断言]结果成功,断言对象【{}】与判断值【{}】相等'.format(ass_obj, check)) \
if ass_obj == check else \
(False, '[断言]结果失败,断言对象【{}】与判断值【{}】不相等'.format(ass_obj, check))
elif ass_func == '不等于':
isOK, result = (False, '[断言]结果失败,断言对象【{}】与判断值【{}】相等'.format(ass_obj, check)) \
if ass_obj == check else \
(True, '[断言]结果成功,断言对象【{}】与判断值【{}】不相等'.format(ass_obj, check))
elif ass_func == '包含':
isOK, result = (True, '[断言]结果成功,断言对象【{}】与包含判断值【{}】'.format(ass_obj, check)) \
if check in ass_obj else \
(False, '[断言]结果失败,断言对象【{}】与不包含判断值【{}】'.format(ass_obj, check))
else:
isOK, result = False, '[断言]执行失败,断言【{}】方法不正确,请给出正确的断言方法'.format(ass_func)
elif str.lower(type) == 'int' or str.lower(type) == 'float':
ass_obj, check = int(ass_obj), int(check) if str.lower(type) == 'int' else float(ass_obj), float(check)
if ass_func == '相等':
isOK, result = (True, '[断言]结果成功,断言对象【{}】与判断值【{}】相等'.format(ass_obj, check)) \
if ass_obj == check else \
(False, '[断言]结果失败,断言对象【{}】与判断值【{}】不相等'.format(ass_obj, check))
elif ass_func == '不等于':
isOK, result = (False, '[断言]结果失败,断言对象【{}】与判断值【{}】相等'.format(ass_obj, check)) \
if ass_obj == check else \
(True, '[断言]结果成功,断言对象【{}】与判断值【{}】不相等'.format(ass_obj, check))
elif ass_func == '大于':
isOK, result = (True, '[断言]结果成功,断言对象【{}】大于判断值【{}】'.format(ass_obj, check)) \
if ass_obj > check else \
(False, '[断言]结果失败,断言对象【{}】不大于判断值【{}】不相等'.format(ass_obj, check))
elif ass_func == '小于':
isOK, result = (True, '[断言]结果成功,小于对象【{}】大于判断值【{}】'.format(ass_obj, check)) \
if ass_obj < check else \
(False, '[断言]结果失败,断言对象【{}】不小于判断值【{}】不相等'.format(ass_obj, check))
else:
isOK, result = False, '[断言]执行失败,断言【{}】方法不正确,请给出下确的断言方法'.format(ass_func)
else:
isOK, result = False, '[断言]执行失败,原因【{}】类型不存在,请给出正确的数据类型'.format(type)
except Exception as e:
isOK, result = False, '[断言]执行失败,具体原因:【{}】'.format(str(e))
if isOK is False:
result += '。截图路径:' + self.get_screenshot_as_file()
return isOK, result
2.2.2 方法配置
在base.ini的【Function】下添加一行
断言 = case_assert
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FL4OtLnZ-1679198396310)(en-resource://database/1031:1)]
没配置方法,在用例中使用’断言‘,会提示’断言方法未注册‘
配置完成后,便可以在用例中使用’断言‘方法了
2.2.3 用例调试
下面演示断言成功与失败的两个案例
1)断言结果成功
编写用例如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-buaOhl2s-1679198396311)(en-resource://database/1033:1)]
用例(将图中的注释用例清掉版本):
id | result | keyword | type | locator | index | input | check | time |
---|---|---|---|---|---|---|---|---|
1 | 打开网页 | url | https://www.baidu.com | |||||
2 | 等待元素可见 | xpath | //*[@id=“kw”] | 3 | ||||
9 | attr_value | 获取元素属性值 | xpath | //*[@id=“su”] | value | |||
10 | 断言 | string | 相等 | ${attr_value} | 百度一下 |
执行框架入口文件 test_run.py,浏览器结果:
执行日志:
测试报告:
2)断言结果失败
将第id为10的用例的check改成 ’百度一下吧‘
用例如下:
id | result | keyword | type | locator | index | input | check | time |
---|---|---|---|---|---|---|---|---|
1 | 打开网页 | url | https://www.baidu.com | |||||
2 | 等待元素可见 | xpath | //*[@id=“kw”] | 3 | ||||
9 | attr_value | 获取元素属性值 | xpath | //*[@id=“su”] | value | |||
10 | 断言 | string | 相等 | ${attr_value} | 百度一下吧 |
执行结果 ,浏览器:
执行日志:
测试报告
调试断言成功,string字符类型的断言很稳定
至于int 与 float数据类型,看官们自己去用吧,用出问题可自行优化。
至此,断言方法已经实现。
本文也是复习了框架扩展新方法的知识点,学会了扩展即掌握了这个框架的精髓。