#!/usr/bin/env python
# -*- coding:utf-8 -*-
# *************************************
# @Time : 2019/7/1
# @Author : Zhang Fan
# @Desc : RobotFramework Library
# @File : MyKeyworks.py
# @Update : 2019/8/23
# *************************************
from robot.api import logger
import configparser
import jsonpointer
import jsonpatch
import datetime
import chardet
import random
import string
import json
import time class MyKeyword(object):
"""
===================================================================
===================== MyKeyword ======================
===================================================================
"""
@staticmethod
def detect_code(self, byte_string):
"""检测字节串编码. 参数:
byte_string:字节串 示例:
| Detect Code | ${byte_string} | #返回字节串编码,比如'utf-8' |
"""
return chardet.detect(byte_string)['encoding'] def get_config_value(self, cfg_path, section, name):
"""获取配置文件中指定节点下的指定选项值. 参数:
cfg_path:配置文件路径
section:节点名
name:选项名 示例:
| Get Config Value | ${CURDIR}\\config.ini | service_info | address |
"""
cfg = configparser.ConfigParser()
cfg.read(cfg_path)
return cfg.get(section, name) """
===============================================================
===================== Json Handle ====================
===============================================================
"""
def parse_json(self, json_string):
"""
解析JSON文档并返回数据结构. 参数:
json_string:JSON文档 示例:
| ${result}= | Parse Json | [1, 2, 3] |
| Length Should Be | ${result} | 3 |
"""
try:
return json.loads(json_string)
except ValueError as e:
raise ValueError("Could not parse '%s' as JSON: %s" % (json_string, e)) def stringify_json(self, data):
"""
将数据结构转换为包含其JSON字符串表示形式的字符串. 参数:
data:数据结构 示例:
| ${data} = | Create List | 1 2 3 |
| ${json_string}= | Stringify JSON | ${data} |
| Should Be Equal As Strings | ${json_string} | ["1", "2", "3"] |
"""
try:
return json.dumps(data, ensure_ascii=False)
except ValueError as e:
raise ValueError("Could not stringify '%r' to JSON: %s" % (data, e)) def get_json_value(self, json_string, json_pointer):
"""
获取JSON中指定目标节点值. 参数:
json_string:JSON文档
json_pointer:JSON节点 示例:
| ${result}= | Get Json Value | {"foo": {"bar": [1,2,3]}} | /foo/bar |
| Should Be Equal | ${result} | [1, 2, 3] | |
"""
try:
json_string = json.loads(str(json_string))
except:
json_string = eval(str(json_string))
return jsonpointer.resolve_pointer(json_string, json_pointer) def set_json_value(self, json_string, json_pointer, json_value):
"""
设置JSON中指定目标节点值. 参数:
json_string:JSON文档
json_pointer:JSON节点
json_value:JSON值 示例:
| ${result}= | Set Json Value | {"foo": {"bar": [1,2,3]}} | /foo | 12 |
| Should Be Equal | ${result} | {"foo": 12} | | |
"""
try:
json_string = json.loads(str(json_string))
except:
json_string = eval(str(json_string))
json_new = jsonpatch.apply_patch(json_string, [{'op': 'add', 'path': json_pointer,
'value': self.parse_json(json_value)}])
return self.stringify_json(json_new) """
===================================================================
==================== DateTime Handle =====================
===================================================================
"""
def calc_time_diff(self, date1, date2=None, format_=''):
"""计算与当前的时间差,返回秒数. 参数:
date: 日期字符串(支持多种日期格式,以及时间戳)
format_: 日期格式,默认为空 示例:
| Calc Time Diff | Jul 30, 2019 10:24:36 AM |
| Calc Time Diff | 2019-07-30T10:24:36Z |
| Calc Time Diff | 2019-07-30 10:24:36.000 |
| Calc Time Diff | 2019-07-30 10:24:36 |
| Calc Time Diff | 20190730102436 |
| Calc Time Diff | 1564453476000 |
"""
def format_date(date, format_=''):
if not format_:
if all(x in date for x in ['-', ' ', ':', '.']):
format_ = "%Y-%m-%d %H:%M:%S.%f"
elif all(x in date for x in ['-', 'T', ':', 'Z']):
format_ = "%Y-%m-%dT%H:%M:%SZ"
elif all(x in date for x in [' ', ',', ':']):
format_ = "%b %d, %Y %I:%M:%S %p"
elif all(x in date for x in ['-', ' ', ':']):
format_ = "%Y-%m-%d %H:%M:%S"
else:
format_ = "%Y%m%d%H%M%S"
try:
timestamp = time.mktime(time.strptime(date, format_))
return int(timestamp * 1000)
except ValueError as e:
raise ValueError(e) if not date2:
date2 = int(time.time() * 1000)
else:
date_string2 = str(date2).strip('b').strip('u').replace("'", '').replace('"', '')
date2 = format_date(date_string2, format_) date_string1 = str(date1).strip('b').strip('u').replace("'", '').replace('"', '')
if not date_string1:
return date_string1
if date_string1.isdigit() and len(date_string1) == 13:
return int(abs(date2 - int(date_string1))/1000)
date1 = format_date(date_string1, format_)
return int(abs(date2 - date1)/1000)

Python 接口自动化常用方法封装的更多相关文章

  1. Python接口自动化——soap协议传参的类型是ns0类型的要创建工厂方法纪要

    1:在Python接口自动化中,对于soap协议的xml的请求我们可以使用Suds Client来实现,其soap协议传参的类型基本上是有2种: 第一种是传参,不需要再创建啥, 第二种就是ns0类型的 ...

  2. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...

  3. python接口自动化-Cookie_绕过验证码登录

    前言 有些登录的接口会有验证码,例如:短信验证码,图形验证码等,这种登录的验证码参数可以从后台获取(或者最直接的可查数据库) 获取不到也没关系,可以通过添加Cookie的方式绕过验证码 前面在“pyt ...

  4. python接口自动化28-requests-html爬虫框架

    前言 requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html.之前解析html页面用过了lxml和bs4, requests-html集成了一些 ...

  5. python接口自动化-参数化

    原文地址https://www.cnblogs.com/yoyoketang/p/6891710.html python接口自动化 -参数关联(一)https://www.cnblogs.com/11 ...

  6. python接口自动化 -参数关联(一)

    原文地址https://www.cnblogs.com/yoyoketang/p/6886610.html 原文地址https://www.cnblogs.com/yoyoketang/ 原文地址ht ...

  7. python接口自动化20-requests获取响应时间(elapsed)与超时(timeout)

    前言 requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的. 如果服务端没及时响应,也不能一直等着,可以设置一个timeout超时的时间 关于reques ...

  8. python接口自动化24-有token的接口项目使用unittest框架设计

    获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...

  9. python接口自动化6-重定向(Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...

随机推荐

  1. webpack学习2.3webpack核心概念

    核心概念(四个) Entry(入口) Output(出口) Loaders()来处理其他类型的资源文件 Plugins(插件) 1.入口(Entry) 作用:代码的入口,打包的入口,单个或多个, 示例 ...

  2. Linux Bash之正则表达式

    首先注意:正则表达式与通配符是完全不同的概念.通配符(wildcard)代表的是 Bash 操作接口的一个功能,而正则表达式是一种字符串处理的表示方式,一定要区分开来. 正则表达式(Regular E ...

  3. 松软科技Web课堂:JavaScript For 循环

    循环可多次执行代码块. JavaScript 循环 假如您需要运行代码多次,且每次使用不同的值,那么循环(loop)相当方便使用. 通常我们会遇到使用数组的例子: 不需要这样写: text += ca ...

  4. 【译】ModSecurity事务生命周期

    本篇简要介绍ModSecurity Transaction Lifecycle,也即ModSecurity的事务生命周期. Transaction Lifecycle In ModSecurity, ...

  5. Dynamics 365 Portal 多语言

    Dynamics 365 Portal 的多语言分两种情况: 1.通过定义两套记录来实现,如Web Link Set.Snippet Content,都是定义两套记录,分别关联不同的语言来实现 Web ...

  6. 扫描枪连接zebra打印机打印条码标签无需电脑

    在一些流水线生产的现场,需要及时打印条码标签,由于现场环境和空间限制,无法摆放电脑或者通过连接电脑来打印条码标签的速度太慢, 瑞科条码特提供了一套扫描枪直接连接条码打印机,扫描枪扫描条码之后直接打印输 ...

  7. PMBOK 指南 第二章 项目运行环境

    2.1概述 事业环境因素(EEF)源于项目外部(往往企业外部) 组织过程资产(OPA)源于企业内部 2.2 事业环境因素 项目团队不能控制 2.2.1 组织内部的事业环境因素 组织文化.结构和治理 设 ...

  8. centos基本信息和ssh

    CentOs系统基本配置,包括修改主机名,创建用户并授权,ssh免密登录 1 永久修改主机名 sudo vim /etc/hostname 把原主机名xxx改为master(在从主机上则改为相应的sl ...

  9. MPV源码探究:背景及准备工作

    背景及准备工作 一点历史 古有魏蜀吴三分天下,今有 Mplayer.MPC.VLC 三分天下.这个世界观太庞大,忍不住先讲一点多媒体播放器的历史.实际上目前市面上的开源播放器主要基于三种技术栈: Mp ...

  10. 老版本nginx存在安全漏洞,不停服务热升级

    1.场景描述 安全部通知:nginx存在"整数溢出漏洞",经测试2017年4月21日之后的版本无问题,将openresty升级到最新版本,Nginx升级到1.13.2之后的版本. ...