You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cypress 页面完全加载前如何连续填充多个prompt输入值

错误根因

Cypress的cy.stub()基于Sinon实现,不允许重复包装同一个对象上的未还原方法,你多次调用cy.stub(win, 'prompt')相当于反复给同一个window.prompt加存根,所以直接抛出包装冲突的错误,且只有第一次创建的stub会生效,才会出现stub1被调用3次的情况。

解决方案

只需要创建1次prompt存根,通过Sinon存根本身的顺序返回能力适配多调用场景即可:

场景1:固定3个返回值

before(function() {
    cy.visit(base_url, {
        onBeforeLoad(win) {
            cy.stub(win, 'prompt')
                .returns('someString') // 第1次调用prompt返回值
                .returns('someOtherString') // 第2次调用prompt返回值
                .returns('anotherString') // 第3次调用prompt返回值
                .as('promptStub')
        }
    })
})

多次调用returns()时,Sinon会按调用顺序依次返回对应值,超过次数后默认返回最后一次设置的返回值。

场景2:动态从数组取值返回

如果需要从demo_site_info数组动态按顺序取返回值,用计数器控制即可,不要循环创建stub:

before(function() {
    cy.visit(base_url, {
        onBeforeLoad(win) {
            let callIndex = 0
            cy.stub(win, 'prompt').callsFake(() => {
                const currentVal = demo_site_info[callIndex]
                callIndex++
                return currentVal
            }).as('promptStub')
        }
    })
})

后续验证

页面加载完成后可以加断言验证stub调用符合预期:

cy.get('@promptStub').should('have.callCount', 3)

内容的提问来源于stack exchange,提问作者Citronex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:33:03