使用Cypress批量检查1000个员工状态遇弹窗失败,求多标签页方案
解决Cypress批量检查员工状态的弹窗问题与多标签页实现方案
问题分析
当前代码的核心问题:
- 短时间内连续提交1000次请求,触发了目标网站的反爬机制(如频率限制、验证弹窗),导致再次运行失败
- 每次提交后未返回初始页面,后续操作易基于错误的页面上下文执行
可行解决方案
方案一:直接发送HTTP请求(高效规避前端反爬)
目标网站的查询接口支持直接通过GET请求调用,无需模拟页面交互。这种方式跳过前端渲染流程,速度更快,也不容易触发反爬限制。
it('批量检查员工状态(HTTP请求方式)', function () { // 生成1000个员工编号 const receiptNumbers = Array.from({length:1000}, (_, k) => `IOE1234567${k+1}`); cy.wrap(receiptNumbers).each((receiptNum) => { // 加入随机延迟,避免请求过于集中 cy.wait(Cypress._.random(500, 2000)); cy.request({ method: 'GET', url: 'https://egov.uscis.gov/casestatus/mycasestatus.do', qs: { appReceiptNum: receiptNum } }).then((response) => { // 从响应HTML中提取状态信息 const statusText = Cypress.$(response.body).find('.rows.text-center h1').text().trim(); cy.log(`${receiptNum}: ${statusText}`); // 可按需添加断言,比如校验状态非空 // expect(statusText).to.not.be.empty; }); }); });
方案二:多标签页模拟真实操作
如果必须模拟浏览器标签页的交互流程,可通过window.open构造新标签页,切换后完成状态查询,再返回初始页面。
it('批量检查员工状态(多标签页方式)', function () { cy.visit('https://egov.uscis.gov/casestatus/landing.do'); const receiptNumbers = Array.from({length:1000}, (_, k) => `IOE1234567${k+1}`); cy.wrap(receiptNumbers).each((receiptNum) => { // 延长随机延迟,降低反爬触发概率 cy.wait(Cypress._.random(1000, 3000)); // 构造查询URL并打开新标签页 cy.window().then((win) => { const queryUrl = `https://egov.uscis.gov/casestatus/mycasestatus.do?appReceiptNum=${receiptNum}`; // 切换到新标签页并访问查询地址 cy.visit(queryUrl, { log: false }); // 获取并记录状态信息 cy.get('.rows.text-center h1').then(($el) => { const statusText = $el.text().trim(); cy.log(`${receiptNum}: ${statusText}`); }); // 返回初始页面,准备下一次查询 cy.visit('https://egov.uscis.gov/casestatus/landing.do', { log: false }); }); }); });
额外注意事项
- 反爬规避:必须保留随机延迟,避免固定间隔的请求模式;若遇到验证码拦截,需集成验证码识别工具(如2Captcha),但会增加实现复杂度
- 性能优化:HTTP请求方式的效率远高于页面交互,建议优先采用;多标签页模式需控制请求节奏,避免浏览器因资源过载崩溃
- 错误处理:可在代码中添加
try/catch块,处理单个请求失败的情况,防止测试因单次异常终止
内容的提问来源于stack exchange,提问作者Hema Nandagopal
相关产品推荐
相关产品推荐

