selenium+python3+excel测试框架

介绍:框架采用excel驱动unittest 完成ui自动化测试

安装python、selenium的方法就不说了,网上一大把,直接进入正题

1.data数据源:

动作:封装selenium各种动作

定位类型:定位元素的方式

定位值:与定位类型匹配使用

输入值:与动作匹配使用

2.变量文件

为了数据后期更好维护,用一个csv文件放置变量

casedata中可直接引用变量值(采用jmeter变量思想)

3.框架介绍

  配置文件:config.conf

#运行模式
[mode]
    mode = normal

#normal模式下各个文件路径
[normal]
    file = ./data/客户端.xlsx
    sheet = BB电子
    var_file = ./data/变量.csv

  读取excel文件:excelutil

#-*- coding:utf-8 -*-
import xlrd
import json
import csv
import re
import config
from pylog import Pylog
‘‘‘获取测试数据‘‘‘

class ExcelUtil:
    def __init__(self,file,sheetname):
        self.sheetname = sheetname
        self.dataSheet = xlrd.open_workbook(file).sheet_by_name(sheetname)
        # get titles
        self.row = self.dataSheet.row_values(0)
        # get rows number
        self.rowNum = self.dataSheet.nrows
        # get columns number
        self.colNum = self.dataSheet.ncols
        # the current column
        self.curRowNo = 1

    #获取用例数据
    def get_excel(self):
        var_file = config.get_config("normal","var_file")
        r = []
        while self.hasNext():
            s = {}
            col = self.dataSheet.row_values(self.curRowNo)
            i = self.colNum
            for x in range(i):
                s[self.row[x]] = col[x]

            #重置用例名称
            s["用例No"] = self.sheetname + str(s["用例No"])

            #引入变量
            if s["输入值"][:2] == "${":
                var = re.findall(‘{(.*)}‘, s["输入值"], re.S)[0]
                vars = self.get_var(var=var,var_file=var_file)
                s["输入值"] = vars

            #引入其他用例集
            try:
                if s["动作"] == "引入":
                    file = ‘./data/‘+json.loads(s["输入值"])["file"]
                    sheet = json.loads(s["输入值"])["sheet"]
                    aimslist = ExcelUtil(file=file,sheetname=sheet).get_excel()
                    r.extend(aimslist)
                else:
                    r.append(s)
            except Exception as e :
                Pylog.error("引入用例错误..." + str(e) + "|"+ s["输入值"])

            self.curRowNo += 1
        return r
    #遍历
    def hasNext(self):
        if self.rowNum == 0 or self.rowNum <= self.curRowNo:
            return False
        else:
            return True

    #获取变量
    def get_var(self,var="all_vars",var_file=None):
        dic = {}
        try:
            with open(var_file,‘r‘) as file:
                reader = csv.reader(file)
                for row in reader:
                    dic[row[0]] = row[1]
                if var == "all_vars":
                    return dic
                return dic[var]
        except Exception as e :
            Pylog.error("读取变量错误:"+str(e))

  日志文件:pylog

import logging
import time

class Pylog:
    def __init__(self):
        ##############################日志配置############################################################
        logging.basicConfig(level=logging.DEBUG,
                            format=‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘,
                            datefmt=‘%a, %d %b %Y %H:%M:%S‘,
                            # filename="./log/"+ time.strftime(‘%Y%m%d%H%M%S‘,time.localtime(time.time()))+".log",
                            filename="./Report/test.log",
                            filemode=‘w‘)
        console = logging.StreamHandler()
        console.setLevel(logging.INFO)
        formatter = logging.Formatter(‘%(name)-12s: %(levelname)-8s %(message)s‘)
        console.setFormatter(formatter)
        logging.getLogger(‘‘).addHandler(console)
        ###################################################################################################

    @staticmethod
    def info(data = None):
        logging.info(data)

    @staticmethod
    def debug(data = None):
        logging.debug(data)

    @staticmethod
    def error(data = None):
        logging.error(data)
    @staticmethod
    def warning(data = None):
        logging.warning(data)

  获取测试数据:

import config
from pylog import Pylog
from excelutil import ExcelUtil
import json

class Predata:
    def __init__(self):
        pass

    def get_data(self):
        datalist = []
        mode = config.get_config("mode", "mode")
        file = config.get_config("normal","file")
        sheet = config.get_config("normal","sheet")
        if mode == "normal":
            datalist = self.get_exceldata(file,sheet)
        return datalist

    def get_exceldata(self,file,sheet):
        datalist =  ExcelUtil(file,sheet).get_excel()
        n = 0
        for item in datalist:
            item["用例No"] = str(10000+n) + item["用例No"]
            n += 1
        return datalist

  单元测试部分:

import unittest
import config
import ddtSelenium
import time
from pylog import Pylog
from action import Action
from predata import Predata

@ddtSelenium.ddt
class Case(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.action = Action()
        #进入浏览器设置
        # options = cls.action.driver.webdriver.ChromeOptions()
        # options.add_argument()

    @classmethod
    def tearDownClass(cls):
        time.sleep(3)
        # cls.action.driver.close()

    @ddtSelenium.data(*Predata().get_data())
    def testcase(self, data):
        Pylog.info(str(data[list(data.keys())[0]]) + "开始")
        if data["动作"] == "等待":
            time.sleep(int(data["输入值"]))
        else:
            text = self.action.pre_do(data)
        if data["动作"] == "断言":
            Pylog.info("断言:"+ str(data[list(data.keys())[0]]))
            if text != data["输入值"]:
                Pylog.info("断言截图:" + str(data[list(data.keys())[0]]))
                self.action.driver.save_png(‘./Report/‘+data[‘用例No‘]+‘.jpg‘)
            self.assertEqual(text, data["输入值"])

  action部分:(pyse引用虫师封装py)

from pylog import Pylog
from pyse import Pyse
import os
import config
from predata import Predata

class Action:
    def __init__(self):
        self.driver = Pyse("chrome")

    def pre_do(self,data):
        if config.get_config("mode","mode") == "normal":
            return self.do_action(data)

    def do_action(self,data):
        try:
            if data["动作"] == "断言":
                text = self.driver.get_element(data["定位类型"] + ‘=>‘ + data["定位值"]).text
                return text
            if data["动作"] == "打开":
                self.driver.open(data["输入值"])
            if data["动作"] == "点击":
                self.driver.click(data["定位类型"] + ‘=>‘ + data["定位值"])
            if data["动作"] == "清除":
                self.driver.clear(data["定位类型"] + ‘=>‘ + data["定位值"])

            # if data["动作"] == "等待":
            #     self.driver.wait(int(data["输入值"]))

            if data["动作"] == "输入":
                self.driver.type(data["定位类型"] + ‘=>‘ + data["定位值"],data["输入值"])
            if data["动作"] == "滚动条下拉":
                self.driver.js( "var q=document.body.scrollTop="+data["输入值"]+";")
            if data["动作"] == "等待元素":
                self.driver.element_wait(data["定位类型"] + ‘=>‘ + data["定位值"],10)
            if data["动作"] == "最大化":
                self.driver.max_window()
            if data["动作"] == "关闭浏览器":
                self.driver.close()
            if data["动作"] == "外调程序":
                os.system(data["输入值"])
        except Exception as e :
            Pylog.error("异常截图-"+data["动作"]+str(e))
            self.driver.save_png(‘./Report/‘+data[‘用例No‘]+‘.jpg‘)

 框架源码:https://github.com/Acguo

时间: 2024-10-06 02:51:15

selenium+python3+excel测试框架的相关文章

Selenium关键字驱动测试框架Demo(Java版)

Selenium关键字驱动测试框架Demo(Java版)http://www.docin.com/p-803493675.html Selenium关键字驱动测试框架Demo(Java版),布布扣,bubuko.com

selenium测试框架使用xml作为对象库

之前已经写过一篇: selenium测试框架篇,页面对象和元素对象的管理 上次使用的excel作为Locator对象管理,由于excel处理不够方便,有以下缺点: 不能实现分page 加载Locator对象 不能够实现Locator对象重名 文件比较大,读写速度没有xml快 所以,重新写了使用dom4j操作xml,使用xml管理Locator对象,能够有效解决以上问题 首先,定义Locator文件 <?xml version="1.0" encoding="UTF-8&

selenium测试框架篇,页面对象和元素对象的管理

前期已经做好使用Jenkins做buildhttp://www.cnblogs.com/tobecrazy/p/4529399.html 做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让整个测试体系: 更容易维护 大大增加代码重用 增加测试系统的稳定性 这里先了解一下我所说的对象库: 所谓的页面对象,是指每一个真是的页面是一个对象. 比如zhihu的登陆页面是一个页面对象,http://www.zhihu.com/#signin 这个页面对象主要包含一个输入邮箱的输入框(一个元素对

selenium测试框架篇

做自动化框架,不可避免的就是对象库. 有一个好的对象库,可以让整个测试体系: 更容易维护 大大增加代码重用 增加测试系统的稳定性 这里先了解一下我所说的对象库: 所谓的页面对象,是指每一个真是的页面是一个对象. 比如zhihu的登陆页面是一个页面对象,http://www.zhihu.com/#signin 这个页面对象主要包含一个输入邮箱的输入框(一个元素对象),一个输入密码的密码框 一个登陆框.当然,zhihu不止一个页面,有无数页面,每一个页面都可以封装为一个对象.而每个 页面的元素,也可

selenium 测试框架中使用grid

之前的测试框架:http://www.cnblogs.com/tobecrazy/p/4553444.html 配合Jenkins可持续集成:http://www.cnblogs.com/tobecrazy/p/4529399.html 在测试框架中使用Log4J 2 :http://www.cnblogs.com/tobecrazy/p/4557592.html 首先介绍一下grid ,selenium grid 是一种执行测试用例时使用的包含不同平台(windows.Linux.Androi

Java 使用POI操作EXCEL及测试框架搭建、测试开发的一些想法

无论是UI自动化测试还是接口自动化测试都需要进行数据驱动,一般很常见的一种方式就是用excel来管理数据,那么就涉及到一些代码对EXCEL的操作,之前我们介绍过用CSV来处理EXCEL,但是它的功能还不够强大.比如接口自动化测试框架搭建的时候我们用excel来进行数据驱动,用excel来进行用例的管理和测试结果的统计,那么我们就需要对excel进行读取,写入等编辑操作,如果做的更加全面的话还要对测试结果进行个统计. 先来谈下如何用excel来进行数据驱动吧.以我们公司的接口自动化测试框架为例,我

TestNG测试框架在基于Selenium进行的web自动化测试中的应用

这个测试框架可以把写好的测试用例按自定义顺序执行,以Selenium WebDriver自动化测试用例为例: 1.新建一个名为forTestNg的java project,然后创建一个libs文件夹,导入所有和Selenium相关的jar包: 2.安装TestNG,在Eclipse中点击Help->Install New Software,点击Add,Location填写“http://beust.com/eclipse”,然后点击OK: 之后勾选TestNG,点击Next进行安装即可: 之后点

selenium一个完整的unittest测试框架格式(单线程,非测试报告)

我在工作中碰到过同事写了些web自动化测试的脚本,有次我问他使用的是什么测试框架, 他居然说不知道.这位同事其实写selenium自动化测试也有些时间了.当我看了他的脚本 不出意外,他使用的就是unittest框架,哈哈.所以我觉得有些同学虽然会做相关东西, 但其实并不知道自己所掌握的东西是什么. 下面呢,我就结合自己写的脚本分析下一个完成的unittest测试框架的包括的内容. 图中我已经写的很详细拉.想交流的可以加QQ群:610845268

selenium测试框架(java) 版本演化一

selenium的自动化测试代码应该如何组织?  如链接:https://code.google.com/p/selenium/wiki/PageObjects  这里提供了一种PageObject的设计思想,并且在百度内部给出了一个感觉比较实用的实现.其组织结构思想如下: Page 封装页面元素,以及页面应提供的服务. 尽量隐藏页面的细节,不要暴露出来. widget 封装Page中的通用的组件. 这里的理念是所有的WebElement都是控件. 通用的页面样式,如导航栏,列表,组合查询框,可