DB类
import pymysql #导入pymysql.py的包
class CommDB(object):
def __init__(self, host, port, db, user, passwd, charset):
self.m_host = host
self.m_port = port
self.m_db = db
self.m_user = user
self.m_passwd = passwd
self.m_charset = charset
def execSql(self, strSql, bVerify=False):
rc = [True, None]
conn=None
try:
#获取数据库连接,使用参数
print(self.m_host,self.m_port,self.m_user,self.m_passwd,self.m_db,self.m_charset)
conn = pymysql.connect(host=self.m_host,port=self.m_port,
user=self.m_user,passwd=self.m_passwd,
db=self.m_db,charset=self.m_charset)
cur = conn.cursor() #获取一个游标
cur.execute(strSql) #执行一条数据库查询语句
data = cur.fetchall() #将执行结果返回给data,data是一个二维元组
#无执行错误表示SQL执行成功
if bVerify: #执行的是验证语句
rc[0] = True #表示sql语句执行成功
rc[1] = data[0][0] #SQL语句返回的第一行第一列数据赋值给返回数组
elif len(data) >= 1:# 如果返回的数据大于一行,且不是执行的验证SQL
rc[0] = True #表示sql语句执行成功
rc[1] = data #SQL语句返回全部数据,是一个二维数组
else: #如果没有返回数据
rc[0] = True #表示sql语句执行成功
rc[1] = None #数据赋值为None
cur.execute("commit;") #执行一条数据库提交语句
cur.close()
except Exception as e:
rc[0] = False #数据库操作失败了
rc[1] = "发生异常:%s"%e #错误提示信息是什么
finally:
try:
conn.close() #执行一条连接关闭操作
except Exception as ee:
pass
return rc
验证是否成功
import time
from time import sleep
from selenium import webdriver
from bases.funcs import selByText
CRM_BTN_CSS = '#s-menu-1 > button'
FRAME_ID = "iframe-1"
class Login():
def __init__(self,url):
self.url=url
def open(self):
self.dr=webdriver.Firefox()
#浏览器最大化
self.dr.maximize_window()
#输入网址
self.dr.get(self.url)
#等待时间3秒
time.sleep(3)
def login(self,user,pwd):
# id定位并清除内容
self.dr.find_element_by_id("account").clear()
# 输入内容
self.dr.find_element_by_id("account").send_keys(user)
# name定位
self.dr.find_element_by_name("password").clear()
self.dr.find_element_by_id("password").send_keys(pwd)
#点击登录
self.dr.find_element_by_css_selector("#submit").click()
time.sleep(5)
def p_add(self, case): #添加产品的操作
dr = self.dr #浏览器变量在self.lg里面,取个别名
dr.find_element_by_css_selector(CRM_BTN_CSS).click() # 点击crm按钮
dr.switch_to.frame(FRAME_ID) # 进入iframe1
time.sleep(3)
dr.find_element_by_link_text("产品").click() #理论上每个定位值都要用变量替代,暂略
time.sleep(3)
dr.find_element_by_link_text("添加产品").click()
time.sleep(3)
dr.find_element_by_id("name").send_keys(case[3]) #名称
dr.find_element_by_id("code").send_keys(case[4]) #代号
time.sleep(3)
selByText(dr, "line", case[5]) # 选择产品线
selByText(dr, "type", case[6]) # 选择类型
selByText(dr, "status", case[7]) # 选择状态
dr.find_element_by_id("submit").click() #点击保存
sleep(2) #一定要休息2秒
def p_add_v(self, case,db): #验证产品添加是否预期
try:
dr = self.dr
if str(case[8]).upper() == "TRUE":#转换为大写(upper)的字符串,如果等于大写的TRUE
rc2=db.execSql(case[11],True)
print(case[11])
print(rc2)
if str(rc2[0]).upper() == "TRUE" and rc2[1]==1 :
return "PASS--产品添加信息验证通过."
else:
return "FAIL--产品添加信息验证失败"
else: #否则期望添加失败
all = dr.find_element_by_id("ajaxForm").text #取出窗口所有文字
keys = str(case[9]).split("&&")#列表 = 字符串.split("分隔符"),keys是关键字拆分后的列表
ne = [] #定义空列表
for key in keys: #循环每一个关键字
if key not in all: #如果某个key不在all变量中
ne.append(key) #记录它
rc=db.execSql(case[11],True)
print(rc)
if str(rc[0]).upper() == "TRUE" and rc[1]==1 and ne == []:#如果ne还是空的,表明所有期望关键字都找到了
return "PASS--产品添加信息验证通过."
else:
return "FAIL--产品添加信息验证失败,下列期望关键字不存在:%r"%ne
except Exception as e: #代码出错、期望添加成功实际失败或反之都会到这里来
return "ERR--验证产品添加出现错误:%r"%e
def qu(self):
self.dr.quit()
公共类
from selenium.webdriver.support.select import Select
#针对下拉列表元素的操作(id定位;按可见文字选择)
#dr:浏览器对象; id:元素定位id值; value:要选择的文字
def selByText(dr, id, value):
if value != "":
e = dr.find_element_by_id(id)
s = Select(e)
s.select_by_visible_text(value)
主入口
import unittest
#该库可对xlsx文件进行操作
from openpyxl import load_workbook
from bases.commDB import CommDB
from pages.LoginPage import Login
class loginCases(unittest.TestCase):
@classmethod
def setUpClass(self):
self.lg=Login("http://localhost:8000/ranzhi/www/")
self.db=CommDB("127.0.0.1", 3306, "ranzhi", "root", "", "utf8")
def test1(self):
fn=r"../cases/cases.xlsx"
#打开xlsx文件
ws=load_workbook(fn)
#选择表格
st=ws["productAdd"]
Row=0 #行
Count=0 #用例总数
Fail=0 #失败用例数
#遍历表格
for row in st.iter_rows():
Row+=1
if Row==1: #第一行是标题,故不执行.
continue
case=[]
for r in row:
if r.value==None:
case.append("")
else:
case.append(str(r.value))
Count+=1
print("用例名称:",case[0])
self.lg.open()
self.lg.login(case[1], case[2]) #登录
self.db.execSql(case[10])
self.lg.p_add(case)
print(self.lg.p_add_v(case,self.db))
print("本次共执行 %d 个用例,其中错误用例%d个"%(Count,Fail))
@classmethod
def tearDownClass(self):
self.lg.qu()