Cypress实现测试结束时才报错:站点地图URL批量校验
批量检测站点地图URL失效链接并统一报告失败
用例
每次代码发布后,自动测试网站所有站点地图URL(超1000个),检查是否存在失效链接。
问题
当前测试中,即使URL返回非200状态码,测试仍会无错误完成。需要收集所有请求结果,在两次cy.request()执行完成后统一检查结果,仅在测试结束时标记失败,确保找出所有失效链接且不中途停止测试。
现有代码
describe('Validate sitemaps files', () => { let urls = [] let results = [] const failed = [] before(function () { cy.fixture('sitemaps.json').then((data) => { for (var index in data) { cy.log(data[index].url) cy.request({ url: Cypress.config().baseUrl + data[index].url, failOnStatusCode: false, headers: { "Content-Type": "text/xml; charset=utf-8", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", }, }).as("parentSitemapPath").then((responseParent) => { urls = Cypress.$(responseParent.body) .find("loc") .toArray() .map((el) => el.innerText) cy.log(JSON.stringify(responseParent.status)) if (response.status !== 200) { ???? } }) } }) }) it("Should succesfully load each url in the sitemap", () => { urls.forEach((url) => { cy.request({ method: 'HEAD', url: url, failOnStatusCode: false, }).as("childSitemapPath").then(response => { if (response.status !== 200) { ???? } }) }) }) })
已尝试但未解决的方案
- 查找过Cypress失败后继续执行测试的相关方案
- 查找过测试站点地图链接时遇到429限流状态码的解决方案
解决方案
1. 修复父级站点地图请求的错误收集
首先修正代码中的变量名错误,改用cy.wrap().each()遍历确保异步请求顺序执行,同时收集父级站点地图的失效链接:
before(function () { cy.fixture('sitemaps.json').then((data) => { cy.wrap(data).each((item) => { cy.log(item.url) const fullUrl = Cypress.config().baseUrl + item.url cy.request({ url: fullUrl, failOnStatusCode: false, headers: { "Content-Type": "text/xml; charset=utf-8", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", }, }).then((responseParent) => { // 收集父级站点地图的失效链接 if (responseParent.status !== 200) { failed.push({ url: fullUrl, status: responseParent.status, type: '父级站点地图' }) } // 提取子URL并合并(避免覆盖原有urls数组) const childUrls = Cypress.$(responseParent.body) .find("loc") .toArray() .map((el) => el.innerText) urls = [...urls, ...childUrls] }) }) }) })
2. 收集子URL失效链接并统一断言
在测试用例中同样用cy.wrap().each()遍历URL,收集所有失效链接后统一验证,最后标记测试失败:
it("Should successfully load each url in the sitemap", () => { cy.wrap(urls).each((url) => { cy.request({ method: 'HEAD', url: url, failOnStatusCode: false, }).then(response => { if (response.status !== 200) { failed.push({ url: url, status: response.status, type: '站点地图子链接' }) } }) }).then(() => { // 所有请求完成后统一检查结果 if (failed.length > 0) { // 打印所有失效链接详情到日志 cy.log('发现失效链接:') failed.forEach(item => { cy.log(`${item.type} - ${item.url}:状态码${item.status}`) }) // 抛出错误标记测试失败 throw new Error(`共发现${failed.length}个失效链接,详情见日志`) } }) })
3. 额外优化:解决429限流问题
如果遇到429状态码,可通过以下方式优化:
- 在
cy.request后添加cy.wait(100)(根据实际情况调整延迟时长) - 在
cypress.config.js中配置请求拦截器,自动重试429请求
内容的提问来源于stack exchange,提问作者user3095223
相关产品推荐
相关产品推荐

