UI自动化框架搭建--unittest

使用的代码是Python3版本,与时俱进哈哈

解释一下我的框架目录接口(每个人框架的目录接口不一样,根据实际要求)

common目录:公共模块,这个地方可以存放一下公共调用的方法或者文件之类的

log:日志目录,存放执行自动化脚本产生的日志 ,方便定位问题所在,这个是必须有的

report:测试报告目录,每一次执行自动化测试都需要产生一份测试报告,我这边把执行自动化的脚本也放在里面了,以及自动化添加用例套件的方法也放在这里了,主要是嫌麻烦

testcase:测试用例目录,封装好的测试用例

一个很简单的框架目录

本次自动化框架需要的模块主要有:HTMLTestRunner、unittest、logging、pymysq、selenium,其他的就涉及自动化的项目页面需要了

log日志的方法:

# coding:utf-8
import logging,time,os
# 这个是日志保存本地的路径
log_path = "C:\\Users\Administrator\PycharmProjects\\test"
class Log:
def __init__(self):
# 文件的命名
self.logname = os.path.join(log_path, '%s.log'%time.strftime('%Y_%m_%d'))
self.logger = logging.getLogger()
self.logger.setLevel(logging.DEBUG)
# 日志输出格式
self.formatter = logging.Formatter('[%(asctime)s] - %(filename)s[line:%(lineno)d] - fuc:%(funcName)s- %(levelname)s: %(message)s')
def __console(self, level, message):
# 创建一个FileHandler,用于写到本地
fh = logging.FileHandler(self.logname, 'a',encoding="utf-8") # 追加模式
fh.setLevel(logging.DEBUG)
fh.setFormatter(self.formatter)
self.logger.addHandler(fh)

# 创建一个StreamHandler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(self.formatter)
self.logger.addHandler(ch)

if level == 'info':
self.logger.info(message)
elif level == 'debug':
self.logger.debug(message)
elif level == 'warning':
self.logger.warning(message)
elif level == 'error':
self.logger.error(message)
# 这两行代码是为了避免日志输出重复问题
self.logger.removeHandler(ch)
self.logger.removeHandler(fh)
# 关闭打开的文件
fh.close()

def debug(self, message):
self.__console('debug', message)

def info(self, message):
self.__console('info', message)

def warning(self, message):
self.__console('warning', message)

def error(self, message):
self.__console('error', message)

if __name__ == "__main__":
log = Log()
log.info("---测试开始----")
log.info("输入密码")
log.warning("----测试结束----")

添加测试用例的套件:
文件一:
import unittest

class ParametrizedTestCase(unittest.TestCase):
def __init__(self, methodName='runTest', param1=None, param2=None, param3=None):
super(ParametrizedTestCase, self).__init__(methodName)
self.param1 = param1
self.param2 = param2
self.param3 = param3

@staticmethod
def parametrize_case(classname, casename, param1=None, param2=None, param3=None):
suite = unittest.TestSuite()
suite.addTest(classname(casename, param1=param1, param2=param2, param3=param3))
return suite

@staticmethod
def parametrize_class(testcase_klass, param1=None, param2=None, param3=None):
testloader = unittest.TestLoader()
testnames = testloader.getTestCaseNames(testcase_klass)
suite = unittest.TestSuite()
for name in testnames:
suite.addTest(testcase_klass(name, param1=param1, param2=param2, param3=param3))
return suite

文件二:
# -*-_ coding: utf-8 -*-

import unittest
import time
from selenium import webdriver
import HTMLTestRunner

from common.test_excel import *
from report.Parametrized import *
from testcase.test_login import Login
from testcase.test_webqz import Webqz
from testcase.test_qzvideo import Videpqz
from testcase.test_qzshaixuan import QzShaiXuan
from testcase.test_gerenzx import Gerenzx
from testcase.test_cunzhengqq import CunZhengQQ
...

driver = webdriver.Chrome()
ceshi_url = "http://192.168.1.1:81/sign"
ceshi2_url = 'http://192.168.1.2:81/attestationsh'
login_name = '18999999999'
login_passwd = 'a123456'

webqz_num = 10
webqz_name = time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time())) +"升级测试"
guochengqz_name = "自动化测试"
guochengqz_biaoqian = "测试"
shaixuanqz_name = "自动化"
baoquanbi_num = 520
gerenzx_qzurl = 'https://www.baidu.com'
cunzheng_biaoqian = '自动化测试'
cunzheng_file_name = '199'

suite = unittest.TestSuite()
suite.addTest(ParametrizedTestCase.parametrize_class(Login, param1=driver,param2=baoquanceshi_url,param3=login_name))
suite.addTest(ParametrizedTestCase.parametrize_case(Webqz,"test_webqz_search", param1=driver,param2=webqz_name,param3=webqz_num))
suite.addTest(ParametrizedTestCase.parametrize_case(Videpqz,"test_video_search", param1=driver,param2=guochengqz_name,param3=guochengqz_biaoqian))
suite.addTest(ParametrizedTestCase.parametrize_class(Gerenzx, param1=driver,param2=baoquanbi_num,param3=webqz_name))
suite.addTest(ParametrizedTestCase.parametrize_class(CunZhengQQ, param1=driver,param2=cunzheng_biaoqian,param3=cunzheng_file_name))
suite.addTest(ParametrizedTestCase.parametrize_class(QzShaiXuan, param1=driver,param2=shaixuanqz_name,param3=login_name))
...

now = time.strftime("%Y-%m-%d %H_%M_%S")
filename = ".\\" + now + "result.html"
fp = open(filename, "wb")
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title="自动化测试报告")
runner.run(suite)

文件一是一个添加测试用例套件的方法
文件二是调用文件一的方法将测试封装好的测试用例进行添加,从而执行所有测试用例产生测试报告

举一个模拟登录的测试用例脚本
#-*- coding = utf - 8 -*-
from report.Parametrized import ParametrizedTestCase
import time , sys
from log.log_test import Log
import pytesseract
from PIL import Image,ImageEnhance
from selenium import webdriver
log = Log()
screenImg = "D:/checkcode.png"
i = 0

class Login(ParametrizedTestCase):
def test_login_search(self):
self.param1.get(self.param2)
self.param1.maximize_window()
try:
self.param1.find_element_by_name('phoneNumber').send_keys(self.param3)
log.info("输入用户账号:%s" % self.param3)
self.param1.find_element_by_name('password').send_keys('a123456')
log.info("输入用户密码:a123456")
for i in range(100):
self.param1.save_screenshot(screenImg) # 截取当前网页,该网页有我们需要的验证码
location = self.param1.find_element_by_xpath("//img[@class='check-code']").location
size = self.param1.find_element_by_xpath("//img[@class='check-code']").size
left = location['x']
top = location['y']
right = location['x'] + size['width']
bottom = location['y'] + size['height']
img = Image.open(screenImg).crop((left, top, right, bottom))
img = img.convert('L') # 转换模式:L | RGB
img = ImageEnhance.Contrast(img) # 增强对比度
img = img.enhance(2.0) # 增加饱和度
img.save(screenImg)
# 读取截图
img = Image.open(screenImg)
# 获取验证码
code = pytesseract.image_to_string(img)
# 打印验证码
print(list(code))
# 清空验证码输入框
self.param1.find_element_by_name('checkCode').clear()
# 输入验证码
self.param1.find_element_by_name('checkCode').send_keys(code)
# 提交登录
self.param1.find_element_by_class_name("login").click()
# time.sleep(2)
# if循环,当生成的code列表有4个元素时,跳出循环,否则刷新验证码,循环操作
if len(list(code)) == 4:
log.info("登陆成功")
break
else:
self.param1.find_element_by_xpath("//img[@class='check-code']").click()
time.sleep(1)
log.warning("登陆失败")
except Exception as err:
log.info("执行失败")

这是一个简单识别验证码登录的用例,对每一步进行日志打印,以方便后面定位问题

对一个简单的UI自动化框架的认知,大神可以指导一波
萌新入门,不喜勿喷,哈哈哈

UI自动化框架搭建之Python3的更多相关文章

  1. UI自动化框架搭建

    1.目录结构 大概分为以下几个文件 common :主要是用来放一些封装的公共函数 outputs :主要是输出一些文件,失败截图.用例执行完的测试报告 pagelocate :主要是元素的定位 pa ...

  2. 基于Python3.7 Robot Framework自动化框架搭建

    一.Robot Framework 和 Selenium 的区别(面试常问) 主流自动化测试框架有Robot Framework 和 Selenium,请根据实际场景选用不同的框架,以下总结各自优缺点 ...

  3. 基于python的App UI自动化环境搭建

    Android端Ui 自动化环境搭建 一,安装JDK.SDK 二,添加环境变量 Widows:1.系统变量→新建 JAVA_HOME 变量E:\Java\jdk1.7.0 jdk安装目录 2.系统变量 ...

  4. ui自动化笔记 selenium_webdriver,ui自动化框架(web)

    Selenium学习笔记 selenium webdriver是业界公认ui自动化测试的标准,其封装的api可以对浏览器的任何地方进行操作 selenium2.0和selenium3.0的区别? 3. ...

  5. Jmeter+ant+Jenkins接口自动化框架搭建

    摘自:https://testerhome.com/topics/13389 一.背景  上一篇讲了Jmeter 接口自动化-脚本数据分离实例,我们知道怎么利用Jmeter去编写接口自动化脚本,但是接 ...

  6. 基于PO和单例设计模式用python+selenium进行ui自动化框架设计

    一)框架目录的结构 二)config包当中的config.ini文件主要是用来存项目的绝对路径,是为了后续跑用例和生成测试报告做准备然后目前的配置文件大都会用yaml,ini,excel,还有.py也 ...

  7. 多测师讲解ui自动化框架设计思想_高级讲师肖sir

    UI自动化框架:UI自动化框架可以分为8个模块,conf.data.public.pageobject.testcase.runner.report.log.conf是用来储存系统环境.数据库.邮件的 ...

  8. Web自动化框架搭建——前言

    1.web测试功能特性 a.功能逻辑测试(功能测试),这一块所有系统都是一致的,比如数据的添加.删除.修改:功能测试案例设计感兴趣和有时间的话可以另外专题探讨: b.浏览器兼容性测试,更重要的是体验这 ...

  9. 基于python2+selenium3+pytest4的UI自动化框架

    环境:Python2.7.10, selenium3.141.0, pytest4.6.6, pytest-html1.22.0, Windows-7-6.1.7601-SP1 特点:- 二次封装了s ...

随机推荐

  1. 怎样生成分布式的流水ID

    流水编号 日常在我们开发的过程中可能会用到编号的功能,如销售订单号,采购订单号,日志编号,凭证号...等等,为了保证唯一有些表的主键要么用自增长,要么用GUID值,或通过雪花ID算法生成.这此方式基本 ...

  2. 【freertos】010-消息队列概念及其实现细节

    目录 前言 10.1 消息队列概念 10.2 消息队列的数据传输机制 10.3 消息队列的阻塞访问机制 10.4 消息队列使用场景 10.5 消息队列控制块 10.5.1 队列控制块源码 10.5.2 ...

  3. vivo 容器集群监控系统架构与实践

    vivo 互联网服务器团队-YuanPeng 一.概述 从容器技术的推广以及 Kubernetes成为容器调度管理领域的事实标准开始,云原生的理念和技术架构体系逐渐在生产环境中得到了越来越广泛的应用实 ...

  4. 关于vue cli 使用iview 自定义主题遇到的坑

    定制主题,这里讲变量覆盖 当你老老实实的把上面文档中的代码一一复制粘贴到项目文件中时,发现了还没装less,所以你就 npm install less –savenpm install less-lo ...

  5. 使用阿里云RDS for SQL Server性能洞察优化数据库负载-初识性能洞察

    简介 数据库性能调优通常需要较高数据库水平,并伴随较多的前期准备工作,比如收集各种性能基线.不同种类的性能指标.慢SQL日志等,这通常费时费力且效果一般,当面对多个数据库时总体拥有成本会大幅增加.今天 ...

  6. WPF开发随笔收录-DataAnnotations实现数据校验(MVVM架构下)

    一.前言 在自己的项目中挺多地方需要涉及到数据验证的,初期的实现方式都是通过点击确定后再逐个验证数据是否符合要求,但这种方式会让后台代码变得很多很乱.于是就开始在网上需求好的解决方式,刚好看到了一个大 ...

  7. Linux YUM yum 命令详解

    Yum命令 常用yum命令列表 command is one of: * install package1 [package2] [...] * update [package1] [package2 ...

  8. 如果一个promise永不resolve,会内存泄漏吗

    答:跟内存泄漏没有直接关系gc的策略不会改变,如果该promise没有被人引用,就会被gc掉.如果仍被引用,就不会被gc掉.即使一个promise,resolve或者reject了,但是它还被人引用, ...

  9. Eclipse拷贝动态的web工程

    1.选中需要拷贝的工程,CTRL+C,然后CTRL+V 2.在web动态工程中,还需要选中新拷贝工程,右键选中properties,然后搜索web,--->Web Project Setttin ...

  10. Java面向对象(下)作业

    首先我把题目先列到这里,可以仔细看一下题. (1)设计一个名为Geometric的几何图形的抽象类,该类包括: ①两个名为color.filled属性分别表示图形颜色和是否填充. ②一个无参的构造方法 ...