Python 从无到有搭建WebUI自动化测试框架之断言方法实现

前言

本文的方法针对下面文章的框架而写
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 用例调试

编写用例:

在这里插入图片描述

idresultkeywordtypelocatorindexinputchecktime
1打开网页urlhttps://www.baidu.com
2等待元素可见xpath//*[@id=“kw”]3
3输入xpath//*[@id=“kw”]飞人
4调用用例common-bai
5点击xpath//*[@id=“su”]
9attr_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)]

用例(将图中的注释用例清掉版本):

idresultkeywordtypelocatorindexinputchecktime
1打开网页urlhttps://www.baidu.com
2等待元素可见xpath//*[@id=“kw”]3
9attr_value获取元素属性值xpath//*[@id=“su”]value
10断言string相等${attr_value}百度一下

执行框架入口文件 test_run.py,浏览器结果:
在这里插入图片描述

执行日志:
在这里插入图片描述

测试报告:
在这里插入图片描述

2)断言结果失败

将第id为10的用例的check改成 ’百度一下吧‘
用例如下:

idresultkeywordtypelocatorindexinputchecktime
1打开网页urlhttps://www.baidu.com
2等待元素可见xpath//*[@id=“kw”]3
9attr_value获取元素属性值xpath//*[@id=“su”]value
10断言string相等${attr_value}百度一下吧

执行结果 ,浏览器:
在这里插入图片描述

执行日志:
在这里插入图片描述

测试报告
在这里插入图片描述

调试断言成功,string字符类型的断言很稳定
至于int 与 float数据类型,看官们自己去用吧,用出问题可自行优化。
至此,断言方法已经实现。

本文也是复习了框架扩展新方法的知识点,学会了扩展即掌握了这个框架的精髓。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魂尾ac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值