在 Cypress 中测试站点地图链接时出现拒绝服务(状态代码 429)

2023-11-30

我一直在测试一个大型站点地图,与这个问题相同here.

在某种程度上,答案效果很好,然后开始收到状态代码 429,这是因为该网站认为我正在进行拒绝服务攻击。

如何克服这个问题?

cy.request('sitemap.xml')
  .then(response => {
    return Cypress.$(response.body).find('loc')
      .toArray().map(el => el.innerText)
  })
  .then(urls => {
    urls.forEach(url => {
      cy.request({url, failOnStatusCode: false})
        .then(response => results.push({url, status: response.status}))
      })
    })
  })

要限制请求的速率,只需添加cy.wait()在循环。

等待时间取决于最大请求率,例如 StackOverflow 的限制为每秒 30 个请求,因此我将等待 50 毫秒。

您还可以对代码进行其他一些优化

  • use HEAD方法而不是GET

  • apply {log:false}命令的选项,因为 Cypress 日志记录涉及更新运行器 UI(改为 console.log)

  • 只存储错误的网址,减少内存占用

const results = [];

cy.request('sitemap.xml')
  .its('body')
  .then(xml => {
    return [...Cypress.$(xml).find('loc')].map(el => el.innerText)
  })
  .then(urls => {
    urls.forEach(url => {
      cy.request({
        method:'HEAD', 
        url, 
        failOnStatusCode:false, 
        log:false                                           
      })  
      .then(response => {
        console.log(url)                                       // progress
        if (response.status !== 200) {
          results.push({url, status: response.status}))        // fails only
        }
      })
      cy.wait(50,{log:false})                                  // throttle
    })
  })

cy.then(() => {
  cy.log('Bad URLs', results)
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Cypress 中测试站点地图链接时出现拒绝服务(状态代码 429) 的相关文章

随机推荐