目录
1.内容介绍
2.什么是关键字驱动
2.1.解决什么问题?
2.2.如何来做?
2.3.概念
3.如何设计关键字驱动
3.1.如何设计程序?
3.2.Cases编写
3.3.Web操作
3.4.运行
4.项目代结构展示
5.框架分析
在回归测试的时候有很多重复测试的用例,我们希望这部分用例能自动化执行,减少人的重复性劳动。使用传统的全写代码模式进行自动化测试,如果测试人员不懂代码,那么自动化测试就无法开展,对技能要求太高,能不能有这个样的一个工具或框架,部分测试人员不写代码也能进行自动化测试?
我们先来看看之前我们设计的用例。
我们要怎样把上面的用例做成自动化用例?让代码实现如下功能。
如果用以前的用例格式来直接转换成自动化用例能行吗?
我的设计方法:
我们把上面的这种设计方法叫做关键字驱动,总结以下两点。
从上面设计的用例出发,我们依次来分析需要实现的功能。
我们希望的是自动化框架脚本能读取每一行用例,然后在执行后把测试结果也填好,如果执行出错要有错误信息、错误截图。那我们需要完成以下代码的编写。
主要实现根据excel表格中的用例自动转换成的用例
from openpyxl import load_workbook
from datetime import datetime
from PIL import ImageGrab
from action.pageAction import KeyWordTest
import traceback
import os
def TestCase(filename):
wb = load_workbook(filename)
#获取sheet_names
for sheetname in wb.sheetnames:
ws = wb[sheetname]
#获取最大行数
ws_rows_max = ws.max_row
#sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹
idx = 2
while idx <= ws_rows_max:
# 指定的关键字
essential = ws.cell(row=idx, column=3).value
# 定位方式
Targeting = ws.cell(row=idx, column=4).value
# 元素定位表达式
Element_positioning = ws.cell(row=idx, column=5).value
# 操作值
Manipulated_value = ws.cell(row=idx, column=6).value
try:
#根据传入的方法名来确定每一步执行哪一个方法
if essential == 'open_browser':
dirver = KeyWordTest('Chrome')
elif essential == 'open_url':
dirver.open_url(Manipulated_value)
elif essential == 'maximize_browser':
dirver.maximize_browser()
elif essential == 'input_text':
dirver.input_text(Targeting, Element_positioning, Manipulated_value)
elif essential == 'click_btn':
dirver.click_btn(Targeting, Element_positioning)
elif essential == 'quit_browser':
dirver.quit_browser()
elif essential == 'assert_driver_title_is':
title_text = dirver.assert_driver_title_is()
#断言
if title_text == Manipulated_value:
#print(dirver.assert_driver_title_is())
#如果执行无误则将执行结果写入Pass
ws.cell(row=idx, column=8).value = 'Pass'
else:
# 如果执行无误则将执行结果写入Pass
ws.cell(row=idx, column=8).value = 'Fail'
wb.save(filename)
return
# 如果执行无误则将执行结果写入Pass
ws.cell(row=idx, column=8).value = 'Pass'
# 获取当前系统时间,作为测试用例执行时间
curr_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
ws.cell(row=idx, column=7).value = curr_time
except Exception:
#出现错误时截图保存到表格:只用到一个PIL模块,但PIL是Python2专有的,没有Python3版本。Python3应安装pillow,用的时候和PIL是一样的。
im = ImageGrab.grab()
imagepath = f'screenshot/{idx-1}.png'
im.save(imagepath)
ws.cell(row=idx, column=10).value = imagepath
# 如果执行出现异常,测试结果写入 异常,同时将异常信息写入到表格中
ws.cell(row=idx, column=8).value = '异常'
# 写入异常信息
ws.cell(row=idx, column=9).value = traceback.format_exc()
idx += 1
wb.save(filename)
主要实现页面元素查找功能的封装和页面校验断言assert的封装
from selenium import webdriver
import time
class KeyWordTest:
def __init__(self, type_browser):
self.driver = self.open_browser(type_browser)
self.driver.implicitly_wait(20) #隐式等待
self.maximize_browser() #浏览器最大化
#打开浏览器
def open_browser(self, type_browser):
if type_browser == 'Chrome':
self.driver = webdriver.Chrome()
elif type_browser == 'Firefox':
self.driver = webdriver.Firefox()
elif type_browser == 'Edge':
self.driver = webdriver.Edge()
else:
self.driver = 'type error'
return self.driver
#打开网页
def open_url(self, url):
self.driver.get(url)
#浏览器最大化
def maximize_browser(self):
self.driver.maximize_window()
#元素定位
def locator(self, locator_type, element):
element_object = None
if locator_type == 'id':
element_object = self.driver.find_element_by_id(element)
elif locator_type == 'name':
element_object = self.driver.find_element_by_name(element)
elif locator_type == 'class_name':
element_object = self.driver.find_element_by_class_name(element)
elif locator_type == 'css':
element_object = self.driver.find_element_by_css_selector(element)
elif locator_type == 'xpath':
element_object = self.driver.find_element_by_xpath(element)
return element_object
#输入内容定位
def input_text(self, targeting, element, content):
self.locator(targeting, element).send_keys(content)
#点击按钮
def click_btn(self, targeting, element):
self.locator(targeting, element).click()
#关闭浏览器
def quit_browser(self):
self.driver.quit()
#获取 title信息
def assert_driver_title_is(self):return self.driver.title