关键字函数封装好了接下来就是写测试脚本了。
一.测试脚本
在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()