cy.intercept() 用于带有查询参数的后端点

Mon*_*1ma 3 cypress

我的测试用例很不稳定,因为有时测试会在元素出现在屏幕上之前与元素进行交互,而不是静态等待,我决定在cy.intercept()与元素交互之前等待触发的请求。

我首先使用带有一些路径参数的 PUT 请求进行了尝试,效果很好,并且在 cypress runner 上我看到别名正确地代表了端点

 cy.intercept('PUT', `https://api.dev.myapp.com/api/program/v1/program/**`).as('saveProgram');
 cy.wait('@saveProgram');
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我对需要 URL 中的查询参数的后端点尝试了同样的操作,但它不起作用。在运行程序中,我看不到分配给端点的别名,如下面的屏幕截图所示。

 cy.intercept('POST', `https://api.dev.myapp.com/api/program/v1/program?clientId=*`)
                    .as('createProgram');
 cy.wait('@createProgram');
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

pav*_*man 11

匹配的方式有多种,即:

  • 文字字符串
  • 全局模式
  • 正则表达式模式
  • 路由匹配器对象

如果其中一个不起作用,我建议:

  1. 简化匹配模式,这将使其更加宽松,您可以稍后构建更具限制性的版本
  2. 尝试不同的匹配方法

按照这个顺序。

我还注意到你的例子cy.wait()直接在cy.intercept(). 最有可能的是,您需要在这些命令之间触发请求的操作。我不知道您是否只是为了这个问题而简化了代码,或者这是否真的是您的代码。如果是后者,则需要返工:

cy
  .intercept(...)
  .as('createProgram');

// your other code that triggers the request

cy
  .wait('@createProgram'); // wait for the response
Run Code Online (Sandbox Code Playgroud)

现在,让我们看看还有哪些其他选项可以编写该匹配模式:

cy
  .intercept('POST', /\/api\/program\/v1\/program\?clientId=\d+/)
  .as('createProgram');
Run Code Online (Sandbox Code Playgroud)

尽量避免使用完整的网址,它通常只会使您的代码变得混乱,并且在大多数情况下没有必要。

cy
  .intercept('POST', 'program?clientId=*')
  .as('createProgram');
Run Code Online (Sandbox Code Playgroud)

确实很宽松,但如果你做到了这一点,你可以稍后尝试更严格的匹配模式(如果你需要的话)。

cy
  .intercept({
    pathname: '/api/program/v1/program'
    query: {
      clientId: '36'
    }
  })
  .as('createProgram');
Run Code Online (Sandbox Code Playgroud)

其中任何一个匹配正确吗?

文档中有无数其他选项。