【问题标题】:Postman: How do you delete cookies in the pre-request script?Postman:如何删除预请求脚本中的cookies?
【发布时间】:2017-11-23 09:44:05
【问题描述】:

我看到的所有邮递员 cookie 管理答案都是指浏览器扩展(打开 chrome、删除 cookie 即拦截器等)或使用应用程序,使用 UI 手动管理 cookie。

作为编写 API 测试脚本的一部分,我想删除我的预请求代码中的某些 cookie。 (以编程方式删除它们)

Sandobx API 文档提到了pm.cookies,所以我尝试了

if (pm.cookies !== null) {
   console.log("cookies!");
   console.log(pm.cookies);
}

但是pm.cookies 数组是空的。然而在控制台中,GET 调用会传递一个 cookie。

还有postman.getResponseCookies,它是空的(我假设是因为我们在预请求部分,而不是在测试部分)

One answer 建议调用 postman-echo 服务删除 cookie。我还没有调查过,但感觉不对。

【问题讨论】:

  • (这是邮递员应用程序特有的,不是扩展程序,如果我不清楚,请见谅)
  • 如果您的 API 具有可用于 cookie 的删除功能(如 postman-echo 具有),您可以构建一个请求来删除它们并链接您要执行的请求(通过 setNextRequest() )。
  • 关于 postman echo 的答案是死路一条,cookie 是链接到域的,所以你的 cookie 会链接到你的,而不是 postman-echo,然后不会被删除。太糟糕了,它实际上从 cookie 管理器中删除了 cookie。
  • 您可以在这里查看stackoverflow.com/questions/1085756/…,但如果您的 cookie 设置为 http_only,您将无法访问(和删除)它。就我而言,它是 http_only (sob)。否则,您可以更改其日期(在 javascript 中访问它)并将其设置为昨天甚至 -1 我认为可以工作...

标签: cookies session-cookies postman


【解决方案1】:

根据文档pm API referencepm.cookie API 仅适用于测试选项卡,不适用于预请求脚本。

以下项目仅在测试脚本中可用。

pm.cookies

...

看来你必须坚持这个方法:Interceptor Blog post

【讨论】:

  • 但是 Interceptor 仅限于 Chrome 插件,它很快就会被淘汰,不是吗?
  • getpostman.com/docs/v6/postman/scripts/… 表示 pm.cookies 现在可用于本机应用程序,但我也看到与 cookie 对象为空的操作相同的行为
  • 截至 2020 年的这个日期,Postman 确实允许在预请求脚本中使用 pm.cookies.jar(),所以 @aaron 的回答现在似乎更合适了。
【解决方案2】:

新版本现在支持自 2019/08 年起,请在此处查看更多示例:Delete cookies programmatically · Issue #3312 · postmanlabs/postman-app-support

先决条件

要被授予编程访问权限的 Cookie 域必须是 whitelisted

清除所有 cookie

const jar = pm.cookies.jar();

jar.clear(pm.request.url, function (error) {
  // error - <Error>
});

获取所有 cookie

const jar = pm.cookies.jar();

jar.getAll('http://example.com', function (error, cookies) {
  // error - <Error>
  // cookies - <PostmanCookieList>
  // PostmanCookieList: https://www.postmanlabs.com/postman-collection/CookieList.html
});

获取特定的cookie

const jar = pm.cookies.jar();

jar.get('http://example.com', 'token', function (error, value) {
  // error - <Error>
  // value - <String>
});

【讨论】:

  • 谢谢!我注意到有必要将域列入白名单才能访问 cookie:learning.postman.com/docs/postman/sending-api-requests/cookies/…
  • 值得注意的是,本例中传递给jar.geturl必须包含请求路径,如果有的话。不过,它不需要包含任何查询字符串。例如。 "example.com/subexample" 注意这里显示的 URL 包括 "https://",但它没有被显示。获取 cookie 时需要包含协议。
  • jar.clear(pm.request.url... 对我不起作用。 1)注意它是一个对象。我不确定jar.clear() 是否支持。 2) 我已经设置了构建我的请求 URL 的环境变量。如您所见,在我访问它们时(在我的脚本之前)它们没有被解析:{"path":["{{endpoint.token}}"],"host":["{{base-path}}"],"query":[],"variable":[]} - 请注意对象属性中的变量名称,例如。 "{{base-path"}}。我最终通过pm.environment.get('host') 获得了我的根域变量的值,这对于清除{{host}} 的所有cookie 非常有用。
【解决方案3】:

我知道这是一个很晚的答案,但对于我不想使用 cookie 开始执行集合的情况,我只需要取消选中“集合运行后保存 cookie”选项和选中 Runner 面板上的“运行集合而不使用存储的 cookie”选项。

然后,如果我想自己管理 cookie,我在集合上创建了第一个请求,并使用“测试”选项卡来收集我想要的 cookie 并将它们保存在一个变量中。

pm.environment.set('cookie', pm.cookies.get('csrftoken'))
pm.environment.set('sessionid', pm.cookies.get('sessionid'))

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2018-11-15
    • 2020-02-29
    • 2018-02-28
    • 2020-08-23
    • 2021-05-11
    • 2015-05-13
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多