首页 > 其他分享 >关键字 开发-08 extract提取返回的结果

关键字 开发-08 extract提取返回的结果

时间:2023-12-01 17:33:31浏览次数:40  
标签:return expression 08 value 关键字 提取 extract response

1. extract提取请求返回结果的返回值

在进行接口自动化的时候,往往需要提取上一个接口返回的值,传递给下一个接口使用。
创建utils/extract.py

import json
import re
import jsonpath
import jmespath
from utils import exceptions
from requests import Response


def extract_by_object(response: Response, extract_expression: str):
    """
    从response 对象属性取值 [status_code, url, ok, headers, cookies, text, json, encoding]
    :param response: Response Obj
    :param extract_expression:
    :return:
    """
    if not isinstance(extract_expression, str):
        return extract_expression
    res = {
        "headers": response.headers,
        "cookies": dict(response.cookies)
    }
    if extract_expression in ["status_code", "url", "ok", "encoding"]:
        return getattr(response, extract_expression)
    elif extract_expression.startswith('headers') or extract_expression.startswith('cookies'):
        return extract_by_jmespath(res, extract_expression)
    elif extract_expression.startswith('body') or extract_expression.startswith('content'):
        try:
            response_parse_dict = response.json()
            return extract_by_jmespath({'body': response_parse_dict}, extract_expression)
        except Exception as msg:
            raise exceptions.ExtractExpressionError(f'expression:<{extract_expression}>, error: {msg}')
    elif extract_expression.startswith('$.'):
        try:
            response_parse_dict = response.json()
            return extract_by_jsonpath(response_parse_dict, extract_expression)
        except Exception as msg:
            raise exceptions.ExtractExpressionError(f'expression:<{extract_expression}>, error: {msg}')
    elif '.+?' in extract_expression or '.*?' in extract_expression:
        # 正则匹配
        return extract_by_regex(response.text, extract_expression)
    else:
        # 其它非取值表达式,直接返回
        return extract_expression

def extract_by_jsonpath(extract_obj: dict, extract_expression: str):
    """
    jsonpath提取
    :param extract_obj: response.json()
    :param extract_expression: '$.code'
    :return: NONE or first value and all value
    """
    if not isinstance(extract_expression, str):
        return extract_expression
    extract_value = jsonpath.jsonpath(extract_obj, extract_expression)
    if not extract_value:
        return
    elif len(extract_value) == 1:
        return extract_value[0]
    else:
        return extract_value

def extract_by_jmespath(extract_obj: dict, extract_expression: str):
    """
    jmespath提取
    :param extract_obj: {"body": response.json(), "cookies": dict(response.cookies)}
    :param extract_expression: body.code
    :return: NONE or first value and all value
    """
    if not isinstance(extract_expression, str):
        return extract_expression
    try:
        extract_value = jmespath.search(extract_expression, extract_obj)
        return extract_value
    except Exception as msg:
        raise exceptions.ExtractExpressionError(f'expression:<{extract_expression}>, error: {msg}')

def extract_by_regex(extract_obj: str, extract_expression: str):
    """
    正则表达式提取返回结果
    :param extract_obj: must type str
    :param extract_expression:
    :return:
    """
    if not isinstance(extract_expression, str):
        return extract_expression
    extract_value = re.findall(extract_expression, extract_obj, flags=re.S)  # re.S:允许跨多行匹配
    if not extract_value:
        return ''
    elif len(extract_value) == 1:
        return extract_value[0]
    else:
        return extract_value

在用例函数中添加extract关键字提取到response返回的值:

from utils import extract
                    elif item == 'extract':
                        extract_result = {}
                        if isinstance(value, dict):
                            for extract_var, extract_expression in value.items():
                                log.info(f'提取的表达式:{extract_var}:{extract_expression}')
                                extract_var_value = extract.extract_by_object(response, extract_expression)
                                extract_result[extract_var] = extract_var_value  # 更新提取的结果,放入extract_result中
                        log.info(f'提取的结果:{extract_result}')

在.\data\test_login.yml文件中,添加extract关键字:因为我们支持三种提取方式,所以这里我写了三种,看看能不能都获取到response返回的值

config:
  name: yaml申明变量
  variables:
    username: "admin"
    password: "Admin@22"
    email1: ${email1}

test_login:
  name: 登录成功
  request:
    url: /api/v1/auth/login
    method: POST
    json:
      username: ${username}
      password: ${password}
  extract:
    code1: $.code  # 1. jsonpath方式提取code
    code2: body.code  # 2. jmespath方式提取
    token: $.data.token  
    msg: '"message":"(.*?)"'  # re正则的方式提取

终端运行:pytest .\data\test_login.yml,查看日志,可以看到成功的获取到我们的提取的参数。

标签:return,expression,08,value,关键字,提取,extract,response
From: https://www.cnblogs.com/dack-zt-deng/p/17870584.html

相关文章

  • 高速计数器使用笔记( AM521-0808TN )
         ......
  • instanceof关键字
    instanceof用于判断类型eg:catinstanceofAnimal判断该对象引用,是否是为该类型(自身类、自身类父类、Object)都是返回true,其他情况返回falseeg:strinstanceofString例子AnimalParent类publicclassAnimalParent{}Cat类publicclassCatextendsAnimalParent......
  • H50088:js动态生成html代码的三种形式
    1,//方案一O.TEMPLATE='<divclass="viewer-container">\<divclass="viewer-canvas"></div>\<divclass="viewer-footer">\<divclass="viewer-title&quo......
  • P1084 [NOIP2012 提高组] 疫情控制
    首先军队可以原地不动,时间越多越容易合法,先套上二分。在不回到根的情况下,军队深度肯定越小越好。所以军队能往上移就移,如果能回到根就暂时在根对应的儿子那里驻扎。这个过程用树上倍增优化。做完这一步后,我们找出需要军队驻扎的根的儿子(向下不经过军队就能到达叶子),现在就是要让......
  • P1081 [NOIP2012 提高组] 开车旅行
    题目有点长,一步一步来。预处理出每座城市两人分别会选择的下一座城市用set即可实现。倍增优化DP令\(f_{i,j}\)表示从城市\(j\)出发,行驶\(2^i\)天会到达的城市。令\(ga_{i,j}\)表示从城市\(j\)出发,行驶\(2^i\)天,小A行驶的路程。\(gb_{i,j}\)同理。答案枚......
  • SQL 关键字执行顺序
    1.FromandJOIN首先我们进行查询的时候,肯定是先获得一份数据集的,From语句和JOIN被先执行的,就是为了获得数据集的。2.WHERE一旦数据集给拿到了,WHERE限制条件会被用到某些行上,并把不满足的行给抛弃掉。并且,这能够用到各种数据类型中3.GROUPBYWHERE条件限定之后,接下来就是GRO......
  • C++ 11 关键字:thread_local
    thread_local是C++11新引入的一种存储类型,它会影响变量的存储周期。C++中有4种存储周期:automaticstaticdynamicthread有且只有thread_local关键字修饰的变量具有线程(thread)周期,这些变量在线程开始的时候被生成,在线程结束的时候被销毁,并且每一个线程都拥有一个独......
  • java基础学习:跳转关键字:break,continue
    1.总览:break:跳出并结束当前所在循环的执行continue:用于跳出当前循环的当次执行,直接进入循环的下一次执行 packagecom.itheima.BreakAndContinue;publicclassBreakAndContine1{publicstaticvoidmain(String[]args){for(inti=1;i<=5;i++){......
  • 快速解决Error: error:0308010C:digital envelope routines::unsupported的三种解决方
    问题描述:    报错:Error:error:0308010C:digitalenveloperoutines::unsupported报错原因:     因为node.jsV17版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的限制报错详细信息:解决方案: 方案1:打开IDEA终端,直接输入Linux&......
  • C#中out关键字
    简介在C#中可以使用out关键字,指定所给的参数是一个输出参数。out关键字的使用方式与ref关键字相同,都是在函数定义和函数调用中用作参数的修饰符。一个使用out关键字的例子internalclassProgram {    staticvoidMain(string[]args)   {    ......