关键字驱动测试框架源码:https://download.csdn.net/download/qq_38175040/18548169
之前的七篇都是数据驱动的WEB UI自动化测试框架,现在学习并记录一下关键字驱动的测试框架。
这两者在实现技术上可能没有太本质的区别,都是以selenium为核心,但在实现逻辑和思想上可能有较大的区别。
一.关键字驱动框架介绍
关键字驱动框架:
步骤:一个用例需要进行n步的操作步骤才能完成,而每个操作步骤都有可能用到以下三个关键字
对象:操作的页面或元素,如用户名输入框
动作:对对象进行的动作,如点击登录按钮,输入文字
数据:对象操作所用到的值,如用户名密码等以登录163邮箱为例,操作步骤如下:
1.打开浏览器 对象:浏览器 动作:open 数据:Chrome()或者Firefox()
2.输入url 对象:浏览器 动作:输入 数据:url
3.窗口最大化 对象:窗口 动作:最大化 数据:
4.切换iframe 对象:iframe 动作:切换 数据:
5.输入用户名 对象:用户名输入框 动作:输入 数据:用户名
6.输入密码 对象:密码框 动作:输入 数据:密码
7.点击登录按钮 对象:登录按钮 动作:点击 数据:
8.等待n秒 对象: 动作:sleep 数据:n
9.进行断言 对象: 动作: 数据:
创建一个新项目
登录邮箱的完整步骤用excel来表现
关键字的命名应该用英文,因为后期会映射到代码里
先在项目下新建这几个包,命名与作用都与之前的数据驱动框架一样,还是把上面的这个excel文件复制到TestData下面
接着继续修改excel,用例这里的sheet名与后面写有具体步骤的sheet要对应
还是和上一个项目一样,先封装一个find_element方法,代码都是直接从那里拿的
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
然后这边也还是在excel里也如关键字,需要对excel进行操作,所以将上一个项目的操作excel代码的公用方法拷过来
import openpyxl
from openpyxl import load_workbook
from ConfigFiles.ConfigPath import xlsxPath
class ExcelOperate:
def __init__(self):
self.workbook = None
self.sheet = None
def load_workbook(self,filename):
'''
加载相应的excel文件
:param filename:
:return:
'''
try:
self.workbook = load_workbook(filename)
except Exception as e:
print(e)
def get_sheet_by_name(self,sheetname):
'''
拿到xlsx文件里对应的页
:param sheetname:
:return:
'''
try:
self.sheet = self.workbook[sheetname]
except Exception as e:
print(e)
def get_rows_nums(self):
'''
返回当前页的最大行数
:return:
'''
return self.sheet.max_row
def get_col_nums(self):
'''
获取最大列数
:return:
'''
return self.sheet.max_column
def get_row_values(self,row):
'''
根据row获取某一行的值
:param row:
:return:
'''
columns = self.sheet.max_column
row_data = []
#遍历列的时候从1开始,不是从0开始,因为xlsx没有第0行,第0列
for i in range(1,columns+1):
cell_value = self.sheet.cell(row = row,column = i).value
row_data.append(cell_value)
return row_data
def get_cell_value(self,row,column):
'''
获取某一个单元格的值
:param row:
:param column:
:return:
'''
cell_value = self.sheet.cell(row=row,column=column).value
return cell_value
def modify_cell(self,row,column,data):
'''
在单元格内写入数据
:param row:
:param column:
:param data:
:return:
'''
self.sheet.cell(row=row,column=column).value = data
self.workbook.save(xlsxPath)
if __name__ == '__main__':
eo = ExcelOperate()
#根据名字读取xlsx文件,xlsxPath已经在ConfigPath.py文件中定义过了
eo.load_workbook(xlsxPath)
eo.get_sheet_by_name('Sheet1')
print(eo.get_col_nums())
print(eo.get_rows_nums())
print(eo.get_row_values(2))
print(eo.get_cell_value(2,7))
# eo.modify_cell(2,7,'dew')
这边报错了,所以还是要再把获取文件地址的代码拷到这边来
import os
#获取项目内各个文件的地址并存放在变量里
#获取整个项目的根目录
ParentDirPath = os.path.dirname(os.path.dirname(__file__))
xlsxPath = os.path.join(ParentDirPath,u'TestData\key_word.xlsx')
二.建立映射,操作关键字
新建一个Action文件夹,并在下面新建一个elementAction.py文件
Action下面的文件用来操作excel里的关键字:
根据第一个关键字写一个相应的函数,传入的参数里必须都带一个*args,后面会用到,这里不做解释
再写一个获取url的函数,这边driver报错了,因为所有的函数都是共用的一个driver,所以定义一个全局变量
继续补全这个文件里的函数,和excel里的关键字对的上
然后还是在文件里价格main,看看上面写的函数是否正确
运行成功,上面写的函数都没有问题
贴一下这部分的代码:
import time
from selenium import webdriver
from Utils.Find_element import find_element
driver = None
def open_browser(browser_name,*args):
global driver
driver = webdriver.Chrome()
def get_url(url_name,*args):
global driver
driver.get(url_name)
def max_window(*args):
global driver
driver.maximize_window()
def sleep(seconds,*args):
time.sleep(seconds)
def switch_frame(location_type,location_name,*args):
global driver
try:
i_frame = find_element(driver,location_type,location_name)
driver.switch_to.frame(i_frame)
except Exception as e:
print(e)
def input_content(location_type,location_name,content,*args):
global driver
find_element(driver,location_type,location_name).send_keys(content)
def click(location_type,location_name,*args):
global driver
find_element(driver,location_type,location_name).click()
def assert_title(except_value,*args):
global driver
assert except_value in driver.title
def close_browser(*args):
global driver
driver.quit()
if __name__ == '__main__':
open_browser('chrome')
get_url('https://mail.163.com')
max_window()
sleep(2)
switch_frame('tag name','iframe')
input_content('name','email','lsqtester001')
input_content('name','password','qwer123')
click('id','dologin')
sleep(2)
assert_title('网易邮箱6.0版')
close_browser()