Cypress测试拦截请求异常:目标请求被后续请求覆盖问题
解决方法:精准捕获第二个请求
当页面触发多个同URL、同方法的请求时,默认的cy.wait("@apiRequest")只会捕获第一个匹配请求。要获取第二个请求,可以通过以下两种方式实现:
方法1:多次调用cy.wait()
连续调用cy.wait("@apiRequest"),第一次跳过第一个请求,第二次即可捕获目标请求:
it("Deve interceptar a requisição e verificar se ela é válida quando clicar no select do gráfico Percentual de municípios por faixa de matrículas em tempo integral e inse", () => { cy.wait(1000); cy.intercept({ method: "GET", url: `${apiUrl}/api/distribuicao-municipio-faixa-matricula/?ano=2022`, }).as("apiRequest"); cy.get('[data-testid="selectPrincipalGraficos"]').click(); cy.get("ul.p-dropdown-items") .should("be.visible") .contains( "Percentual de municípios por faixa de matrículas em tempo integral e inse" ) .should("be.visible") .click(); // 跳过第一个请求 cy.wait("@apiRequest"); // 捕获第二个请求并验证 cy.wait("@apiRequest").then((interception) => { if (interception.response) { expect(interception.response.statusCode).to.eq(200); } }); });
方法2:用计数器标记目标请求
通过拦截器内的计数器,仅为第二个请求设置别名,直接等待目标请求:
it("Deve interceptar a requisição e verificar se ela é válida quando clicar no select do gráfico Percentual de municípios por faixa de matrículas em tempo integral e inse", () => { cy.wait(1000); let requestCount = 0; cy.intercept({ method: "GET", url: `${apiUrl}/api/distribuicao-municipio-faixa-matricula/?ano=2022`, }, (req) => { requestCount++; // 仅为第二个请求设置别名 if (requestCount === 2) { req.alias = "secondApiRequest"; } req.continue(); }); cy.get('[data-testid="selectPrincipalGraficos"]').click(); cy.get("ul.p-dropdown-items") .should("be.visible") .contains( "Percentual de municípios por faixa de matrículas em tempo integral e inse" ) .should("be.visible") .click(); // 等待标记的第二个请求 cy.wait("@secondApiRequest").then((interception) => { if (interception.response) { expect(interception.response.statusCode).to.eq(200); } }); });
额外建议
尽量替换cy.wait(1000)这类固定延迟,改用基于元素加载或初始请求完成的等待逻辑,能大幅提升测试稳定性。
内容的提问来源于stack exchange,提问作者Mikael C. Barros
相关产品推荐
相关产品推荐

