Fork me on GitHub

Postman入门第一坑:提取返回值

Postman是做接口测试的,但是很多接口并不是直接就能测,有的需要一些预处理。比如说身份认证,需要传递一个token。如果做网页测试,一般打开登陆界面的时候就会生成一个token,如果返回值是json格式,用Postman从中提取值是很简单的,在Tests中输入:

var jsonData =JSON.parse(responseBody);//获取body中返回的所有参数
pm.environment.set("appKey",jsonData.data.keys);//把返回参数中的keys设置为环境变量

postman-start-01.png

如果token在返回的header里,也很简单:

var value = postman.getResponseHeader("Access-Token");
pm.environment.set("Access-Token",value);

postman-start-02.png

如果token在返回值的body中,呵呵,网上并没有适合小白看的清晰的解决方法。我花了好长好长好长时间才找到这么两行小字:

//转换XML body为JSON对象
var jsonObject = xml2Json(responseBody);

那我的思路就有了:将html转换成json,再从json中提取token不就简单了。

依然还是老办法,拿出我的终极武器——redmine来测试。登陆页面的返回值大概是这样的,我们要提取的是csrf-token

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="utf-8" />
        <title>Redmine</title>
        <meta name="description" content="Redmine" />
        <meta name="keywords" content="issue,bug,tracker" />
        <meta name="csrf-param" content="authenticity_token" />
        <meta name="csrf-token" content="u9XfPXNDqQ/v+/xUtQuAjESgvNXCTHxCWW4NIZ/rJBmfZjzqJBVD1fDOxHnlbza4iDreX+St9SE9XFIN4on47Q==" />
        ...

一开始我觉得可能是这样取值:

pm.globals.set("token", jsonObject.html.head.meta[4].content);

为了调试方便,我们这里取全局(globals)变量,因为环境(environment)变量只有在测试执行过程中才存在,测试执行完就释放了。

send之后点右上角小眼睛,如果全局变量取到值的话这里会有显示的:

p-start-03.png

然而并没有,排查原因,把最后的content去掉试试(为了看的更清楚,把[4]也去掉):

var jsonObject = xml2Json(responseBody);
pm.globals.set("token", jsonObject.html.head.meta);

这时候取到全局变量了,不过[object Object],[object Object]...需要翻译啊,很明显取到meta这一层是没错的:

Postman-start-04.png

这时候需要一个将json转换成字符串的工具,方便我分析,然后就找到了JSON.stringify()

pm.globals.set("getstring", JSON.stringify(jsonObject.html.head.meta));

postman-start-05.png

将json复制出来美化一下:

postman-start-06.png

原来meta下一层是个$。事后才醒悟过来,namecontent并不是meta的下层,而是meta的属性,xml2Json()方法将属性转换成$标记的下层。

修改之后再次测试:

pm.globals.set("token", jsonObject.html.head.meta[4].$.content);

postman-start-07.png

完美解决。

总结

Postman从响应中提取值的方法:

  • 从json中提取

    var jsonData =JSON.parse(responseBody);
    
  • 从html的Header中提取

    var value = postman.getResponseHeader("Access-Token");
    pm.environment.set("Access-Token",value);
    
  • 从html的body中提取

    var jsonObject = xml2Json(responseBody);
    

将json object转换成字符串的函数JSON.stringify(jsonObject)

参考文章

Comments