Python--连接数据库--对xlsx文件操作

在这里插入图片描述
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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值