关键字驱动测试框架(二)_执行excel

关键字函数封装好了接下来就是写测试脚本了。

一.测试脚本

在TestCases包下面创建文件,然后还是老样子,要获取excel表格里的数据,因此我们在文件里创建一个操作excel的对象
在这里插入图片描述
先读取excel里第一个sheet,也就是测试用例,如果里面的每一行的是否执行为y,那就根据这一行里sheet名数据去读取对应的sheet
在这里插入图片描述

到这一步为止的代码如下:
在这里插入图片描述

读取到login这个sheet之后,接下来就是根据该sheet里的内容来写测试步骤了。相应的代码在前一个项目WEB UI里面已经写过一次了。
继续写,获取excel表格里的数据
在这里插入图片描述

构造函数表达式
在这里插入图片描述

注意这里的操作元素定位方式,定位方式表达式,操作值三个关键字每个步骤都可能只在其中的一两个关键字有值,所以要做判断,考虑到所有的情况
在这里插入图片描述

贴一下这里拼接函数所有情况
在这里插入图片描述

得到这些字符串之后接下来就是把这些字符串当作函数来执行了
使用函数eval,eval可以把传入的字符串当作表达式来执行
在这里插入图片描述

但仅仅这样报错,说函数未定义,这是因为我们的函数是定义在Action/elementAction.py里的,这个文件我们没有导入

from Action.elementAction import *

导入所有函数,然后再来执行文件

运行成功
在这里插入图片描述

刚刚完成的获取excel的值,然后生成字符串,最后执行字符串所代表的函数就是关键字驱动框架的核心了。
贴一下代码

from ConfigFiles.ConfigPath import xlsxPath
from Utils.ExcelOperate import ExcelOperate
from Action.elementAction import *

excel = ExcelOperate()
excel.load_workbook(xlsxPath)

def test_run():
    excel.get_sheet_by_name('测试用例')
    row_nums = excel.get_rows_nums()
    for i in range(2,row_nums+1):
        #判断用例是否需要执行
        if excel.get_cell_value(i,5) == 'y':
            step_sheet = excel.get_cell_value(i,4)
            # 读取对应的页
            excel.get_sheet_by_name(step_sheet)
            # 拿到相应的步骤数
            step_nums = excel.get_rows_nums()
            for j in range(2,step_nums+1):
                temp_row_value = excel.get_row_values(j)
                # 获取该行内各个单元格的数据
                index = temp_row_value[0]
                desc = temp_row_value[1]
                key_word = temp_row_value[2]
                location_type = temp_row_value[3]
                location_key = temp_row_value[4]
                value = temp_row_value[5]
                # 构造函数表达式
                # 定位方式和定位表达式为空,操作值不为空,比如get_url,sleep
                method_express = ''
                if value and location_type is None and location_key is None:
                    if isinstance(value,int):
                        method_express = key_word + "(" + str(value) +")"
                    else:
                        method_express = key_word + "('" + value + "')"

                # 只有关键字不为空
                if location_type is None and location_key is None and value is None:
                    method_express = key_word + "(" + ")"

                # 只有操作值为空
                if value is None and location_key and location_type:
                    method_express = key_word + "('" + location_type + "'" + "," + "'" +location_key + "')"

                # 都不为空
                if value and location_type and location_key:
                    if isinstance(value,int):
                        method_express = key_word + "('" + location_type + "'" + "," + "'" + location_key + "'" + "," +  str(value) + ")"
                    else:
                        method_express = key_word + "('" + location_type + "'" + "," + "'" +location_key + "'" + "," + "'" + value + "')"

                # 执行上面构造的函数
                eval(method_express)



if __name__ == '__main__':
    test_run()

二.发送邮件

登录的步骤通过关键字成功实现了,再把发送邮件的步骤实现一遍。
登录因为只需要涉及两三个元素的操作,所以比较简单,发送邮件可能遇到更多复杂的情况。
我们可以现在项目下建一个.py文件,先写一段线性的流程,实现登录并发送邮件再说。
在实际定位操作过程中,根据css的name名定位,可能在一个页面中有多个同名的css,如下
我想要给邮件输入一个主题,根据css定位,但输到右上角了,两者的css的name名一样
在这里插入图片描述

在这里插入图片描述

所以这里应该用find_elements_by_class_name
把语句改成

driver.find_elements_by_class_name(‘nui-ipt-input’)[2].send_keys(‘test_title’)

这样就可以运行成功了
在这里插入图片描述

还有其他一些注意点比如切换iframe等就不细说了
贴一下代码

import time

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://mail.163.com/')
driver.maximize_window()

iframe = driver.find_element_by_tag_name('iframe')
driver.switch_to.frame(iframe)
driver.find_element_by_name('email').send_keys('lsq1176701245')
driver.find_element_by_name('password').send_keys('19980312lsq')
driver.find_element_by_id('dologin').click()
time.sleep(2)

# 发送邮件
driver.find_element_by_xpath('/html/body/div[1]/nav/div[1]/ul/li[2]').click()
time.sleep(2)
driver.find_element_by_class_name('nui-editableAddr-ipt').send_keys('1176701245@qq.com')
driver.find_elements_by_class_name('nui-ipt-input')[2].send_keys('test_title')

i_frame  = driver.find_element_by_class_name('APP-editor-iframe')
driver.switch_to.frame(i_frame)

driver.find_element_by_class_name('nui-scroll').send_keys('this is content')

driver.switch_to.default_content()
driver.find_element_by_xpath('/html/body/div[2]/div[1]/div[2]/div[1]/section/footer/div[1]/span[2]').click()

发送邮件成功
在这里插入图片描述

这个线性代码写完之后接下来可以完善项目里的代码了
先把excel里的数据完善一下,就根据这个线性代码把发送邮件的流程写一下
在这里插入图片描述

中间有个步骤会获取多个同样的classname名,我们需要用的是第二个,所以要传两个参数进去,因此这个步骤的关键字也要特殊处理,不能用之前的input_content
因为之前只写过的寻找元素的函数都是直接找到,没有写过这种找到同名元素然后取第二个的情况,所以要把函数更新一下
在封装的find_element函数下面新增一个查找多个元素的函数
在这里插入图片描述

贴一下修改后的代码,其实就是把上一个函数里的element改成elements,其他的都没变

from selenium.webdriver.support.wait import WebDriverWait

#将selenium读取页面元素的方法封装在此文件内
def find_element(driver,find_type,find_key):
    # element = driver.find_element(by=find_type,value=find_key)
    # return  element
    try:
        element = WebDriverWait(driver,3).until(lambda driver:driver.find_element(by = find_type,value = find_key))
        return element
    except Exception as e:
        raise e

def find_elements(driver,find_type,find_key):
    '''
    查找元素组(多个同名元素)
    :param driver:
    :param find_type:
    :param find_key:
    :return:
    '''
    try:
        elements = WebDriverWait(driver,3).until(lambda driver:driver.find_elements(by = find_type,value = find_key))
        return elements
    except Exception as e:
        raise e

发送邮件的步骤里新增里一些关键字,我们来把这些新增的关键字写成函数,如下三个
在这里插入图片描述

把这三个新增关键字的函数写好之后我们甚至不需要对执行用例脚本做改动就能直接运行
把excel里的第二个用例也设置一下

在这里插入图片描述

然后在执行用例的脚本里加一行代码(之前疏忽了,需要运行两个以上的用例时才发现这个小问题)
在这里插入图片描述

这一行代码不加第二个用例就无法执行下去,自己可以不加这行代码,看看会出什么问题(提示:excel.getsheet获取的页要注意及时切换)
加完这行代码后跑一下,成功运行两个代码
还是贴一下此时的代码吧,虽然就加了一行,凑一下字数

from ConfigFiles.ConfigPath import xlsxPath
from Utils.ExcelOperate import ExcelOperate
from Action.elementAction import *

excel = ExcelOperate()
excel.load_workbook(xlsxPath)

def test_run():
    excel.get_sheet_by_name('测试用例')
    row_nums = excel.get_rows_nums()
    for i in range(2,row_nums+1):
        #判断用例是否需要执行
        excel.get_sheet_by_name('测试用例')
        if excel.get_cell_value(i,5) == 'y':
            step_sheet = excel.get_cell_value(i,4)
            print(step_sheet)
            # 读取对应的页
            excel.get_sheet_by_name(step_sheet)
            # 拿到相应的步骤数
            step_nums = excel.get_rows_nums()
            for j in range(2,step_nums+1):
                temp_row_value = excel.get_row_values(j)
                # 获取该行内各个单元格的数据
                index = temp_row_value[0]
                desc = temp_row_value[1]
                key_word = temp_row_value[2]
                location_type = temp_row_value[3]
                location_key = temp_row_value[4]
                value = temp_row_value[5]
                # 构造函数表达式
                # 定位方式和定位表达式为空,操作值不为空,比如get_url,sleep
                method_express = ''
                if value and location_type is None and location_key is None:
                    if isinstance(value,int):
                        method_express = key_word + "(" + str(value) +")"
                    else:
                        method_express = key_word + "('" + value + "')"

                # 只有关键字不为空
                if location_type is None and location_key is None and value is None:
                    method_express = key_word + "(" + ")"

                # 只有操作值为空
                if value is None and location_key and location_type:
                    method_express = key_word + "('" + location_type + "'" + "," + "'" +location_key + "')"

                # 都不为空
                if value and location_type and location_key:
                    if isinstance(value,int):
                        method_express = key_word + "('" + location_type + "'" + "," + "'" + location_key + "'" + "," +  str(value) + ")"
                    else:
                        method_express = key_word + "('" + location_type + "'" + "," + "'" +location_key + "'" + "," + "'" + value + "')"

                # 执行上面构造的函数
                eval(method_express)

if __name__ == '__main__':
    test_run()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
第三代通信技术(3G)的应用已在全球范围内逐步展开,各大设备供应商正积极研发能提供更高性能的新一代网管系统来满足市场需求。网管系统是一个庞大复杂的通信管理系统,由于客户的功能需求以及网管系统自身技术的更新等原因使网管系统的版本不断更新,网管系统最终系统测试的工作量会很大。因此需要引入自动化测试来提高测试效率保证测试质量。 本文首先分析了当前网管系统测试现状以及对自动化测试的需求。在这样的前提条件下,论文采用了关键字驱动脚本技术,同时吸取了当前流行的自动化测试框架中一些先进的思想,提出了一个适合网管系统测试的自动化测试框架。然后论文对该框架测试流程进行详细的描述,在此框架的基础上进行系统的总体设计,并完成系统主要模块的设计与实现。本文最终实现了一个基于关键字驱动的自动化测试平台APK(Automated test Platform based on Keywords)。 在APK的实现过程中采用基于C/S的网络框架,该网络框架可以实现多用户定制测试任务并完成分布式自动化测试。在APK系统框架中对关键字进行了重新的定义,关键字不再是目前流行的框架中所定义的原子动作,而是一个用于实现一项测试规程的原子动作序列,同时该框架将结果验证环节放到关键字内部去实现。接口设计方面APK提供了一个外部接口用来整合网管系统中现有的业务测试工具,同时为了满足日后功能扩展的需要APK还预留了一个扩展接口。 APK可以应用于Java应用程序的GUI(Graphical User Interface)自动化测试,同时结合外部接口调用外部工具还可以完成较复杂的业务自动化测试。目前APK已经应用于网管系统的回归测试、边界值测试和大话务量环境数据的配置中,并已经取得了显著的效果,达到了预期的目标。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LSQ的测试日记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值