是否可以将 URL 的一部分存储到变量中,或者以某种方式使用 cypress 并在以后使用它?

Posted

技术标签:

【中文标题】是否可以将 URL 的一部分存储到变量中,或者以某种方式使用 cypress 并在以后使用它?【英文标题】:Is it possible to store PART of the URL in to a variable or somehow using cypress and use it later? 【发布时间】:2022-01-22 07:52:57 【问题描述】:

我需要将我网站中的 url 存储到一个 URL 中,并将其中的一部分用于 API 调用

【问题讨论】:

您能否添加一个代码示例以及您的请求或 URL 的样子? 我没有代码示例,因为我刚刚开始编写测试,它将是 'cy.visit("URL")' 并且我必须将部分 URL 存储到以后用它 .......com/project/1f2c8ee3-9b7a-422d-8edd-b81a2bdf286d/ 我需要这部分 fa031c9f-13d9-4d50-bf52-fe4dbe221b1f 直到这里 /plan 我需要取最后两个“/”之间的字符串 嗨。据我了解,您需要存储 uuid。让我问你,为什么要从 URL 存储它?为什么你不拦截 GET 请求呢?在 URL 中有一个对象 ID,涉及一个获取请求。这在性能和可读性方面会好很多。 ...但是,如果您受到任何情况的限制来拦截请求,那么我建议使用最简单的 uuid 正则表达式从 URL 中提取它。 @AlexIzbas 你能帮我解决如何拦截它以获取 GET 请求......问题是我是使用 API 调用的超级菜鸟......有没有具体的方法来做到这一点? 【参考方案1】:

...来自 cmets,我在这里留下答案:

6.0.0 版本中,赛普拉斯引入了一个新命令:.intercept()

.intercept() 允许您管理网络请求的行为。它支持 fetch,它可以拦截你的应用 API 调用的请求和响应等等,官方文档here。

根据您的情况,请确保在正确的 fetch 操作之前声明您的拦截命令,比如说在测试的顶部。然后,只需在测试正文中通过其别名调用它:

cy.intercept('GET', '/project/*').as('myObject')

// ...


cy.wait('@myObject').its('response.body.data.id').then(objUUID => 
// here is your uuid
   cy.log(objUUID) 
)

请注意,与此 uuid 相关的任何其他操作都应在上述回调中完成:.then(objUUID => )。如果您需要在不同的测试之间共享它,则在 .beforeEach() 钩子中拦截您的请求并将 uuid 分配到上下文共享变量中,但是,这是一种不好的做法(有关别名和变量的更多信息,here)

【讨论】:

有道理,感谢您抽出宝贵时间提出如此详尽的问题。就我而言,uuid 是动态的,这意味着当我创建一个“新项目”时,它有一个不同的 url(我需要动态的 url 的确切部分)......我希望我很清楚 :) 我的意思是*回答不是问题!

以上是关于是否可以将 URL 的一部分存储到变量中,或者以某种方式使用 cypress 并在以后使用它?的主要内容,如果未能解决你的问题,请参考以下文章

如何在缓冲区中执行代码?

GAE 数据存储密钥是如何生成的?

PHP 以最快的方式判断字符串是否以某给定字符串开始

保存上传的文件

如何在Javascript变量中存储脚本url的结果

如何将访问特定URL的IP地址存储到文件中