邮递员 - 无法在集合级预请求脚本中运行 pm.sendRequest()

Posted

技术标签:

【中文标题】邮递员 - 无法在集合级预请求脚本中运行 pm.sendRequest()【英文标题】:Postman - Cant run pm.sendRequest() in collection level pre-request script 【发布时间】:2020-09-27 14:46:29 【问题描述】:

我在构建 travis 后使用 newman 运行 api 测试。

我试图限制预请求脚本的重复,因此查看了一些关于如何在集合级别拥有预请求脚本的解决方法。

我的问题是我不想在每个请求上运行它们,只在我需要它们的地方运行它们。

示例:我尝试运行登录脚本以在私有端点上使用返回的令牌。

我的代码如下:

集合级预请求脚本定义:

    Object.prototype.login = function() 
        const request = 
            url: 'somthing',
            method: 'GET',
            header: 'Content-Type:application/json',
            body: 
              mode: 'application/json',
              raw: JSON.stringify(
                
                  email: pm.environment.get('someenv'),
                  password: pm.environment.get('someenv')
                )
            
        ;

        pm.sendRequest(request, function (err, res) 
            var response = res.json();
            pm.environment.set("token", response.token);
        );
    

请求级预请求脚本定义:

    _.login();

有人可以帮我解决为什么我不能在这个范围内运行 pm.sendRequest 吗?

pm.environment.get('someenv') 就像一个魅力,所以我不知道在这里做什么。

在不使用 Object 的情况下从 Collection 级别的预请求脚本调用时它运行良好,但如果我只是将整个请求放在那里,它将在我想首先避免的每个请求之前运行。

我尝试使用 console.log() 记录一些内容,但 pm.sendRequest() 中的回调似乎永远不会运行。

【问题讨论】:

【参考方案1】:

所以我找到了解决这个问题的方法,我希望它会在未来帮助别人:)

因此很容易设置在每个请求之前运行的集合级别预请求。

但是要稍微优化一下,因为您不需要为集合中的每个请求运行每个脚本。你可以在这里使用我的解决方案。 :)

我认为问题是由以下原因引起的:

在不同范围内使用的PM对象不会影响全局范围内的PM对象,所以首先你应该将全局PM对象作为参数传递给函数调用。

集合级请求应如下所示:

login = function (pm) 
    const request = 
        url: pm.environment.get('base_url') + '/login',
        method: 'POST',
        header: 
            'Content-Type': 'application/json',
        ,
        body: 
            mode: 'application/json',
            raw: JSON.stringify(
                email: pm.environment.get('email'),
                password:pm.environment.get('passwd')
            )
        
    ;

    pm.sendRequest(request, (err, res) => 
        var response = res.json();
        pm.expect(err).to.be.a('null');
        pm.expect(response).to.have.property('token')
            .and.to.not.be.empty;
        pm.globals.set("token", response.token);
    );
;

对于您要首先调用 auth 并使用令牌进行请求调用的确切请求:

login(pm);

【讨论】:

以上是关于邮递员 - 无法在集合级预请求脚本中运行 pm.sendRequest()的主要内容,如果未能解决你的问题,请参考以下文章

邮递员“评估预请求脚本时出错”,但预请求脚本为空

如何在前置脚本请求中为邮递员请求添加请求参数

集合监视器无法识别请求之间的 setTimeout(邮递员)

如何在预请求脚本中更改 Postman 环境?

如何从邮递员的集合中运行任何特定请求?

使用邮递员集合中的纽曼脚本在某处输出 responseBody