selenium + python 完整自动化测试脚本及讲解(三、utils包介绍)
补更,求关注!!!
简介
文件名 | 介绍 |
---|---|
DEPENDON_.py | 解决 unittest 每个case的依赖关系 |
HTML_REPORT.py | 生成HTML测试结果报告 |
OUTER_TOOLS.py | 封装一些重复调用的函数 |
PROPERTIES_TOOLS.py | 读取.properties文件信息 |
SENDKYES.py | 模拟键盘按钮 |
UPLOAD_FILE_TOOLS.py | 封装文件上传方法 |
DEPENDON_.py
import functools
import unittest
"""
目前仅解决一个Case依赖另一个 Case 的关系,后续更新后会特意发布一篇文章
"""
def dependon(depend=None): # 定义一个 装饰器 参数 被依赖的函数名称
def wraper_func(test_func): # 默认传参:被修饰的函数
@functools.wraps(test_func)
def inner_func(self): # 判断函数
if depend == test_func.__name__: # 判断依赖的函数,是否和自身是否是一个函数
raise ValueError("{} cannot depend on itself".format(depend))
failures = str([fail[0] for fail in self._outcome.result.failures]) # 获得所有断言失败的函数
errors = str([error[0] for error in self._outcome.result.errors]) # 获得所有发生错误的函数
skipped = str([error[0] for error in self._outcome.result.skipped]) # 获得所有已经跳过的函数
flag = (depend in failures) or (depend in errors) or (depend in skipped) # 判断依赖的函数是否在发生错误的函数中
test = unittest.skipIf(flag, 'Skip because def:{} is not running'.format(depend))(
test_func) # 交给unittest.skipIf函数处理
return test(self) # 返回 unittest.skipIf 处理结果
return inner_func # 返回 inner_func 处理结果
return wraper_func # 返回 wraper_func 处理结果
有点时间没看了,看着有点晕,但是保证代码是可用的。
OUTER_TOOLS.py
# -*- coding: utf-8 -*-
import os
from utils.OUTER_TOOLS import get_abspath
class Properties(object):
"""
读取配置文件信息,组成 key:value的形式保存在 properties dict变量中
"""
def __init__(self, FileName=None):
self.properties = {}
if FileName is None:
self.fileName = get_abspath() + "\config\init.properties"
else:
self.fileName = FileName
def __getDict(self, strName, dictName, value):
if strName.find('.') > 0:
k = strName.split('.')[0]
dictName.setdefault(k, {})
return self.__getDict(strName[len(k) + 1:], dictName[k], value)
else:
dictName[strName] = value
return
def getProperties(self):
try:
pro_file = open(self.fileName, 'r')
for line in pro_file.readlines():
line = line.strip().replace('\n', '')
if line.find("#") != -1:
line = line[0:line.find('#')]
if line.find('=') > 0:
strs = line.split('=')
strs[1] = line[len(strs[0]) + 1:]
self.__getDict(strs[0].strip(), self.properties, strs[1].strip())
except Exception:
raise
else:
pro_file.close()
return self.properties
# 将结果公开出来
dictProperties = Properties().getProperties()
# 为了防止调用时出错,获取数据时请使用这个函数
def getProperties(key):
if key not in dictProperties.keys():
return ""
return dictProperties[key]
可以说这个是整个项目的核心方法了,70% 的文件用到了这个类,所以修改可以,但是其他程序报错,我也没办了!
SENDKYES.py
-- coding: utf-8 --
import time
import win32api
import win32con
import pyperclip
def sendKeys_ON(Key, number=1, P1=0, P2=0, P3=0):
"""
模拟键盘按键
:param Key: 发送的按钮
:param number: 发送次数
:param P1:
:param P2:
:param P3:
:return:
从原型可以看出,Keybd_event()共有四个参数:
第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab(其他具体的参见附录:常用模拟键的键值对照表);
第二个参数为扫描码,一般不用设置,用0代替就行;
第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP";
第四个参数一般也是置0即可。
win32api.keybd_event(Key, P1, P2, P3)
字母和数字键 数字小键盘的键功能键 其它键
"""
for num in range(number):
win32api.keybd_event(Key, P1, P2, P3) # (回车)
win32api.keybd_event(Key, P1, win32con.KEYEVENTF_KEYUP, P3)
time.sleep(.5)
pass
附赠:键盘码表
键 | 键码 | 键 | 键码 | 键 | 键码 | 键 | 键码 | 键 | 键码 |
---|---|---|---|---|---|---|---|---|---|
0 | 48 | A | 65 | 0 | 96 | F1 | 112 | Backspace | 8 |
1 | 49 | B | 66 | 1 | 97 | F2 | 113 | Tab | 9 |
2 | 50 | C | 67 | 2 | 98 | F3 | 114 | Clear | 12 |
3 | 51 | D | 68 | 3 | 99 | F4 | 115 | Enter | 13 |
4 | 52 | E | 69 | 4 | 100 | F5 | 116 | Shift | 16 |
5 | 53 | F | 70 | 5 | 101 | F6 | 117 | Control | 17 |
6 | 54 | G | 71 | 6 | 102 | F7 | 118 | Alt | 18 |
7 | 55 | H | 72 | 7 | 103 | F8 | 119 | Caps Lock | 20 |
8 | 56 | I | 73 | 8 | 104 | F9 | 120 | Esc | 27 |
9 | 57 | J | 74 | 9 | 105 | F10 | 121 | Spacebar | 32 |
K | 75 | * | 106 | F11 | 122 | Page Up | 33 | ||
L | 76 | + | 107 | F12 | 123 | Page Down | 34 | ||
M | 77 | Enter}108 | – | – | End | 35 | |||
N | 78 | - | 09 | – | – | Home | 36 | ||
O | 79 | . | 10 | – | – | Left Arrow | 37 | ||
P | 80 | / | 11 | – | – | Up Arrow | 38 | ||
Q | 81– | – | – | – | Right Arrow | 39 | |||
R | 82– | – | – | – | Down Arrow | 40 | |||
S | 83– | – | – | – | Insert | 45 | |||
T | 84– | – | – | – | Delete | 46 | |||
U | 85– | – | – | – | Help | 47 | |||
V | 86– | – | – | – | Num Lock | 144 | |||
W | 87 | ||||||||
X | 88 | ||||||||
Y | 89 | ||||||||
Z | 90 |
UPLOAD_FILE_TOOLS.py
文件内容太多:另写一篇:https://blog.csdn.net/weixin_43664254/article/details/90437478
HTML_REPORT.py
文件内容太多:另写一篇:https://blog.csdn.net/weixin_43664254/article/details/90515098