一、大概流程
二、unittest入口(keyword_case.py)
unittest、ddt(数据驱动)、BeautifulReport(测试报告)、HTMLTestRunner(测试报告)
代码:
#keyword_case.py文件
```python
#conding=utf-8
from selenium import webdriver;
#引入unittest框架
import unittest;
import os
import HTMLTestRunner
import time
from case.bussiness import Bussiness;
from ddt import ddt,data,unpack
from BeautifulReport import BeautifulReport as bf
from util.excel_utie import ReadExcel
read_excel=ReadExcel();
get_data=read_excel.get_data();
print(get_data);
@ddt
class FirstCase(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox();
self.driver.get('http://www.5itest.cn/register');
self.bussiness = Bussiness(self.driver);
@classmethod
def setUpClass(self):
print("所有用例执行前执行一次");
pass
@data(*get_data)
# @data(
# ['user_email','user_nameuser_nameuser_name','user_pass','text_code'],
# ['user_email2', 'user_nameuser_nameuser_name2', 'user_pass', 'text_code'],
# ['user_email3', 'user_nameuser_nameuser_name3', 'user_pass', 'text_code']
# )
@unpack
def test_01(self,user_email,user_name,user_pass,text_code):
self.bussiness.emai_check(user_email,user_name,user_pass,text_code);
errmessage=self.bussiness.get_allerrr();
result=self.bussiness.get_element('user_email');
if(result!=None):
print("注册失败");
print(",".join(errmessage));
else:
print("注册成本");
def tearDown(self):
time.sleep(2);
# 报错保存图片
# 从错误信息中获取名称和错误信息
for method_name, error in self._outcome.errors:
if error:
case_name = self._testMethodName
print("失败打印图片");
print(time.strftime("%Y%m%d%H%M%S"));
file_path = os.path.join(os.getcwd() + "/report/" + case_name + time.strftime("%Y%m%d%H%M%S") + ".png");
self.driver.save_screenshot(file_path);
self.driver.close();
@classmethod
def tearDownClass(cls):
print("所有用例执行后执行");
if __name__ == '__main__':
# print("这里这里这里")
# unittest.main();
#第一种测试报告模式
# filename=os.path.join(os.getcwd()+"/report/"+"htmlreport2.html");
# print(str(filename))
# print("这里这里这里")
# fp=open(filename,'wb')
# # suite = unittest.TestSuite();
# # suite.addTest(FirstCase('test_01'));
# suite=unittest.TestLoader().loadTestsFromTestCase(FirstCase);
# runner=HTMLTestRunner.HTMLTestRunner(stream=fp, title='练习测试报告');
# runner.run(suite)
# fp.close();
# 第一种测试报告模式
#第二种测试报告模式
now = time.strftime("%Y-%m-%d %H%M%S", time.localtime(time.time()))
localpath = os.getcwd()
print('本文件目录位置:' + localpath)
filepath = os.path.join(localpath, 'Report')
print('报告存放路径 :' + filepath)
# 按函数加载testxxx测试用例
filename = now + '.html'
suite=unittest.TestLoader().loadTestsFromTestCase(FirstCase);
runner=bf(suite);
runner.report(description="这个描述参数是必填的",filename=filename)
# fp.close();
# 第二种测试报告模式
遇到的比较大的问题,使用unittest过程中main没有运行,如下操作:
确定后,main即可运行
二、数据驱动
xlrd、xlutils、python对excel表格操作(获取单元格数据、写入数据等)
#excel_utie.py文件
#coding=utf-8
import xlrd#读取
import xlwt#写入
from xlutils.copy import copy
class ReadExcel():
def __init__(self,filename=r'G:\0804\apache-jmeter-5.1.1\test\PycharmProjects\pythonProject\util\test2.xls',index=0):
self.wb = xlrd.open_workbook(filename);
self.table=self.wb.sheet_by_index(index);#获取第几个表格
self.t_ncol = self.table.ncols; #获取行数,列数
self.t_nrow = self.table.nrows;
print(self.t_nrow);
self.filename=filename;
def get_values(self,c,r):
result=self.table.cell(c,r).value;#获取第二行第二列值(从0开始)
return result;
#获取表格所有数据
def get_data(self):
result=[];
for i in range(self.t_nrow):
col=self.table.row_values(i);
result.append(col);
return result;
#写入文件
def worte_file(self,row,col,value):
read_value=self.wb;
print(self.wb);
write_data=copy(read_value);
write_data.get_sheet(0).write(row,col,value);
write_data.save(self.filename);
# if __name__ == '__main__':
# aread=ReadExcel();
# result=aread.get_data();
# print(result);
注意点:excel文件路径可改为动态传入
三、对元素进行操作(输入框输入值,点击按钮等)
#business.py文件
from case.handle import Handle;
class Bussiness():
def __init__(self,driver):
self.handle=Handle(driver);
#找元素
def get_element(self,key):
return self.handle.element_find(key);
#测试邮箱
def check_email(self,key,value):
#输入数据
self.handle.input_value(key,value);
def emai_check(self,user_email,user_name,user_pass,text_code):
self.check_email('user_email',user_email);
self.check_email('user_name',user_name);
self.check_email('user_pass',user_pass);
self.check_email('text_code',text_code);
self.handle.su_button('register-btn');
def get_readresult(self,key):
return self.handle.get_text(key);
#获取所有注册输入框错误时信息
def get_allerrr(self):
result =self.get_readresult('register_email-error');
resultname = self.get_readresult('register_nickname-error');
resultpass = self.get_readresult('register_password-error');
resultcde = self.get_readresult('captcha_code-error');
aresult=[result,resultname,resultpass,resultcde];
return aresult;
四、对元素进行操作(handle.py)
#coding=utf-8;
from util.find_element import Find_element
from selenium import webdriver
import os
from datetime import *
from PIL import Image
import time
#对元素进行操作
class Handle():
def __init__(self,driver):
self.driver=driver;
#找到元素
def element_find(self,key):
# print(self.driver,"...",self.key);
findT=Find_element(self.driver,key);
findA=findT.get_value();
return findA;
# print(findA);
#输入值
def input_value(self,key,value):
Element=self.element_find(key);
Element.send_keys(value);
#元素按钮
def su_button(self,key):
Element=self.element_find(key);
Element.click();
#获取浏览器标题
def get_title(self):
return self.driver.title;
#获取元素内容
def get_text(self,key):
Element=self.element_find(key);
try:
return Element.get_attribute('textContent');
except:
return key+"信息输入正确";
#提取验证码
def get_code(self):
shot_name = datetime.now().strftime("%Y%m%d%H%M%S")
shot_name = os.path.join(os.getcwd(),shot_name + '.png');
images = self.driver.save_screenshot(shot_name);
code_element=self.element_find('getcode_num');
left=code_element.location['x'];
top= code_element.location['y'];
right=code_element.size['width']+left;
height=code_element.size['height']+top;
image=Image.open(shot_name);
img=image.crop((left,top,right,height));
img.save(shot_name);
print(shot_name);
# if __name__ == '__main__':
# driver=webdriver.Firefox();
# driver.get('http://www.5itest.cn/register');
# handle=Handle(driver);
# handle.get_code();
# handle.input_value('user_name');
# handle.su_button('register-btn');
# handle.get_title();
# handle.get_text('register_email-error');
五、根据元素名称查找元素
#find_element.py文件
#coding=utf-8
from selenium import webdriver
from util.read import readElement
#根据元素查找元素
class Find_element():
def __init__(self,driver,key):
self.driver=driver;
self.key=key;
#从配置文件中查找
def get_value(self):
readE=readElement();
result=readE.read_value(self.key);
# print("这里");
# print(result);
if(result!=None):
typer=result[0];
try:
typevalue=result[1];
# print(typevalue);
if typer=='id':
return self.driver.find_element_by_id(typevalue);
elif typer=='class':
return self.driver.find_element_by_class_name(typevalue);
elif typer=='tag_name':
return self.driver.find_element_by_tag_name(typevalue);
elif typer=='xpath':
return self.driver.find_element_by_Xpath(typevalue);
else:
return self.driver.find_element_by_css_selector(typevalue);
except:
return None;
else:
return None;
# if __name__ == '__main__':
# driver=webdriver.Firefox();
# driver.get('http://www.5itest.cn/register');
# find_element=Find_element(driver,'user_name');
# a=find_element.get_value();
# print(a);
六、从配置文件中读取元素
configparser
#ready.py文件
import configparser
#/读取配置文件内容
class readElement():
def __init__(self,filename=None,node=None):
if filename==None:
self.filename=r'G:\0804\apache-jmeter-5.1.1\test\PycharmProjects\pythonProject\util\localElement.ini';
if node==None:
self.node='UserElement';
else:
self.node=node;
self.cf=self.readT();
#读取文件
def readT(self):
cf=configparser.ConfigParser();
cf.read(self.filename);
return cf;
#读取内容
def read_value(self,key):
try:
result=self.cf.get(self.node,key);
return result.split(">");
except:
return None;
# if __name__ == '__main__':
# ReadElement=readElement();
# print(ReadElement.read_value('user_name'));
七、配置文件.ini
#localElement.ini文件
[UserElement]
user_email=id>register_email
user_name=id>register_nickname
user_pass=id>register_password
text_code=id>captcha_code
register-btn=id>register-btn
register_email-error=id>register_email-error
user-dropdown-profile__nickname=class>user-dropdown-profile__nickname
register_nickname-error=id>register_nickname-error
register_password-error=id>register_password-error
captcha_code-error=id>captcha_code-error
getcode_num=id>getcode_num